PHPUnit简介及使用(thinkphp5的单元测试安装及使用)
PHPUnit簡介及使用(thinkphp5的單元測試安裝及使用)
一、總結(jié)
一句話總結(jié):直接google這個phpunit(how to use phpunit),然后去官網(wǎng)看使用樣例和手冊,那些英文和內(nèi)容以看懂的,不要有抵觸情緒
官網(wǎng)地址:https://phpunit.de/getting-started-with-phpunit.html
?
1、為什么要用PHPUnit?
測試性能
1、可以通過命令操控測試腳本
2、可以測試性能
3、可以測試代碼覆蓋率
4、可以自動化的更新測試用例的參數(shù)數(shù)據(jù)
5、各種格式的日志
?
2、官方phpunit使用實(shí)例?
Code
src/Email.php
<?php final class Email {private $email;private function __construct($email){$this->ensureIsValidEmail($email);$this->email = $email;}public static function fromString($email){return new self($email);}public function __toString(){return $this->email;}private function ensureIsValidEmail($email){if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {throw new InvalidArgumentException(sprintf('"%s" is not a valid email address',$email));}} }?
Test Code
tests/EmailTest.php
<?php use PHPUnit\Framework\TestCase;final class EmailTest extends TestCase {public function testCanBeCreatedFromValidEmailAddress(){$this->assertInstanceOf(Email::class,Email::fromString('user@example.com'));}public function testCannotBeCreatedFromInvalidEmailAddress(){$this->expectException(InvalidArgumentException::class);Email::fromString('invalid');}public function testCanBeUsedAsString(){$this->assertEquals('user@example.com',Email::fromString('user@example.com'));} }?
?
3、單元測試的特點(diǎn)(比如phpunit,java的junit)?
文件夾
test
測試函數(shù)
a、測試的代碼是在test文件夾下的,和源碼不是在同一個文件夾下
b、測試的類或者方法都加有test字樣
c、有一些常用的測試函數(shù),比如:
assertTrue 為判斷是否真
assertFalse 為判斷是否假
assertGreaterThan為判斷是否大于
assertLessThanOrEqual判斷是否小于或等于
assertEquals為判斷是否相等
?
?
4、thinkphp如何添加單元測試?
手冊 雜項(xiàng)
thinkphp的開發(fā)手冊的雜項(xiàng)里面有教怎么使用單元測試,
thinkphp5的單元測試也是用的phpunit,這張圖可以說明
所以關(guān)于單元測試的具體方法可以去phpunit官方文檔里面看
?
5、thinkphp的單元測試如何運(yùn)行?
命令行
我們可以直接在命令行下面運(yùn)行單元測試
?
?
6、thinkphp是否安裝單元測試的依據(jù)是什么?
tests文件夾
看tp的根目錄下是否有tests文件夾
?
7、thinkphp單元測試手冊?
在開發(fā)手冊的評論下找到的
快速入門 · thinkphp單元測試手冊|thinkphp 單元測試|thinkphp 測試 · 看云
https://www.kancloud.cn/code7/tpunit/220874
?
?
二、PHPUnit簡介及使用
一、PHPUnit是什么?
1、它是一款輕量級的PHP測試框架,地址:http://www.phpunit.cn
2、手冊:http://www.phpunit.cn/manual/5.7/zh_cn/installation.html
二、為什么要用PHPUnit?
1、可以通過命令操控測試腳本
2、可以測試性能
3、可以測試代碼覆蓋率
4、可以自動化的更新測試用例的參數(shù)數(shù)據(jù)
5、各種格式的日志
三、PHPUnit使用規(guī)則
1、?一般被測試類的后面加上”Test”,比如要測試的類為Array,則測試用例的命名為ArrayTest。
2、測試類ArrayTest繼承于PHPUnit_Framework_TestCase
3、測試方法必須為public權(quán)限,都是test開頭,或者你也可以選擇給其加注釋@test來表明該函數(shù)為測試函數(shù)
4、通過斷言方法來對實(shí)際值和預(yù)期值進(jìn)行斷言,斷言方法可以參照手冊:http://www.phpunit.cn/manual/5.7/zh_cn/appendixes.assertions.html
?
快速入門:
| class ArrayTest extends PHPUnit_Framework_TestCase? //測試用例運(yùn)行后執(zhí)行 // 斷言數(shù)組$fixture中元素的數(shù)目是0。 } |
命令行啟動測試用例:
phpunit ?測試文件名,此處為要測試ArrayTest.php文件
| phpunit ArrayTest.php PHPUnit 5.7.5 by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: 138 ms, Memory: 3.25MB OK (2 tests, 4 assertions) |
記錄測試日志:
日志多種格式:http://www.phpunit.cn/manual/5.7/zh_cn/textui.html#textui.clioptions
| phpunit ArrayTest.php?--log-tap log.txt TAP version 13ok 1 - ArrayTest::testArrayIsEmpty ok 2 - ArrayTest::testarrayHasKey 1..2 |
四、PHPUnit測試代碼覆蓋率
可以參考:http://www.phpunit.cn/manual/current/zh_cn/code-coverage-analysis.html
可以通過配置phpunit.xml設(shè)置需要測試的代碼路徑或文件
例如:phpunit.xml的配置(放在項(xiàng)目根目錄)
1、通過生成html頁面查看代碼覆蓋率
通過執(zhí)行命令:phpunit --coverage-html ./coverage ./src/test
命令解釋:
- --coverage-html:生成覆蓋率結(jié)果的html
- coverage:html生成目錄,可以重新定義
- ./src/test:測試用例目錄(也可以是單個測試用例文件)
覆蓋率結(jié)果:
可以看到目錄里每個文件的覆蓋率:
還可以清晰的看到每一個文件代碼覆蓋率:
2、通過生成的text文件查看代碼覆蓋率
通過執(zhí)行命令:phpunit?--coverage-text ./src/test > test.log
命令解釋:
- --coverage-html:生成覆蓋率結(jié)果的text
- ./src/test:測試用例目錄(也可以是單個測試用例文件)
- > test.log:存放覆蓋率結(jié)果的文件(文件名稱自己定義)
覆蓋率結(jié)果:
可以清晰的看到總覆蓋率和每個文件的覆蓋率。
覆蓋率計(jì)算問題:
1、類:只有類中所有代碼都執(zhí)行了,覆蓋率才為100%;
2、方法:類中的方法每一行都執(zhí)行了,覆蓋率才算100%。例如:類中有5個方法,有兩個方法每一行執(zhí)行了,覆蓋率為:40%;
3、行:每一行代碼都執(zhí)行了就是100%;
?
參考:PHPUnit簡介及使用 - 浮.塵 - 博客園
https://www.cnblogs.com/kccdzz/p/6763735.html
?
?
三、第一次用 PHPUnit 寫測試就上手
一、什么是測試?測試的重要性?
開發(fā)者在撰寫程式的時候,程式不大可能會沒有問題,所以通常就需要驗(yàn)證程式的執(zhí)行是不是符合預(yù)期。測試程式能用來驗(yàn)證程式程式的運(yùn)作是不是正常的,并發(fā)現(xiàn)程式中的錯誤,以增加軟體品質(zhì)。
下面是一個活動報(bào)名的系統(tǒng):
這一個活動報(bào)名系統(tǒng)主要提供使用者報(bào)名活動,在報(bào)名活動內(nèi)還有一些子功能,像是「限制活動報(bào)名人數(shù)」,如果是這一個子功能,該如何測試呢?
直覺想到可能就需要有 20 個以上的使用者,然后讓這個些使用者分別來報(bào)名活動,如果沒超過限制的人數(shù),使用者就能繼續(xù)報(bào)名,反之,超過了限制人數(shù)的話,使用者就無法繼續(xù)報(bào)名了。說到這里,會覺得這是什么測試!
先分析一下,照上面的方法進(jìn)行測試會有什么問題:
1.測試案例一多,會花太多時間
這時候,如果再增加報(bào)名截止日期的測試,這樣又需要再對報(bào)名功能測試一次。
2.改了程式碼之后,需要再做一次測試
日后維護(hù)時,會需要再次修改程式碼,但是,改了程式碼之后,該如何驗(yàn)證修改后的程式運(yùn)作上是沒問題的?所以,可能又要再次從頭做一次測試。
3.與其他程式混在一起測試
要執(zhí)行報(bào)名功能的程式碼,要透過 view 的程式去呼叫。但是,這樣做測試的時候,如果測試失敗,就必須花時間去找出是報(bào)名的程式出問題,還是 view 程式。
那該如何解決這些問題呢?針對開發(fā)者來說,需要一個可以自動化、重復(fù)的、獨(dú)立的測試。
二、單元測試
單元測試是分別對程式的單元,例如:函式 (function)、方法 (method),進(jìn)行測試,測試時會判斷單元的執(zhí)行結(jié)果是不是有符合預(yù)期。
從上圖可以看到,撰寫了Event 類別提供了兩個方法,reserve()、unreserve(),也就是目標(biāo)程式。
接著透過 EventTest 的兩個測試案例,testReserve() 與 testUnreserve() 分別來對 Event 類別中的兩個類別方法執(zhí)行測試,測試的結(jié)果會在測試案例中驗(yàn)證,如果驗(yàn)證通過,表示測試就成功了!
單元測試能協(xié)助開發(fā)者什么?
1.確保單元的執(zhí)行結(jié)果
這一點(diǎn)蠻覺得就可以了解到,單元測試能協(xié)助驗(yàn)證目標(biāo)程式的執(zhí)行結(jié)果。
2.盡早發(fā)現(xiàn)程式中的錯誤
因?yàn)閱卧獪y試是在開發(fā)的時候就進(jìn)行的,所以能發(fā)現(xiàn)程式中存在的問題。
沒使用單元測試的時候,寫好了一份程式,但是,這份程式碼需要與其他程式碼整合才有辦法運(yùn)作。所以就需要等整個程式開發(fā)的差不多的時候,才能對程式進(jìn)行測試,在測試出現(xiàn)問題的時候,會花許多時間來厘清是那一份程式導(dǎo)致的問題。
如果使用單元測試,就能在寫好了一份程式之后進(jìn)行單元測試,而不用等到之后才對程式測試。
3.修改程式,更加有信心
程式寫好了,需要維護(hù)、修 bug,如果修改了程式碼后,能確定修改后的程式與之前的正常運(yùn)作是一樣的嗎?單元測試能協(xié)助修改程式后,對程式執(zhí)行測試,如果測試過了,表示程式的運(yùn)作是正常的,測試失敗的話,可能需要再回頭修改程式。
4.測試即文件
在撰寫測試的時候,會對單元所提供的功能進(jìn)行驗(yàn)證,所以,除了能透過程式來了解單元的運(yùn)作外,也能用所撰寫的單元測試來知道,被測試的單元有哪些運(yùn)作及功能。
在開發(fā)的時候,會撰寫一些文件來作為軟體的文件,在實(shí)際上,有時候那些文件并不一定會隨著程式變更而修改,到后來會變成之前所做的文件跟程式是不同步的。
因?yàn)?#xff0c;單元測試的程式會對目標(biāo)程式進(jìn)行驗(yàn)證,所以,測試能避免掉傳統(tǒng)文件所造成的程式與文件不同步的問題。
三、簡介 PHPUnit
PHPUnit 是 PHP 程式語言中最常見的單元測試 (unit testing) 框架,PHPUnit 是參考 xUnit 架構(gòu)利用 PHP 實(shí)作出來。
為什么要使用 PHPUnit 來測試呢?雖然,要做單元測試可以自己寫程式來測試, 但是 PHPUnit 提供了一些測試時常用的 library 及解決測試時會遇到問題的方法,所以我們會使用 PHPUnit 來做單元測試。
參考:第一次用 PHPUnit 寫測試就上手(上) - Anlior的博客 - CSDN博客
https://blog.csdn.net/Anlior/article/details/78627134?locationNum=7&fps=1
?
?
?
四、Tp5 單元測試
先安裝composer,如之前電腦環(huán)境有安裝composer可跳過1,2步驟
?
1.打開php.ini,找到;extension=php_openssl.dll,去掉前面的分號,保存并重啟Apache即可。
2.百度搜索安裝Composer-Setup.exe
3.打開Git Bash
4.
?
5.安裝完成后項(xiàng)目目錄會多出一個tests文件夾
6.
?
7.單元測試方法,模型
8.結(jié)果顯示返回正確情況
返回錯誤情況
測試函數(shù),更多測試請看幫助文檔
assertTrue 為判斷是否真
assertFalse 為判斷是否假
assertGreaterThan為判斷是否大于
assertLessThanOrEqual判斷是否小于或等于
assertEquals為判斷是否相等
tp5單元測試使用幫助文檔http://www.kancloud.cn/manual/thinkphp5/182511
?
參考:Tp5 單元測試 - liuxin_0725的專欄 - CSDN博客
https://blog.csdn.net/liuxin_0725/article/details/53215411
?
五、thinkphp5單元測試安裝及使用
1、安裝:命令行根目錄下運(yùn)行安裝代碼
這后面或許不應(yīng)該加 v1.0
?
擴(kuò)展里面的phpunit
?
安裝前后擴(kuò)展目錄vendor對比:
?
快速入門 · thinkphp單元測試手冊|thinkphp 單元測試|thinkphp 測試 · 看云
https://www.kancloud.cn/code7/tpunit/220874
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的PHPUnit简介及使用(thinkphp5的单元测试安装及使用)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快递鸟电子面单打印功能基于java
- 下一篇: 非常便捷的本地Mock