使用 AI 協助寫測試

前言

使用 AI 協助寫測試:讓測試變簡單,品質與效率一起提升

在軟體開發中,測試是確保品質與維護性的關鍵,但許多工程師常因不熟悉語法、覺得麻煩或缺乏動力而遲遲不願開始。隨著 AI 工具(如 GitHub Copilot)的出現,這些問題正逐漸被解決

為什麼要寫測試?

  • 確保品質:測試能驗證每個功能是否如預期運作,減少上線後出現 Bug 的機會
  • 加速開發:自動化測試能及早發現問題,讓開發更有信心,開發速度也能提升
  • 方便維護:測試就像程式的說明書,幫助日後理解或除錯,讓維護更輕鬆
  • 回歸測試:每次新功能上線時,能自動檢查舊功能有無被影響,避免人工作業遺漏或改壞

常見的測試難題

  • 不熟悉測試框架或語法,不知道怎麼下手
  • 難以設計完整的測試情境,尤其是邊界或錯誤流程
  • 覺得寫測試很花時間,進度壓力下容易被忽略
  • 團隊文化或主管不重視測試,缺乏動力

AI 工具如何幫助撰寫測試?

假設你有一個簡單的類別如下:

1
2
3
4
5
6
7
8
class DiscountCalculator {
public function calculate(float $price, float $rate): float {
if ($price < 0 || $rate < 0 || $rate > 1) {
throw new InvalidArgumentException("Invalid input");
}
return $price * (1 - $rate);
}
}

建立好測試檔案

1
2
3
4
5
6
7
8
9
<?php
// tests/DiscountCalculatorTest.php

use PHPUnit\Framework\TestCase;

class DiscountCalculatorTest extends TestCase
{
// 在這裡寫註解,讓 Copilot 自動補齊測試
}

1. 註解提示自動補齊

只要在測試檔案中寫下清楚的註解,Copilot 就能自動補齊對應的測試程式碼,省去打字的麻煩

1
// 為 DiscountCalculator 產生單元測試

可能就會自動提示:

1
2
3
4
public function testCalculateNormalCase() {
$calc = new DiscountCalculator();
$this->assertEquals(90, $calc->calculate(100, 0.1));
}

2. 選取程式碼自動產生測試

選取上面的 DiscountCalculator 程式碼,透過 Copilot 的聊天指令(如 /tests),即可自動產生涵蓋正常、邊界與錯誤情境的測試案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public function testCalculateWithZeroRate() {
$calc = new DiscountCalculator();
$this->assertEquals(100, $calc->calculate(100, 0));
}

public function testCalculateWithFullRate() {
$calc = new DiscountCalculator();
$this->assertEquals(0, $calc->calculate(100, 1));
}

public function testCalculateWithNegativePrice() {
$this->expectException(InvalidArgumentException::class);
$calc = new DiscountCalculator();
$calc->calculate(-1, 0.1);
}

3. 補全遺漏的邊界情境

寫完基本測試後,可以請 Copilot 建議還有哪些情境沒測到,特別是極端值、錯誤輸入等:

1
2
3
4
5
6
7
8
9
10
11
public function testCalculateWithNegativeRate() {
$this->expectException(InvalidArgumentException::class);
$calc = new DiscountCalculator();
$calc->calculate(100, -0.1);
}

public function testCalculateWithRateGreaterThanOne() {
$this->expectException(InvalidArgumentException::class);
$calc = new DiscountCalculator();
$calc->calculate(100, 1.1);
}

4. 使用 AI Agent 模式

在 VS Code 中選取 DiscountCalculator 類別,透過 Copilot Chat 的 agent 模式:

  1. 輸入:「請幫我產生 DiscountCalculator 的單元測試」
  2. 輸入:「請幫我補上邊界情境」

AI 會自動產生完整的測試程式碼,快速補齊常見與邊界的測試情境

AI 工具的輔助效益

  • 快速上手:降低學習門檻,讓工程師更容易開始寫測試
  • 節省重複工作:樣板化的測試交給 AI,工程師專注在核心邏輯
  • 發現遺漏情境:AI 常能提醒開發者沒想到的測試場景

結論

AI 工具讓撰寫測試變得更簡單、更有效率。工程師不再因為不熟悉或嫌麻煩而卻步,團隊也能看到品質與效率的提升

重要提醒:AI 產生的測試仍需工程師審核、調整,確保測試符合業務需求。AI 只是協助工具,最終的品質把關還是需要人工判斷

實用建議

  1. 從簡單開始:先用 AI 產生基本測試,再逐步完善
  2. 多種測試場景:結合正常流程、邊界條件、錯誤處理
  3. 持續優化:定期檢視和更新測試案例
  4. 團隊推廣:將 AI 輔助測試納入開發流程

參考資源