清單 3. 測(cè)試失敗
% phpunit TestAdd.php
PHPUnit 2.2.1 by Sebastian Bergmann.
FF
Time: 0.0031270980834961
There were 2 failures:
1) test1(TestAdd)
2) test2(TestAdd)
FAILURES!!!
Tests run: 2, Failures: 2, Errors: 0, Incomplete Tests: 0.
現(xiàn)在我知道這兩個(gè)測(cè)試都可以正常工作了。因此,可以修改add()函數(shù)來真正地做實(shí)際的事情了。
<?php
function add( $a, $b ) { return $a+$b; }
?>
現(xiàn)在這兩個(gè)測(cè)試都可以通過了。
清單 4. 測(cè)試通過
% phpunit TestAdd.php
PHPUnit 2.2.1 by Sebastian Bergmann.
..
Time: 0.0023679733276367
OK (2 tests)
%
盡管這個(gè)測(cè)試驅(qū)動(dòng)開發(fā)的例子非常簡(jiǎn)單,但是我們可以從中體會(huì)到它的思想。我們首先創(chuàng)建了測(cè)試用例,并且有足夠多的代碼讓這個(gè)測(cè)試運(yùn)行起來,不過結(jié)果是錯(cuò)誤的。然后我們驗(yàn)證測(cè)試的確是失敗的,接著實(shí)現(xiàn)了實(shí)際的代碼使這個(gè)測(cè)試能夠通過。
我發(fā)現(xiàn)在實(shí)現(xiàn)代碼時(shí)我會(huì)一直不斷地添加代碼,直到擁有一個(gè)覆蓋所有代碼路徑的完整測(cè)試為止。在本文的后,您會(huì)看到有關(guān)編寫什么測(cè)試和如何編寫這些測(cè)試的一些建議。
數(shù)據(jù)庫(kù)測(cè)試
在進(jìn)行模塊測(cè)試之后,可以進(jìn)行數(shù)據(jù)庫(kù)訪問測(cè)試了。數(shù)據(jù)庫(kù)訪問測(cè)試帶來了兩個(gè)有趣的問題。首先,我們必須在每次測(cè)試之前將數(shù)據(jù)庫(kù)恢復(fù)到某個(gè)已知點(diǎn)。其次,要注意這種恢復(fù)可能會(huì)對(duì)現(xiàn)有數(shù)據(jù)庫(kù)造成破壞,因此我們必須對(duì)非生產(chǎn)數(shù)據(jù)庫(kù)進(jìn)行測(cè)試,或者在編寫測(cè)試用例時(shí)注意不能影響現(xiàn)有數(shù)據(jù)庫(kù)的內(nèi)容。
數(shù)據(jù)庫(kù)的單元測(cè)試是從數(shù)據(jù)庫(kù)開始的。為了闡述這個(gè)問題,我們需要使用下面的簡(jiǎn)單模式。
清單 5. Schema.sql
DROP TABLE IF EXISTS authors;
CREATE TABLE authors (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name TEXT NOT NULL,
PRIMARY KEY ( id )
);
清單 5 是一個(gè) authors 表,每條記錄都有一個(gè)相關(guān)的 ID。
接下來,可以編寫測(cè)試用例了。
清單 6. TestAuthors.php
<?php
require_once 'dblib.php';
require_once 'PHPUnit2/Framework/TestCase.php';
class TestAuthors extends PHPUnit2_Framework_TestCase
{
function test_delete_all() {
$this->assertTrue( Authors::delete_all() );
}
function test_insert() {
$this->assertTrue( Authors::delete_all() );
$this->assertTrue( Authors::insert( 'Jack' ) );
}
function test_insert_and_get() {
$this->assertTrue( Authors::delete_all() );
$this->assertTrue( Authors::insert( 'Jack' ) );
$this->assertTrue( Authors::insert( 'Joe' ) );
$found = Authors::get_all();
$this->assertTrue( $found != null );
$this->assertTrue( count( $found ) == 2 );
}
}
?>