針對資料庫的操作,大致介紹完了之後,下一步當然是針對資料庫的自動化測試囉!
在之前的 [Day 21] 和資料庫相關的測試!怎麼測試資料庫的存取 裡面,花費了一些篇幅,提到要怎麼在 laradock 環境下建立測試資料庫。
現在的 Laravel Sail 已經幫你建立好測試資料庫了!所以這段是不需要的。至於測試時改連到測試用資料庫這段,則是宣告在 phpunit.xml
裡面
<php>
<env name="APP_ENV" value="testing"/>
<env name="BCRYPT_ROUNDS" value="4"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="DB_DATABASE" value="testing"/>
<env name="MAIL_MAILER" value="array"/>
<env name="QUEUE_CONNECTION" value="sync"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="TELESCOPE_ENABLED" value="false"/>
</php>
(這邊要特別注意!如果沒有好好宣告,或者被其他人註解掉的話,
可能會導致自動測試時使用本地的資料庫,導致本地資料錯誤或者遺失!)
測試的方式大同小異,可以參考之前的文章作法。
這邊補充一些之前沒有介紹到的功能,像是在每次執行自動化測試後,幫忙清理資料庫的 RefreshDatabase
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class ExampleTest extends TestCase
{
use RefreshDatabase;
}
新的 Laravel 還加上了一些新的斷言方式,可以讓測試更加語意化,比方說 assertDatabaseCount();
$this->assertDatabaseCount('users', 5);
和原本就有的 assertSoftDeleted
對應的 assertNotSoftDeleted()
$this->assertNotSoftDeleted($user);
Model Factory 也是對自動化測試很有幫助的一個功能,不過以前的文章礙於篇幅,沒有好好介紹這一段。今天來好好介紹一下。
簡單的說,就是在撰寫測試時,特別是針對資料相關的測試,我們常常會需要一些假資料。這時候,與其寫程式一個一個 Model 的建立,如果可以寫一個元件,像是工廠一樣,幫我們一次建立好很多個物件,那不是很方便嗎?
這個觀念,就是所謂的 Factory,使用方法如下:
$user = User::factory()->create();
$users = User::factory()->count(3)->create();
如果希望物件建立好,不要儲存到資料庫內,可以用 make()
$user = User::factory()->make();
$users = User::factory()->count(3)->make();
如果希望物件建立時指定某個屬性,可以在 create()
裡面加上參數
$user = User::factory()->create([
'name' => 'Alice',
]);
那麼,要怎麼建立 Factory 呢?相信大家看了那麼多次,應該也越來越熟悉 Laravel 的習慣了:
./vendor/bin/sail artisan make:factory PostFactory
撰寫的方式,可以參考 Laravel 既有的 Database\Factories\UserFactory
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
*/
class UserFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition()
{
return [
'name' => fake()->name(),
'email' => fake()->safeEmail(),
'email_verified_at' => now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'remember_token' => Str::random(10),
];
}
/**
* Indicate that the model's email address should be unverified.
*
* @return static
*/
public function unverified()
{
return $this->state(fn (array $attributes) => [
'email_verified_at' => null,
]);
}
}
各位可以看到,要寫出一個簡潔好用的 Factory,還有很多可以研究的地方呢!
今天我們就分享到這邊,各位明天見!