Build testing data into SQLite with Seed

PHP:7.2

Laravel:5.8

PHPUnit:7.5.6

在寫測試之前,通常都會先準備好測試資料庫,但當架構一複雜,準備測資反而曠日廢時,透過 Laravel MigratSeed 機制,並將測資寫進 SQLite,可以讓測試變得更輕鬆。

Config

首先,先針對 tests/TestCase.php 這支 Laravel 中主要的測試類別進行調整,將其加入資料庫及匯入測資的設定。

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
use Illuminate\Support\Facades\Artisan;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;

    protected function initDatabase()
    {
        // 動態修改設定,改接上 SQLite
        config([
            'database.default' => 'sqlite',
            'database.connections.sqlite' => [
                'driver'    => 'sqlite',
                'database'  => ':memory:',
                'prefix'    => '',
            ],
        ]);

        // 呼叫 php artisan migrate 建立 table
        // 呼叫 php artisan db:seed 匯入測試資料
        Artisan::call('migrate');
        Artisan::call('db:seed');
    }

    protected function resetDatabase()
    {
        // php artisan migrate:reset
        // 清除所有 migrate
        Artisan::call('migrate:reset');
    }
}

Test Case

在基本設定完成以後,我們只要在每次測試時,呼叫匯入測資的 method 就可以輕鬆將測資準備好了。

namespace Tests\Unit;

use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use App\Models\Member;

class MemberTest extends TestCase
{
    public function setUp(): void
    {
        // 呼叫父類別的 setUp()
        parent::setUp();
        $this->initDatabase();
    }

    public function tearDown(): void
    {
        $this->resetDatabase();
        // 呼叫子類別的 tearDown()
        parent::tearDown();
    }

    public function testBasicTest()
    {
        $member = Member::first();
        $this->assertEquals(1, $member->id);
    }
}
Categories: Laravel