iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0

我們終於要開始實作我們的單元測試了,
首先我們先建立一個自己的測試案例
php artisan make:test MyFirstUnitTest
https://ithelp.ithome.com.tw/upload/images/20210908/20105694pfoCQPHTBs.png

我們發現在 /tests/Feature 資料夾多了一個 MyFirstUnitTest.php 檔案,
https://ithelp.ithome.com.tw/upload/images/20210908/20105694UNSIFJ4ulk.png

內容如下:

<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class MyFirstUnitTest extends TestCase
{
    /**
     * A basic feature test example.
     *
     * @return void
     */
    public function test_example()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

這個測試的內容是我們去向首頁請求,
期待能夠回傳200的Http狀態,
當然如果我們的網站沒有問題,
應該是要能夠回傳200沒有錯,
那我們就來做一下驗證
https://ithelp.ithome.com.tw/upload/images/20210908/20105694CiGPy1E1F7.png

最後跑出來的結果也跟我們預期的一樣,
是綠燈(代表通過),
如果我們把原來的程式改成這樣

$response = $this->get('/');
$response->assertStatus(404);

可以預期地,
一定是會回傳錯誤,
我們再來執行看看:
https://ithelp.ithome.com.tw/upload/images/20210908/20105694W66qpI2y7X.png

真的就變成紅燈了,
錯誤訊息說

Expected status code 404 but received 200.

我們原本預期得到的狀態是404,
但是卻回傳了200,
然後還告訴我們錯誤是在哪一行,
就是在MyFirstUnitTest.php的第20行。

這樣子我們就可以透過PHPUnit來驗證我們寫的程式有沒有問題。

所以我們現在開始來撰寫自己的測試程式,
現在我們想要新增一個網頁 /getLeapYear,
我們會傳給他一個值,
然後得到一個回傳值,
目前這個網頁是不存在的,
所以應該會得到404的回傳,
我們在我的們測試類別新增一個function,

public function test_leapyear_return_200()
{
    $response = $this->get('/getLeapYear');

    $response->assertStatus(200);
}

原本的那個範例改回來200

public function test_example()
{
    $response = $this->get('/');

    $response->assertStatus(200);
}

然後執行
php vendor/phpunit/phpunit/phpunit tests/Feature/MyFirstUnitTest.php
https://ithelp.ithome.com.tw/upload/images/20210908/20105694IwLjMqU8sr.png

我們來看看框框的地方

  1. .F 表示第一個測試成功、第二個測試失敗(Fail)了,
  2. 失敗的是 test_leapyear_return_200 這個函式
    原本預期要回傳200,但是卻回傳了404(因為還沒寫)
  3. 發生錯誤是在MyFirstUnitTest.php的第27行
  4. 總共做了2個測試,失敗了1個

到了這裡,
我們終於成功地做了一個失敗的單元測試,
(其實嚴格說來是成功,因為我們原本預期它就是會失敗)

然後我們在web.php新增

Route::get('/getLeapYear', function() {
    return true;
});

然後執行
php vendor/phpunit/phpunit/phpunit tests/Feature/MyFirstUnitTest.php
https://ithelp.ithome.com.tw/upload/images/20210908/20105694nj0gXtWb6D.png

我們的第一個測試已經成功了!


上一篇
[Day 06] 一個單元測試的題目-閏年的判斷
下一篇
[Day 08] 簡單的單元測試實作(二)
系列文
當拉拉肉遇到單元測試,是否能夠擦出命運的火花?31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言