SImpleTest是一套用來作PHP程式測試的架構,雖然我很早就知道這東西,不過一直沒有用它。
最近開始在做自己用的程式庫,所以就用它來作自動測試。

架構上我希望測試用的程式碼跟程式庫本身分開,所以目錄我是這麼安排的:

├─[lib]
├─test
  ├─simpletest
  └─case

[lib]:程式庫目錄
test:測試用目錄
simpletest:SimpleTest的程式碼
case:測試程式集

在 test 底下有一個 index.php ,用來引入 case 底下所有的 .php 測試用的程式碼,
這裡假設[lib]的名稱叫做losttech,你可以根據你自己設定的目錄名稱更改,修改 define 那一行就對了。
index.php 內容如下:

<?php
mb_internal_encoding('UTF-8');
$目錄 = dirname(__FILE__);
define ('引用', $目錄 . '/../losttech/');
require_once $目錄 . '/simpletest/unit_tester.php';
require_once $目錄 . '/simpletest/collector.php';
require_once $目錄 . '/simpletest/reporter.php';

主程式();

function 主程式(){
    global $目錄;
    $測試 = &new GroupTest('測試報告');
    $測試->collect($目錄 . '/case/', new SimplePatternCollector());
    $測試->run(new HtmlReporter('UTF-8'));
    unset($測試);
}
?>

這裡有一個範例,我寫了一個函式叫做「字元陣列」,用途是把一個一串拆成一個一個的字元陣列。
我把它放到 losttech/string.php ,內容如下:

<?php
function 字元陣列($字串, $長度 = 1) {
    $輸出 = array();
    if ($長度 < 1) {
        return $輸出;
    }
    for ($索引 = 0; $索引 < mb_strlen($字串); $索引 += $長度) {
        $輸出[] = mb_substr($字串, $索引, $長度);
    }
    return $輸出;
}
?>

測試用的程式碼,我把它放到 test/case/string.php,這裡我故意讓它的檔名跟要引用的檔名相同。
內容如下:

<?php
require_once 引用 . 'class/' . basename(__FILE__);

class 測試:字元陣列 extends UnitTestCase {
    function testCreation(){
        $測試陣列 = array(
            '' => array(),
            '1' => array('1'),
            '一' => array('一'),
            '123' => array('1','2','3'),
            '一二三' => array('一','二','三'),
        );
        foreach($測試陣列 as $測試 => $結果) {
            $this->assertEqual($結果, 字元陣列($測試), "測試:$測試");
        }
    }
}
?>

測試結果:

測試報告

1/1 test cases complete: 5 passes, 0 fail

這裡有個重點,就是把要測試的程式碼放到以 test 開頭的成員函數(例如:testEmail, testLogin等等,總之必須是 test 開頭)裡面來,這樣才會進行自動測試。
arrow
arrow
    全站熱搜

    HACGIS 發表在 痞客邦 留言(0) 人氣()