欧美三区四区_av先锋影音资源站_亚洲第一论坛sis_影音先锋2020色资源网_亚洲精品社区_在线免费观看av网站_国产一区二区伦理_亚洲欧美视频一区二区_99视频精品全部免费在线_精精国产xxxx视频在线

單元測試對PHP代碼的檢查_PHP教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:解析PHP編碼規(guī)范之注釋和文件結(jié)構(gòu)
文件結(jié)構(gòu) | |――images |――include |――parameter |――config |――function |――index images存放圖片文件,include中是系統(tǒng)是要引用的文件,一般在parameter中存放參數(shù)文件,config中存放配置文件,function中存放方法文件,如javascript的方法等,

測試驅(qū)動的開發(fā)和單元測試是確保代碼在經(jīng)過修改和重大調(diào)整之后依然能如我們期望的一樣工作的最新方法。在本文中,您將學(xué)習(xí)到如何在模塊、數(shù)據(jù)庫和用戶界面(UI)層對自己的 PHP 代碼進(jìn)行單元測試。

現(xiàn)在是凌晨 3 點。我們怎樣才能知道自己的代碼依然在工作呢?

Web 應(yīng)用程序是 24x7 不間斷運(yùn)行的,因此我的程序是否還在運(yùn)行這個問題會在晚上一直困擾我。單元測試已經(jīng)幫我對自己的代碼建立了足夠的信心 —— 這樣我就可以安穩(wěn)地睡個好覺了。

單元測試 是一個為代碼編寫測試用例并自動運(yùn)行這些測試的框架。測試驅(qū)動的開發(fā) 是一種單元測試方法,其思想是應(yīng)該首先編寫測試程序,并驗證這些測試可以發(fā)現(xiàn)錯誤,然后才開始編寫需要通過這些測試的代碼。當(dāng)所有測試都通過時,我們開發(fā)的特性也就完成了。這些單元測試的價值是我們可以隨時運(yùn)行它們 —— 在簽入代碼之前,重大修改之后,或者部署到正在運(yùn)行的系統(tǒng)之后都可以。

PHP 單元測試

對于 PHP 來說,單元測試框架是 PHPUnit2。可以使用 PEAR 命令行作為一個 PEAR 模塊來安裝這個系統(tǒng):% pear install PHPUnit2。

在安裝這個框架之后,可以通過創(chuàng)建派生于 PHPUnit2_Framework_TestCase 的測試類來編寫單元測試。

模塊單元測試

我發(fā)現(xiàn)開始單元測試最好的地方是在應(yīng)用程序的業(yè)務(wù)邏輯模塊中。我使用了一個簡單的例子:這是一個對兩個數(shù)字進(jìn)行求和的函數(shù)。為了開始測試,我們首先編寫測試用例,如下所示。

清單 1. TestAdd.php

 

require_once 'Add.php';

require_once 'PHPUnit2/Framework/TestCase.php';

class TestAdd extends PHPUnit2_Framework_TestCase

{

function test1() { $this->assertTrue( add( 1, 2 ) == 3 ); }

function test2() { $this->assertTrue( add( 1, 1 ) == 2 ); }

}

?>

這個 TestAdd 類有兩個方法,都使用了 test 前綴。每個方法都定義了一個測試,這個測試可以與清單 1 一樣簡單,也可以十分復(fù)雜。在本例中,我們在第一個測試中只是簡單地斷定 1 加 2 等于 3,在第二個測試中是 1 加 1 等于 2。

PHPUnit2 系統(tǒng)定義了 assertTrue() 方法,它用來測試參數(shù)中包含的條件值是否為真。然后,我們又編寫了 Add.php 模塊,最初讓它產(chǎn)生錯誤的結(jié)果。

清單 2. Add.php

 

function add( $a, $b ) { return 0; }

?>

現(xiàn)在運(yùn)行單元測試時,這兩個測試都會失敗。

清單 3. 測試失敗

% 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)在我知道這兩個測試都可以正常工作了。因此,可以修改 add() 函數(shù)來真正地做實際的事情了。

 

function add( $a, $b ) { return $a $b; }

?>

現(xiàn)在這兩個測試都可以通過了。

清單 4. 測試通過

% phpunit TestAdd.php

PHPUnit 2.2.1 by Sebastian Bergmann.

..

Time: 0.0023679733276367

OK (2 tests)

%

盡管這個測試驅(qū)動開發(fā)的例子非常簡單,但是我們可以從中體會到它的思想。我們首先創(chuàng)建了測試用例,并且有足夠多的代碼讓這個測試運(yùn)行起來,不過結(jié)果是錯誤的。然后我們驗證測試的確是失敗的,接著實現(xiàn)了實際的代碼使這個測試能夠通過。

我發(fā)現(xiàn)在實現(xiàn)代碼時我會一直不斷地添加代碼,直到擁有一個覆蓋所有代碼路徑的完整測試為止。在本文的最后,您會看到有關(guān)編寫什么測試和如何編寫這些測試的一些建議。

數(shù)據(jù)庫測試

在進(jìn)行模塊測試之后,就可以進(jìn)行數(shù)據(jù)庫訪問測試了。數(shù)據(jù)庫訪問測試 帶來了兩個有趣的問題。首先,我們必須在每次測試之前將數(shù)據(jù)庫恢復(fù)到某個已知點。其次,要注意這種恢復(fù)可能會對現(xiàn)有數(shù)據(jù)庫造成破壞,因此我們必須對非生產(chǎn)數(shù)據(jù)庫進(jìn)行測試,或者在編寫測試用例時注意不能影響現(xiàn)有數(shù)據(jù)庫的內(nèi)容。

數(shù)據(jù)庫的單元測試是從數(shù)據(jù)庫開始的。為了闡述這個問題,我們需要使用下面的簡單模式。

清單 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 是一個 authors 表,每條記錄都有一個相關(guān)的 ID。

接下來,就可以編寫測試用例了。

清單 6. TestAuthors.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 );

}

}

?>

這組測試覆蓋了從表中刪除作者、向表中插入作者以及在驗證作者是否存在的同時插入作者等功能。這是一個累加的測試,我發(fā)現(xiàn)對于尋找錯誤來說這非常有用。觀察一下哪些測試可以正常工作,而哪些測試不能正常工作,就可以快速地找出哪些地方出錯了,然后就可以進(jìn)一步理解它們之間的區(qū)別。

最初產(chǎn)生失敗的 dblib.php PHP 數(shù)據(jù)庫訪問代碼版本如下所示。

清單 7. dblib.php

 

require_once('DB.php');

class Authors

{

public static function get_db()

{

$dsn = 'mysql://root:password@localhost/unitdb';

$db =& DB::Connect( $dsn, array() );

if (PEAR::isError($db)) { die($db->getMessage()); }

return $db;

}

public static function delete_all()

{

return false;

}

public static function insert( $name )

{

return false;

}

public static function get_all()

{

return null;

}

}

?>

對清單 8 中的代碼執(zhí)行單元測試會顯示這 3 個測試全部失敗了:

清單 8. dblib.php

% phpunit TestAuthors.php

PHPUnit 2.2.1 by Sebastian Bergmann.

FFF

Time: 0.007500171661377

There were 3 failures:

1) test_delete_all(TestAuthors)

2) test_insert(TestAuthors)

3) test_insert_and_get(TestAuthors)

FAILURES!!!

Tests run: 3, Failures: 3, Errors: 0, Incomplete Tests: 0.

%

分享:解答PHP和MySQL操作應(yīng)該注意的一些細(xì)節(jié)
對于 MySQL ,第一件你必須牢記的是它的每一行命令都是用分號 (;) 作為結(jié)束的,但沒有完全絕對的事,在這兒也是一樣。 當(dāng)一行 MySQL 被插入在 PHP 代碼中時,最好把后面的分號省略掉,例如: mysql_query (INSERT INTO tablename (first_name, last_name) V

共2頁上一頁12下一頁
來源:模板無憂//所屬分類:PHP教程/更新時間:2009-06-21
相關(guān)PHP教程
欧美淫片网站| 免费av网站在线| 亚洲一区二区电影| 成人一区二区三区| 亚洲欧美激情在线视频| 相泽南亚洲一区二区在线播放| 69精品无码成人久久久久久| 国产电影一区| 99久久99久久精品免费看蜜桃| 国产丝袜一区二区| 伊人久久青草| 亚洲国产精一区二区三区性色| 欧美精品momsxxx| 日韩理论片中文av| 97在线看福利| 天堂中文av在线| 婷婷视频在线观看| 狠狠色丁香婷婷综合久久片| 欧美精品一区二区三区在线| 色一情一区二区三区四区| 中文字幕影音先锋| 国产欧美日韩精品一区二区三区| 亚洲欧美日韩精品久久久久| 日本成人精品在线| 国产成人av免费观看| 精品国产黄a∨片高清在线| 成人免费视频视频| 精品国产一区二区三区久久久狼 | 一级做a爰片毛片| 日韩黄色三级在线观看| 91丨九色丨蝌蚪丨老版| 九九精品在线观看| 亚洲欧美日韩一级| 欧洲一级精品| www.99精品| 久久国产视频网站| 日日干夜夜操s8| 午夜视频免费看| 国产99精品国产| 久久精品视频在线| 亚洲欧美激情网| 欧美成人黑人| 成人av网址在线| 久久精品视频va| 国产a视频免费观看| 亚洲第一色视频| 国产一区二区美女诱惑| 中文字幕久久亚洲| 嫩草av久久伊人妇女超级a| 欧美 日韩 国产 成人 在线 91 | 精品国产鲁一鲁****| 久久精品水蜜桃av综合天堂| 久久久久久美女| 91丨porny丨九色| 精品国产亚洲一区二区在线观看 | 日本高清久久| 黄色片网站免费| 国产69精品久久久久按摩| 2020国产成人综合网| 97香蕉久久夜色精品国产| 超碰人人cao| 色悠久久久久综合先锋影音下载| 亚洲欧洲三级电影| 国产精品入口日韩视频大尺度| 成人免费av片| 曰本一区二区三区视频| 精品久久久久久久久久国产 | 国产精品一区二区av交换| 亚洲电影一区二区三区| 国产精品国产精品国产专区蜜臀ah| 黄色录像一级片| 91精品国产自产拍在线观看蜜| 欧美调教femdomvk| 日韩三级在线播放| 亚洲欧美偷拍视频| 日韩av成人高清| 中文字幕亚洲字幕| 中文字幕 91| 福利一区三区| 玉足女爽爽91| av成人免费观看| 六月丁香激情综合| 美女脱光内衣内裤视频久久网站| 日韩中文字幕在线视频| 制服丝袜中文字幕第一页| 国色天香久久精品国产一区| 夜夜嗨av一区二区三区| 国产伦精品一区二区三区高清 | 欧洲精品在线观看| 在线观看亚洲视频啊啊啊啊| 成人1区2区3区| 成人avav影音| 国产精品免费视频xxxx| 粉嫩av性色av蜜臀av网站| 亚洲私人影院| 亚洲欧美中文另类| 手机av在线免费| 第一区第二区在线| 在线观看国产一区二区| 一区二区视频国产| 精品毛片一区二区三区| 97国产一区二区| 国产精品久久久久久久久男| 成年人二级毛片| 亚洲一区视频| www.亚洲一区| 爱爱的免费视频| 亚洲成人一区| 亚洲欧美综合精品久久成人| 国产欧美激情视频| 欧美日韩123| 欧美丰满少妇xxxbbb| 97超碰在线人人| 午夜精品成人av| 一区二区三区小说| 人偷久久久久久久偷女厕| 99精品免费观看| 久久久久久久久97黄色工厂| 91精品啪aⅴ在线观看国产| 日本中文字幕在线免费观看| 久久爱另类一区二区小说| 91国产精品视频在线| 三上悠亚作品在线观看| 亚洲一区图片| 欧美精品18videos性欧| 免费黄色在线网址| 宅男噜噜噜66一区二区| www.亚洲人.com| 成人片黄网站色大片免费毛片| 欧美区亚洲区| 日韩专区在线播放| 精品国产av无码| 一本色道88久久加勒比精品| 欧美日韩福利在线观看| 成人欧美一区二区三区黑人一| 久热re这里精品视频在线6| 国内精品国产三级国产在线专| 黄色国产在线播放| 香蕉精品999视频一区二区| 欧美极品少妇xxxxx| wwwav国产| 国产一区二区三区免费看 | 日韩综合小视频| 国产91精品久久久久久久| 免费在线视频一区二区| 国产伦精一区二区三区| 91日本在线观看| 一级做a爱片久久毛片| 国产精品视频一二| 日本一区美女| av成人在线播放| 欧美视频中文一区二区三区在线观看 | 国产专区在线视频| 日韩高清在线观看一区二区| 91精品国产色综合久久| 被黑人猛躁10次高潮视频| 永久91嫩草亚洲精品人人| 日韩视频欧美视频| 美国黄色片视频| 韩国v欧美v亚洲v日本v| 91精品综合视频| 精品欧美在线观看| 亚洲一区二区三区中文字幕| 精品无码国产一区二区三区av| 久久亚州av| 亚洲黄色成人网| 三叶草欧洲码在线| 久久婷婷激情| 国产精品自产拍在线观看| 国产精品老熟女视频一区二区| 亚洲天堂网中文字| 大胆欧美熟妇xx| 农村少妇一区二区三区四区五区 | 中文字幕日韩第一页| 亚洲婷婷综合久久一本伊一区| 免费成人进口网站| 加勒比色老久久爱综合网| 精品调教chinesegay| 久久久久亚洲av无码a片| 精品亚洲porn| 国产一区在线免费| 欧美羞羞视频| 91精品国产综合久久久久| 超碰人人cao| 玖玖国产精品视频| 91网站在线看| 手机看片国产1024| 欧美亚洲综合在线| 天堂va欧美va亚洲va老司机| 国产亚洲成人一区| 国产精品一区二区三区成人| 亚洲a视频在线| 欧洲日韩一区二区三区| 无码国产精品久久一区免费| 亚洲综合精品四区| 91久久综合亚洲鲁鲁五月天| 少妇高潮久久久| 欧美日韩成人一区二区| 欧美xxxxx精品| 老司机精品视频导航| 国产传媒一区| 久久久加勒比| 日韩高清不卡av| 国产尤物在线播放| 久久久久亚洲蜜桃| 日韩久久久久久久久久久久| 精品国产乱码久久久久久蜜坠欲下 | 国产成人免费观看视频| 中文字幕一区二区三区在线观看 | 天天干天天干天天干天天| 国产精品白丝在线| 大陆极品少妇内射aaaaa| 亚洲深深色噜噜狠狠爱网站| 日本精品免费一区二区三区| 国产男女裸体做爰爽爽| 日本韩国欧美国产| 丰满岳乱妇一区二区| 久久国产欧美日韩精品| 国产综合精品一区二区三区| 精品一区二区三区亚洲| 在线精品91av| 国产a∨精品一区二区三区仙踪林| 亚洲欧美日本在线| 看欧美ab黄色大片视频免费| 99在线精品视频在线观看| 91在线免费网站| 福利一区在线| 亚洲人成电影网站色www| 国产在线视频二区| 依依成人综合视频| 日韩中文字幕a| 秋霞电影一区二区| 热舞福利精品大尺度视频| 台湾色综合娱乐中文网| 国语对白做受69| 成 人片 黄 色 大 片| 欧美一级在线免费| 午夜国产福利视频| 国产精品久久久久久久久免费桃花| 1024精品视频| 久久福利毛片| 精品久久一区二区三区蜜桃| 成人av综合网| 欧美精品第一页在线播放| 精品国产av鲁一鲁一区| 欧美精品色综合| 任你操精品视频| 中文字幕一区二区三区在线播放| 无限资源日本好片| 精品一区二区三区在线播放视频| 日韩国产高清一区| 欧美日中文字幕| 国产精品观看在线亚洲人成网| 亚洲天堂1区| 深夜福利日韩在线看| 一区二区三区亚洲视频| 91麻豆精品91久久久久同性| 波多野结衣不卡视频| 一二三四社区欧美黄| 国产chinesehd精品露脸| 成人午夜伦理影院| 欧美久久在线观看| 日韩视频三区| 欧美理论一区二区| 色无极亚洲影院| 成人乱色短篇合集| 51精品国产| 欧美在线免费看| 成人在线视频播放| 日韩在线欧美在线| 国产免费一区二区三区免费视频| 欧美一级午夜免费电影| 精品少妇一二三区| 狠狠色狠狠色综合日日小说| 亚洲区免费视频| 最好看的中文字幕久久| 亚洲av无一区二区三区久久| 懂色av噜噜一区二区三区av | 久久精品国产77777蜜臀| 欧美日韩亚洲国产成人| 好看不卡的中文字幕| 精品在线观看一区二区| 欧美日韩一二| 91视频99| 国产不卡一区| 91牛牛免费视频| 欧美精品中文字幕亚洲专区| 国产精品wwwwww| 亚洲精品影片| 日本成熟性欧美| 美女久久精品| 欧美性受xxx| 国产成人视屏| 欧美一区在线直播| 成人在线视频区| 欧美影院久久久| 日韩三级网址| 国产成人一区二区| av成人资源| 国产精品女人网站| 国产欧美一区二区三区米奇| 国产精品免费一区| 久久精品论坛| 成人黄色在线观看| 欧美日韩播放| 国产一区二区精品在线| 97视频热人人精品免费| 久久久久久久久久久一区| 亚洲视频在线免费| 欧美重口乱码一区二区| 国产综合久久| 亚洲国产精品视频一区| 在线亚洲精品| 国产一区 在线播放| 麻豆精品视频在线观看视频| 97成人在线免费视频| 精品亚洲成a人| 亚洲无吗一区二区三区| 久久综合视频网| 日韩少妇一区二区| 亚洲精品免费电影| 精品无码一区二区三区 | 蜜桃无码一区二区三区| 亚洲国产精品一区二区久久恐怖片 | 国产一区日韩二区欧美三区| av无码精品一区二区三区| 波多野结衣在线一区| 欧美体内she精高潮| 日韩一区在线看| 一级黄色录像毛片| 欧美性色视频在线| 日韩三级视频在线播放| 精品少妇一区二区三区视频免付费| 国产精品国产三级国产aⅴ | 亚洲精品一区二区三区新线路| 久久精品视频免费播放| 人人精品久久| 国产欧美日韩免费| 日韩国产一区二区| 欧洲精品亚洲精品| 天堂成人免费av电影一区| 欧美国产亚洲一区| 94色蜜桃网一区二区三区| 国产高潮视频在线观看| 亚洲电影一区二区三区| 国产网友自拍视频| 亚洲精品国产精品久久清纯直播| 人妻少妇一区二区三区| 91精品国产高清自在线看超| 美国十次av导航亚洲入口| 国产精选一区二区| 国产视频一区在线观看一区免费| 鲁一鲁一鲁一鲁一色| 久久综合给合久久狠狠狠97色69| 丰满少妇一区二区| 欧美亚一区二区| 亚洲在线视频播放| 久久激情五月丁香伊人| 999精品视频在线观看| 91色视频在线导航| 欧美日韩一区二区三区四区在线观看| 日本大胆人体视频| caoporn国产一区二区| 一级特黄a大片免费| 日本乱人伦aⅴ精品| 69xxxx国产| 久久精品亚洲精品| 成人av资源网址| 欧美精品免费观看二区| 日本成人中文字幕在线视频| 57pao国产成永久免费视频| 亚洲激情图片qvod| 国产香蕉视频在线| 在线观看视频99| 日韩高清一区| 欧美国产一二三区| 久久国内精品视频| 亚洲一级Av无码毛片久久精品| 欧美视频国产精品| 一级黄色a毛片| 国产+人+亚洲| 成人羞羞动漫| 91网站在线观看免费| 久久久美女艺术照精彩视频福利播放| 日本一二三不卡视频| 日韩欧美一区中文| www.com.cn成人| 成人久久一区二区| 亚洲一区区二区| 国产喷水theporn| 亚洲 欧美综合在线网络| 亚洲精品一区二区二区| 欧美精品久久久久久久| av中文一区| 日本香蕉视频在线观看| 国产亚洲午夜高清国产拍精品| 希岛爱理中文字幕| 亚洲人成77777在线观看网| 久久久国产精品入口麻豆| 欧美一区二区三区在线免费观看 |