了解單元測(cè)試
????????單元測(cè)試是由程序員自己來(lái)完成,最終受益的也是程序員自己??梢赃@么說(shuō),程序員有責(zé)任編寫(xiě)功能代碼,同時(shí)也就有責(zé)任為自己的代碼編寫(xiě)單元測(cè)試。執(zhí)行單元測(cè)試,就是為了證明這段代碼的行為和我們期望的一致。
????????在單元測(cè)試的過(guò)程中,第一步也是最重要的一步就是要理解我們要測(cè)試的單元原本要做什么,而不是他實(shí)際上做了什么,所以這就要求我們?cè)陂_(kāi)發(fā)代碼的時(shí)候,每一個(gè)單元或者是每一個(gè)函數(shù)都要有一個(gè)概要的規(guī)格說(shuō)明。
學(xué)習(xí)主要的php框架
? ? ? ? 在PHP領(lǐng)域,單元測(cè)試的工具主要有PHPUNIT,PHPUNIT2和SimpleTest三種。其中PHPUNIT在功能上很簡(jiǎn)單,不算完善;PHPUNIT2是專門為PHP5寫(xiě)的單元 測(cè)試工具,在結(jié)構(gòu)和功能上都向Junit看齊;而SimpleTest則是一套非常實(shí)用的測(cè)試工具,其中的webTest支持對(duì)web程序界面的測(cè)試,是 Easy最為推薦的一款測(cè)試工具。本次我主要就是學(xué)習(xí)了simpletest框架。
具體框架的使用
????????Simpletest 使用起來(lái)非常的簡(jiǎn)單和方便,安裝也很容易,只需網(wǎng)上下載安裝包,然后解壓在本地服務(wù)可以訪問(wèn)到的文件夾即可。
接下來(lái)就是它的主要功能:
1)有標(biāo)準(zhǔn)的輸出
它的輸出格式如下:
測(cè)試代碼:
require_once('simpletest/autorun.php');//加載測(cè)試文件之前必須引入的框架入口文件
require_once('../classes/log.php');//要測(cè)試的類文件
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'));
??? }
}
這里有幾點(diǎn)說(shuō)明:
1、必須引入框架入口文件 和要測(cè)試的文件
2、新建的類要繼承UnitTestCase等類文件
3、新建的方法要以test開(kāi)頭
同時(shí)如果我們要測(cè)試多個(gè)類,可以將所有的測(cè)試類進(jìn)行合并到一個(gè)文件
如:
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)可以進(jìn)行類的模擬
主要代碼如下:
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');
??? }
}
即我們可以模擬一個(gè)類Log,模擬的類名為MockLog,然后我們就可以像真實(shí)存在一個(gè)類MockLog一樣來(lái)使用這個(gè)類。這樣做的好處就是只專注我們需要測(cè)試的部分,并且不會(huì)因?yàn)槠渌念惔a的改變來(lái)影響我們的測(cè)試類。
3)可以進(jìn)行網(wǎng)頁(yè)測(cè)試
在SimpleTest中的Web測(cè)試是相當(dāng)原始的,因?yàn)闆](méi)有JavaScript。大多數(shù)其他瀏覽器操作都只是模擬請(qǐng)求和發(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的搜索操作,并且來(lái)驗(yàn)證返回的title.