Skip to content

Define Environment

Testbench utilized phpunit.xml configuration and TestCase methods and properties to setup environment variables values as global values for every test.

defineEnvironment() Method

If you need to add something early in the application bootstrapping process (which is executed between registering service providers and booting service providers) you could use the defineEnvironment() method:

php
use Illuminate\Contracts\Config\Repository; 

class TestCase extends \Orchestra\Testbench\TestCase
{
    /**
     * Define environment setup.
     *
     * @param  \Illuminate\Foundation\Application  $app
     * @return void
     */
    protected function defineEnvironment($app) 
    {
        // Setup default database to use sqlite :memory:
        tap($app['config'], function (Repository $config) { 
            $config->set('database.default', 'testbench'); 
            $config->set('database.connections.testbench', [ 
                'driver'   => 'sqlite', 
                'database' => ':memory:', 
                'prefix'   => '', 
            ]); 
            
            // Setup queue database connections.
            $config([ 
                'queue.batching.database' => 'testbench', 
                'queue.failed.database' => 'testbench', 
            ]); 
        });
    }
}
FALLBACK METHOD

You can still use predecessor method getEnvironmentSetup() for backward compatibility:

php
/**
 * Define environment setup.
 *
 * @param  \Illuminate\Foundation\Application  $app
 * @return void
 */
protected function getEnvironmentSetup($app) 
{
    //
}

Using Attribute

You can also use Orchestra\Testbench\Attributes\DefineEnvironment attribute to customize the use of defineEnvironment() for specific tests.

php
use Orchestra\Testbench\Attributes\DefineEnvironment; 
use PHPUnit\Framework\Attributes\Test;

class TestCase extends \Orchestra\Testbench\TestCase
{
    protected function usesMySqlConnection($app) 
    {
        $app['config']->set('database.default', 'mysql');
    }

    protected function usesSqliteConnection($app) 
    {
        $app['config']->set('database.default', 'sqlite');
    }

    #[Test]
    #[DefineEnvironment('usesMySqlConnection')] 
    public function it_can_be_connected_with_mysql()
    {
        // write your tests
    }

    #[Test]
    #[DefineEnvironment('usesSqliteConnection')] 
    public function it_can_be_connected_with_sqlite()
    {
        // write your tests
    }
}

Using Annotation

Deprecated

Annotation usage with PHPUnit has been mark as deprecated and will be removed in future versions.

You can also use @define-env annotation to customize the use of defineEnvironment() for specific tests.

php
class TestCase extends \Orchestra\Testbench\TestCase
{
    protected function usesMySqlConnection($app) 
    {
        $app['config']->set('database.default', 'mysql');
    }

    protected function usesSqliteConnection($app) 
    {
        $app['config']->set('database.default', 'sqlite');
    }

    /**
     * @test
     * @define-env usesMySqlConnection
     */
    public function it_can_be_connected_with_mysql()
    {
        // write your tests
    }

    /**
     * @test
     * @define-env usesSqliteConnection
     */
    public function it_can_be_connected_with_sqlite()
    {
        // write your tests
    }
}

Application Key

Most applications would require APP_KEY to be defined in order to use encryption:

xml
<phpunit>
    // ...
    <php>
        <env name="APP_KEY" value="AckfSECXIvnK5r28GVIWUAxmbBSjTsmF"/>
    </php>
</phpunit>

Application Timezone

You can also easily override the application's default timezone, instead of the default "UTC":

php
class TestCase extends \Orchestra\Testbench\TestCase
{
    /**
     * Get the application timezone.
     *
     * @param  \Illuminate\Foundation\Application  $app
     * @return string|null
     */
    protected function getApplicationTimezone($app) 
    {
        return 'Asia/Kuala_Lumpur';
    }
}

Using .env Environment Variables

By default, Testbench will load .env file when booting the application if the file exists. You can change to completely ignores .env file by setting TestCase::$loadEnvironmentVariables property to false:

php
class TestCase extends \Orchestra\Testbench\TestCase
{    
    /**
     * Automatically loads environment file if available.
     *
     * @var bool
     */
    protected $loadEnvironmentVariables = false; 

    // 
}