30

Laravel 5 では通常のことですが、データベース接続の詳細を含むファイルがあり.envます。テスト用にこれらをオーバーライドしたいのですが、これは で実行できますphpunit.xml.envただし、これを行うと、環境構成、特にパスワードをコミットしないという哲学に反するようです。

そのようなものを持って、それから読むよう.env.testingに言うことは可能ですか?phpunit.xml

4

10 に答える 10

21

にコピーして.envから.env.testing.env.testingファイルを編集し、APP_ENVパラメータを変更してAPP_ENV=testingこのようにします。この新しいファイルで設定を指定できます

.env.testing新しいファイルを作成したくない場合はphpunit.xml、必要な値を使用して php セクションで変数を指定する必要があります。次のようになります。

<php>
    <env name="APP_ENV" value="testing"/>
    <env name="CACHE_DRIVER" value="array"/>
    <env name="SESSION_DRIVER" value="array"/>
    <env name="QUEUE_DRIVER" value="sync"/>
    <env name="DB_CONNECTION" value="sqlite"/>
    <env name="DB_DATABASE" value="testing"/>
</php>

名前セクションでキー値を使用し、値セクションでそのキーの値を使用するだけです。

この例では、testing という名前の sqlite データベースを使用するように phpunit を指定しています。

ところで、config/database.php にこれを追加し 'default' => env('DB_CONNECTION', 'mysql'),て、この場合のように別のものを指定しない限り、デフォルトで mysql を使用します。

于 2015-07-28T21:12:43.107 に答える
5

'local_test_db' など、開発マシンにローカル データベースを作成します。

新しい .env.testing ファイルを作成します。

DB_DATABASE=local_test_db
DB_USERNAME=root

phpunit.xml ファイルに、少なくとも次の 1 つの環境変数があることを確認してください。

<php>
    <env name="APP_ENV" value="testing"/>
</php>

最後に、ベース テストケース (TestCase.php) で移行を実行して、データベースにテーブルを追加する必要があります。

public function createApplication()
{

    $app = require __DIR__.'/../bootstrap/app.php';

    $app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();

    return $app;
}


public function setUp()
{
    parent::setUp();
    Artisan::call('migrate');
}

public function tearDown()
{
    Artisan::call('migrate:reset');
    parent::tearDown();
}
于 2015-11-19T10:29:15.893 に答える
4

このリンクから

方法 1

ステップ 1: 以下のように、Database/Config.php に新しいテスト データベース接続を作成します。

return [
    ... 

    'default' => env('DB_CONNECTION', 'db'),    

    'connections' => [
        'sqlite_testing_db' => [
            'driver' => 'sqlite',
            'database' => storage_path().'/testing_database.sqlite',           
            'prefix' => '',
        ],

        /**************** OR ******************/

        'testing_db' => [
            'driver' => 'mysql',
            'host' => env('TEST_DB_HOST', 'localhost'),
            'database' => env('TEST_DB_DATABASE', 'forge'),
            'username' => env('TEST_DB_USERNAME', 'forge'),
            'password' => env('TEST_DB_PASSWORD', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
        ],

        /** Production or database DB **/
        'db' => [
            'driver' => 'mysql',
            'host' => env('TEST_DB_HOST', 'localhost'),
            'database' => env('TEST_DB_DATABASE', 'forge'),
            'username' => env('TEST_DB_USERNAME', 'forge'),
            'password' => env('TEST_DB_PASSWORD', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
        ],
    ],
];

ステップ 2: .env ファイルでデータベース認証情報を指定する

TEST_DB_HOST=localhost
TEST_DB_DATABASE=laravel
TEST_DB_USERNAME=root
TEST_DB_PASSWORD=rootwdp

ステップ 3: phpunit.xml で使用するテスト データベース接続を指定します。

<env name="DB_CONNECTION" value="testing_db"/>
          OR Below If you prefer sqlite
<env name="DB_CONNECTION" value="sqlite_testing_db"/>                

ステップ 4: データベースをこの新しいテスト用データベースに移行します - データベース トランザクションを使用してテーブルへの挿入をロールバックすることを選択した場合。

php artisan migrate --database=testing_db

//If using sqlite
touch storage/testing_database.sqlite
php artisan migrate --database=sqlite_testing

ステップ 5: これで、データベース トランザクションを使用した単体テストは次のようになります。

<?php

use App\User;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class UserTest extends TestCase
{
    use DatabaseTransactions;

    /** @test */
    function it_test_user_can_be_saved()
    {
        factory(User::class, 2)->create();

        $users = User::all();

        $this->assertEquals(2, $users->count());
    }
}

//Run Php Unit
-> vendor/bin/phpunit --color tests/acceptance/model/UserTest.php

注: データベース トランザクションを使用したくない場合は、TestCase.php クラスでセットアップとティアダウン メソッドを使用して、以下のようにデータベースを移行およびロールバックできます。

<?php

use Illuminate\Support\Facades\Artisan;

class TestCase extends Illuminate\Foundation\Testing\TestCase
{
    ...

    public function setUp()
    {
        parent::setUp();
        Artisan::call('migrate');
    }

    public function tearDown()
    {
        Artisan::call('migrate:reset');
        parent::tearDown();
    }
}
于 2016-01-08T23:33:22.703 に答える
2

app.php で Dotenv セクションを変更します

$envFile = 'testing' === env('APP_ENV') ? '.env.testing' : null;
try {
    (new Dotenv\Dotenv(__DIR__ . '/../', $envFile))->load();
} catch (Dotenv\Exception\InvalidPathException $e) {
    //
}

これは機能するため、PHPUnit はアプリをロードする前に環境変数を変更します。

于 2017-03-26T10:11:11.773 に答える
1

更新しました

Laravel 5.8 ユーザーの場合.env.testing、プロジェクトのルートにファイルを作成できます。

my_app_testing などの別のデータベースを使用します。

したがって、.env では次のようになります。

DB_DATABASE=clinical_managment

そして .env.testing で

DB_DATABASE=clinical_managment_testing

次に、構成を明確にします。

php artisan config:clear

テストを再実行します。私のセットアップでは、動作します。

于 2019-11-14T03:56:46.173 に答える
0

単体テストを開始する前に、一時的に .env.testing の名前を .env に変更する以外に方法は考えられません。

これは、アプリケーションをロードする前に phpunit がブートストラップ ファイルとして使用するものであるため、bootstrap/autoload.php にいくつかのロジックを配置できます。

于 2015-07-28T16:56:41.130 に答える