PHPUnit 是 php 的單元測試工具,它可以幫我們檢查程式是否有錯誤,不過驗證有沒有錯的程式還是需要自己寫,但是可以重複使用,也就是說不用再一直手動把變數 print 出來看是否正確
安裝 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>
新增一個測試檔案,來測試學生算加法是否有算錯,我們先假裝 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
這次就都是綠燈囉