了解單元測試
????????單元測試是由程序員自己來完成,最終受益的也是程序員自己??梢赃@么說,程序員有責(zé)任編寫功能代碼,同時也就有責(zé)任為自己的代碼編寫單元測試。執(zhí)行單元測試,就是為了證明這段代碼的行為和我們期望的一致。
????????在單元測試的過程中,第一步也是最重要的一步就是要理解我們要測試的單元原本要做什么,而不是他實際上做了什么,所以這就要求我們在開發(fā)代碼的時候,每一個單元或者是每一個函數(shù)都要有一個概要的規(guī)格說明。
學(xué)習(xí)主要的php框架
? ? ? ? 在PHP領(lǐng)域,單元測試的工具主要有PHPUNIT,PHPUNIT2和SimpleTest三種。其中PHPUNIT在功能上很簡單,不算完善;PHPUNIT2是專門為PHP5寫的單元 測試工具,在結(jié)構(gòu)和功能上都向Junit看齊;而SimpleTest則是一套非常實用的測試工具,其中的webTest支持對web程序界面的測試,是 Easy最為推薦的一款測試工具。本次我主要就是學(xué)習(xí)了simpletest框架。
具體框架的使用
????????Simpletest 使用起來非常的簡單和方便,安裝也很容易,只需網(wǎng)上下載安裝包,然后解壓在本地服務(wù)可以訪問到的文件夾即可。
接下來就是它的主要功能:
1)有標(biāo)準(zhǔn)的輸出
它的輸出格式如下:

測試代碼:
require_once('simpletest/autorun.php');//加載測試文件之前必須引入的框架入口文件
require_once('../classes/log.php');//要測試的類文件
class TestOfLogging extends UnitTestCase {
???function testLogCreatesNewFileOnFirstMessage() {
???? ???@unlink('/temp/test.log');
???????$log = new Log('/temp/test.log');
???????$this->assertFalse(file_exists('/temp/test.log'));
???????$log->message('Should write this to a file');
???????$this->assertTrue(file_exists('/temp/test.log'));
??? }
}
這里有幾點說明:
1、必須引入框架入口文件 和要測試的文件
2、新建的類要繼承UnitTestCase等類文件
3、新建的方法要以test開頭
同時如果我們要測試多個類,可以將所有的測試類進行合并到一個文件
如:
class AllTests extends TestSuite
{
???public function __construct()
??? {
???????parent::__construct('All tests for SimpleTest ' . SimpleTest::getVersion());
???????$this->addFile(__DIR__ . '/unit_tests.php');
???????$this->addFile(__DIR__ . '/shell_test.php');
???????/**
????????* The "live" and "acceptance" tests require arunning local webserver on "localhost:8080".
????????* We are using PHP's built-in webserver to serve the"test/site".
????????* The start command for the server is: `php -S localhost:8080 -ttest/site`.
????????*/
???????$this->addFile(__DIR__ . '/live_test.php');
???????$this->addFile(__DIR__ . '/acceptance_test.php');
??? }
}
2)可以進行類的模擬
主要代碼如下:
require_once dirname(__FILE__) .'/mock_objects.php';
Mock::generate('Log');
class TestOfSessionLogging extendsUnitTestCase {
???function testLoggingInIsLogged() {
???????$log = &new MockLog();
???????$log->expectOnce('message', array('User fred logged in.'));
???????$session_pool = &new SessionPool($log);
???????$session_pool->logIn('fred');
??? }
}
即我們可以模擬一個類Log,模擬的類名為MockLog,然后我們就可以像真實存在一個類MockLog一樣來使用這個類。這樣做的好處就是只專注我們需要測試的部分,并且不會因為其他的類代碼的改變來影響我們的測試類。
3)可以進行網(wǎng)頁測試
在SimpleTest中的Web測試是相當(dāng)原始的,因為沒有JavaScript。大多數(shù)其他瀏覽器操作都只是模擬請求和發(fā)生數(shù)據(jù)。
require_once('simpletest/autorun.php');
require_once('simpletest/web_tester.php');
class TestOfRankings extends WebTestCase {
???function testWeAreTopOfGoogle() {
???????$this->get('http://google.com/');
???????$this->setField('q', 'simpletest');
???????$this->click("I'm Feeling Lucky");
???????$this->assertTitle('SimpleTest - Unit Testing for PHP');
??? }
}
該段代碼就可以模擬google的搜索操作,并且來驗證返回的title.