iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0
DevOps

嘿,稍等一下!別急著開發功能,先來打造 Walking Skeleton 吧!系列 第 23

【Walking Skeleton】Day23 - 用 PHPUnit 來自動測試程式是否有按照預期運作

  • 分享至 

  • xImage
  •  

PHPUnit 是 php 的單元測試工具,它可以幫我們檢查程式是否有錯誤,不過驗證有沒有錯的程式還是需要自己寫,但是可以重複使用,也就是說不用再一直手動把變數 print 出來看是否正確


安裝 PHPUnit

安裝 PHPUnit 會需要用到 Composer,如果沒有裝的話,可以參考看看昨天的文章

composer require --dev phpunit/phpunit

忘記加 --dev 的話,它會貼心的問你是否要把它加上去,因為單元測試只會跑在開發環境,正式環境不需要

如果需要 GUI 的話,推薦使用這個 VSCode 擴充,它包含了幾乎所有寫 PHP 需要用到的功能,我以前是用另一個,不過 VSCode 介面有改過那個就有點壞掉,我試了好久一直沒用成功
https://marketplace.visualstudio.com/items?itemName=DEVSENSE.phptools-vscode

phpunit.xml 是 PHPUnit 的設定檔,可以設定哪個資料夾是放測式程式的,還有最重要的顯示顏色,就是要看到亮紅綠燈才舒服

phpunit.xml

<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.4/phpunit.xsd" colors="true">
    <testsuites>
        <testsuite name="Test Suite">
            <directory>tests/</directory>
        </testsuite>
    </testsuites>
    <source>
        <include>
            <directory suffix=".php">src</directory>
        </include>
    </source>
</phpunit>

使用 PHPUnit

新增一個測試檔案,來測試學生算加法是否有算錯,我們先假裝 Student class 有個方法 addTwoNumber,它可以輸入兩個數字、輸出相加的結果

tests/StudentTest.php

declare(strict_types=1);

use PHPUnit\Framework\TestCase;
use miku\school\Student;

final class StudentTest extends TestCase {

    public function testCanAddTwoNumberInt(): void {
        $student = new Student(1, 'miku');

        $this->assertEquals(3, $student->addTwoNumber(1, 2));
    }

    public function testCanAddTwoNumberFloat(): void {
        $student = new Student(1, 'miku');

        $this->assertEquals(0.3, $student->addTwoNumber(0.1, 0.2));
    }
}

第一個測試,我輸入 1 和 2、預期輸出的結果會是 3
第二個測試,我輸入 0.1 和 0.2、預期輸出的結果會是 0.3

assertEquals 是用來測試兩個數值是否相同的,前面填預期的值,後面是運算後輸出的真實結果

src/Student.php

namespace miku\school;

class Student {
    public function __construct(
        public int $id,
        public string $name,
    ) {
    }

    public function addTwoNumber(int|float $num1, int|float $num2): int|float {
        return $num1 + $num2;
    }

    // ...
}

可以點行號左邊的圖示來測試程式,並且測試失敗會直接顯示錯誤訊息

也可以點左邊的三角燒瓶圖示,來查看整個專案的所有測試案例

或是在終端機輸入指令測試

./vendor/bin/phpunit

這邊會失敗的原因是因為浮點運算的問題,0.1 + 0.2 不會等於 0.3


想辦法讓它都亮綠燈

bcadd 是 PHP 的精確運算函式,遇到浮點運算的話一定要用這個,或是裝 decimal extension,不然算一算就會發生誤差越來越大的問題

把之前的加號改成用 bcadd 相加,並且將小數位數設為 2 位

src/Student.php

namespace miku\school;

class Student {
    public function __construct(
        public int $id,
        public string $name,
    ) {
    }

    public function addTwoNumber(int|float $num1, int|float $num2): float {
        return (float) bcadd($num1, $num2, 2);
    }

    // ...
}

再跑一次測試

./vendor/bin/phpunit


這次就都是綠燈囉


上一篇
【Walking Skeleton】Day22 - 安裝 Composer 讓 autoload 來幫你自動 require 函式庫吧!
下一篇
【Walking Skeleton】Day24 - PHP_CodeSniffer:使用 Linter 來提升 PHP 程式碼品質吧!
系列文
嘿,稍等一下!別急著開發功能,先來打造 Walking Skeleton 吧!34
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言