iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
自我挑戰組

我推的Laravel系列 第 11

【Day- 10】我推的Laravel-基礎篇-Testing (with Fake)

  • 分享至 

  • xImage
  •  

簡介

這篇是基礎篇最後一篇啦
今天筆者想帶給大家的是一個軟體工程上很常見的TEST
當然一如既往,筆者不會在學名上鑽牛角尖做過多的解釋、說明

一樣用情境讓讀者感受TEST的重要性:
今天在經營中大型專案時,可能每次開發出一個API、View都可以手動測試(TEST)
但是當有大型改動,如:Laravel版本升級、開發或測試環境變更等等,需要將整個專案進行全面測試的時候
可能就一個頭兩個大,這就考驗平時有沒有寫自動測試(TEST Case)的習慣及品質了

以上有沒有讓各位了解到自動測試的重要性呢,其實軟體工程有專門的一門學問,
而現實有也有幾個職位,如:

  • 測試工程師:測試工程師(Test Engineer)專注於確保軟體應用程序的正確運作。他們主要負責設計、編寫和執行測試用例,以驗證軟體的功能是否按預期工作。測試工程師的工作範圍可能包括單元測試、集成測試、功能測試、性能測試等,以確保軟體的品質和可靠性。
  • QA 工程師:QA 工程師(Quality Assurance Engineer)的角色更廣泛,他們關注的不僅僅是測試,還包括確保軟體開發過程的整體品質。QA 工程師可能參與需求分析、設計審查、代碼審查、流程改進等活動,以確保產品的品質標準得到遵守。測試只是 QA 工程師工作的一部分,他們還關注流程改進、標準遵守和品質管理。

等等職位,以確保程式的品質與可靠度等等

講的有點多了,Laravel是基於PHP Unit所開發Testing,還記得Initializer
裡面也有Testing相關套件可以供參考
https://ithelp.ithome.com.tw/upload/images/20230924/20163286KkwpGhZ0wk.png

fake()

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也有

總結

筆者大學時修過軟體工程,有一部分提到測試,包含白箱、黑箱測試,還有甚麼冒煙測試(?
說實在的,筆者沒有很完整參透其中各項理論
但不可否認的是,一個軟體開發工程師有必要了解測試的觀念和必要性
希望給讀者未來求職乃至任職有一點幫助


上一篇
【Day- 9】我推的Laravel-基礎篇-Middlware
下一篇
【Day-11】我推的Laravel-進階篇-Coding Style
系列文
我推的Laravel31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言