測試基本寫法

接下來我們要利用 PHPUnit 來撰寫我們第一個測試。

建立專案測試環境

為專案建立一個 tests 資料夾。

  • 測試案例類別慣例以 Test 結尾,檔名和類別名要一致,此例檔名為 CartTest.php

撰寫測試

<?php
/* tests/CartTest.php */

require __DIR__ . '/../Cart.php';

class CartTest extends PHPUnit_Framework_TestCase
{
    public function testCart()
    {
        $cart = new Cart();

        // Test 1
        $quantities = [
            1, 0, 0, 0, 0, 0,
        ];
        $cart->updateQuantities($quantities);
        $this->assertEquals(199, $cart->getTotal());

        // Test 2
        $quantities = [
            1, 0, 0, 2, 0, 0,
        ];
        $cart->updateQuantities($quantities);
        $this->assertEquals(797, $cart->getTotal());

        // Test 3
        $products = $cart->getProducts();
        $this->assertEquals(6, count($products));
        $this->assertEquals(2, $products[3]['quantity']);
    }
}
  • 引用要測試的檔案,這裡為 Cart.php
  • 測試案例類別要繼承 PHPUnit 的 PHPUnit_Framework_TestCase 類別。
  • phpunit 指令會自動載入 PHPUnit 相關類別。
  • 在測試案例類別裡,通常會有一到多個以 test* 開頭的方法,它們稱為「測試 (test) 」。
  • 每組測試都可以有多個斷言 (assertion) 。
  • assertEquals 斷言兩值應為相等。
  • 在斷言裡,要先寫預期結果,再寫實際結果。

執行測試

切換到專案目錄後,就可以透過 phpunit 指令來執行測試:

C:\> cd C:\project
C:\project> phpunit tests/CartTest
PHPUnit 4.2.5 by Sebastian Bergmann.

.

Time: 34 ms, Memory: 3.00Mb

OK (1 test, 2 assertions)
  • 不需要指定完整 php 檔名,所以這裡只寫 tests/CartTest

  • 如果想要執行所有測試程式的話,就不用特別指定測試檔案名稱,直接指定目錄即可;例如:

    C:\project> phpunit tests
    
  • . 句點表示一個測試案例已測試成功;其他符號有:

    • F :斷言失敗
    • E :發生錯誤
    • R :測試被標記為有風險
    • S :測試被跳過
    • I :測試被標記為不完整或未實現
  • OK 表示全部測試成功, FAILURES! 表示有測試發生失敗。

  • (1 test, 2 assertions) 表示有一個測試案例,兩個斷言。另外當測試失敗時,會出現 Failures: n 表示有 n 個斷言失敗。

官方手冊參考

練習

  • 在官方手冊的附錄 A 裡,找出你認為較不瞭解的斷言類型,瞭解它們運作方式。

  • 思考上面的測試還有什麼可以加強的地方?