PHPUnit Larvel 在测试前执行一次

PHPUnit Larvel execute ONCE before testing

我使用 Laravel 8 和 PHPUnit 9.3.3

现在我在CreatesApp.php写了:

namespace Tests;

use App\Models\User;
use Illuminate\Contracts\Console\Kernel;
use Illuminate\Support\Facades\Artisan;

trait CreatesApplication
{
    /**
     * Creates the application.
     *
     * @return \Illuminate\Foundation\Application
     */
    public function createApplication()
    {
        $app = require __DIR__.'/../bootstrap/app.php';
        $app->make(Kernel::class)->bootstrap();

        Artisan::call('migrate:reset');
        Artisan::call('migrate');

        \App\Models\User::factory(10)->create();
        \App\Models\Post::factory(10)->create();

        return $app;
    }
}

此代码执行每个测试,我希望此代码仅在测试前执行:

Artisan::call('migrate:reset');
Artisan::call('migrate');

\App\Models\User::factory(10)->create();
\App\Models\Post::factory(10)->create();

如果您只想在启动时执行一些命令 - 您可以 bootstrap 使用您自己的 boostraper 进行测试:docs

但是,你的方法不对:

  1. 必须隔离测试:必须为每个测试执行迁移

  2. 为此 - 将 DatabaseMigrations 特性添加到您的测试中。

    use DatabaseMigrations;
    
  3. 对于创建实体 - 使用 seeders

  4. 用于测试的种子数据库 - 覆盖 setUp 方法

    public function setUp(): void
    {
        parent::setUp();
        $this->seed();
    }
    

顺便说一句,也许您对迁移的测试速度感到沮丧 - 看看这个 article - 它显着提高了性能