在 PHP 中,要做 Unit test,PHPUnit 是主流,但使用 SimpleTest 最大的優點,就是「簡單」,以及可以透過流覽器使用,用格式化和彩色來顯示測試結果,更為清楚明白。
按原開發者的說明,「simple」不是只有「lite」的功能,而是使用上的「simple」。
很高興,在經過快 10 年之後,有人把它修改成可以經由 composer 來安裝,因此,在 Laravel 中,可以更容易的使用 SimpleTest。只要在 composer.json 中加上下面的設定,再執行 composor install 即可。
"require-dev": { "simpletest/simpletest": "^1.1" },以下說明,主要是參考 <PHP in Action> 的內容,要更進一步學習 SimpleTest ,可參考該書。
First, let's create a very simple test class to test the function of SimpleTest. This class, app\Tests\TestOfTest.php, is shown as follows.
<?phpnamespace App\Tests;use UnitTestCase;class TestOfTest extends UnitTestCase { function testTrial() { $flg = false; $this->assertEqual($flg, false, 'My first test'); }}Now, create a TestController to invoke the Test Class. This test controller is listed as follows.
<?phpnamespace App\Http\Controllers;use HtmlReporter;use App\Tests\TestOfTest;class TestController extends Controller{ public function __construct() { $ip = $_SERVER["REMOTE_ADDR"]; if ($ip !== '127.0.0.1') { die("Cannot run here!"); } } public function anyIndex() { $test = new \App\Tests\TestOfTest(); $test->run(new \HtmlReporter()); }}Browsing the url http://localhost:8080/test, we can see the result of test failed. Great, the SimpleTest works successfully.
Fail: testTrial -> Equal expectation fails as [Boolean: true] does not match [Boolean: false] at [/home/ajax/test/laravel-5.0-test/app/Tests/TestOfTest.php line 11]
1/1 test cases complete: 0 passes, 1 fails and 0 exceptions.
Open app\Tests\TestOfTest.php to modify $flg = false; , and then refresh the browser, we can obtain the result of test passed.
1/1 test cases complete: 1 passes, 0 fails and 0 exceptions.
Quite simple, isn't it?
更進一步,假如要顯示 pass 的測試,參考官網的說明,建立下面的 class
<?phpnamespace App\Tests;use HtmlReporter;class ShowPasses extends HtmlReporter{ function paintPass($message) { parent::paintPass($message); print "<span class=\"pass\">Pass</span>: "; $breadcrumb = $this->getTestList(); array_shift($breadcrumb); print implode("->", $breadcrumb); print "->$message<br />\n"; } protected function getCss() { return parent::getCss() . ' .pass { color: green; }'; }}然後,在 controller 的 action 中,使用 ShowPasses() 來顯示結果。
public function anyIndex(){ $test = new \App\Tests\TestOfTest(); $test->run(new \App\Tests\ShowPasses());}顯示結果如下
Pass: testTrial->My first test at [/var/www/html/ajtest/course/web-src/app/Tests/TestOfTest.php line 12]
1/1 test cases complete: 1 passes, 0 fails and 0 exceptions.