這篇是基礎篇最後一篇啦
今天筆者想帶給大家的是一個軟體工程上很常見的TEST
當然一如既往,筆者不會在學名上鑽牛角尖做過多的解釋、說明
一樣用情境讓讀者感受TEST的重要性:
今天在經營中大型專案時,可能每次開發出一個API、View都可以手動測試(TEST)
但是當有大型改動,如:Laravel版本升級、開發或測試環境變更等等,需要將整個專案進行全面測試的時候
可能就一個頭兩個大,這就考驗平時有沒有寫自動測試(TEST Case)的習慣及品質了
以上有沒有讓各位了解到自動測試的重要性呢,其實軟體工程有專門的一門學問,
而現實有也有幾個職位,如:
等等職位,以確保程式的品質與可靠度等等
講的有點多了,Laravel是基於PHP Unit所開發Testing,還記得Initializer嗎
裡面也有Testing相關套件可以供參考
fake()是Laravel眾多的Helper之一,用於產生亂數資料(還有文字、email等)
1.Laravel官方文件
2.Faker官方文件
今天不用套件,用Laravel預設的測試
php artisan make:test PostControllerTest
tests\Feature\PostControllerTest.php
<?php
namespace Tests\Feature;
use App\Models\Post;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
class PostControllerTest extends TestCase
{
// use RefreshDatabase;
public function testIndex()
{
// 測試 /posts 路由是否正常運作
$response = $this->get('/posts');
$response->assertStatus(200);
}
public function testCreate()
{
// 測試 /posts/create 路由是否正常運作
$response = $this->get('/posts/create');
$response->assertStatus(200);
}
public function testStore()
{
// 測試 /posts 路由(HTTP POST 請求)是否正常運作
$data = [
'title' => fake()->sentence('20'),
'content' => fake()->sentence('99')
];
$response = $this->post('/posts', $data);
// 驗證是否成功創建文章,可以根據您的應用程式邏輯進一步檢查
$this->assertDatabaseHas('posts', ['content' => $data['content']]);
}
public function testShow()
{
// 創建一個測試文章
$post = Post::create([
'title' => fake()->sentence('20'),
'content' => fake()->sentence('99')
]);
// 測試 /posts/{post} 路由是否正常運作
$response = $this->get("/posts/{$post->id}");
$response->assertStatus(200);
}
public function testEdit()
{
// 創建一個測試文章
$post = Post::create([
'title' => fake()->sentence('20'),
'content' => fake()->sentence('99')
]);
// 測試 /posts/{post}/edit 路由是否正常運作
$response = $this->get("/posts/{$post->id}/edit");
$response->assertStatus(200);
}
public function testUpdate()
{
// 創建一個測試文章
$post = Post::create([
'title' => fake()->sentence('20'),
'content' => fake()->sentence('99')
]);
// 測試 /posts/{post} 路由(HTTP PATCH 請求)是否正常運作
$updatedData = [
'title' => fake()->sentence('20'),
'content' => fake()->sentence('99')
];
$response = $this->patch("/posts/{$post->id}", $updatedData);
// 驗證是否成功更新文章,可以根據您的應用程式邏輯進一步檢查
$this->assertDatabaseHas('posts', ['id'=> $post->id, 'content' => $updatedData['content']]);
}
public function testDestroy()
{
// 創建一個測試文章
$post = Post::create([
'title' => fake()->sentence('20'),
'content' => fake()->sentence('99')
]);
// 測試 /posts/{post} 路由(HTTP DELETE 請求)是否正常運作
$response = $this->delete("/posts/{$post->id}");
// 驗證是否成功刪除文章,可以根據您的應用程式邏輯進一步檢查
// $this->assertDatabaseMissing('posts', ['id' => $post->id]);
$this->assertSoftDeleted('posts', ['id' => $post->id]);
}
}
之後在終端下
php artisan test
or
clear && php artisan test
$this->assertSoftDeleted($post);
要使用assertSoftDeleted要在加上use SoftDeletes;
app\Models\Post.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Post extends Model
{
use HasFactory;
use SoftDeletes; // 加入這行
protected $fillable = [
'title',
'content'
];
}
如果不用assertSoftDeleted可以用
$this->assertDatabaseMissing('posts', ['id' => $post->id]);
意思是如果找不到這筆資料,回傳OK
use RefreshDatabase;
會在
1.開始時清空資料庫並重置自動增加id
2.結束時清空資料庫
請小心服用避免在正式環境
Response Assertions有很多檢查的方式
Database Testing也有
筆者大學時修過軟體工程,有一部分提到測試,包含白箱、黑箱測試,還有甚麼冒煙測試(?
說實在的,筆者沒有很完整參透其中各項理論
但不可否認的是,一個軟體開發工程師有必要了解測試的觀念和必要性
希望給讀者未來求職乃至任職有一點幫助