何爲單元測試:php
指對軟件中的基本單元進行測試,如函數、方法等,以檢查其返回值或行爲是否符合預期;實際中軟件是很複雜的,由許多組件構成,執行流程連貫在一塊兒,要進行單元片斷的測試,就須要爲其提供執行上下文(或者說參數)和環境(好比打樁模擬一些對象)來運行,並監控其行爲和返回值,爲此咱們就須要寫出作這件事情的程序代碼,這樣的代碼叫作測試用例,許多測試用例有機結合在一塊兒造成一個總體的測試,又叫作測試套件,被測試的程序代碼叫作生產代碼。phpunit這個軟件就是用來幫助咱們寫測試用例並進行測試的。html
php的單元測試:phpunitbootstrap
在其官網有詳細教程,這裏介紹一些補充內容。
首先要明白phpunit軟件自己就是由php語言實現,其使用是經過命令行進行的,並非經過瀏覽器訪問
明白這一點很重要,許多新人被卡在這裏。很基礎也很簡單,但彷佛沒怎麼被說起數組
想試一下單元測試好久了,可是一直沒有合適的項目,並且中文網絡上的PHPUnit教程要麼太舊,要麼太亂,因此總也沒學會。最近準備把手頭的項目重構一下,決定開始使用PHPUnit作單元測試,先照着PHPUnit的官網作了一下Tutorial,雖然已經很簡單了,仍然被卡住幾回,因此寫篇文章記錄一下。由於對PHP的包管理系統不熟悉,這篇文章會從安裝開始。瀏覽器
PHPUnit若是使用PHAR安裝的話很簡單。Phar歸檔就像Java的Jar,能夠直接被PHP解釋器執行。在*nix系統下,能夠執行下面三條命令:bash
➜ wget ➜ chmod +x phpunit.phar ➜ sudo mv phpunit.phar /usr/local/bin/phpunit
考慮到此次的重構會引入比較多類庫,我選擇了Composer作依賴管理。我在Windows上試過PhpStorm裏的Composer,老是失敗,感受是網絡很差的緣由。此次在Ubuntu下安裝很順利,全局安裝Composer以後,在命令行執行網絡
composer global require phpunit/phpunit
全局安裝PHPUnit。而後在 ~/.bashrc
文件末尾加一行 PATH=$PATH:/home/feng/.composer/vendor/bin
(注意替換用戶名),來將Composer的global bin目錄加入PATH。composer
安裝事後運行 phpunit --version
看到版本信息則說明安裝成功。phpstorm
另外,裝完之後我發現Ubuntu系統可使用 apt-get install phpunit
來安裝,但我沒有試過。ide
在Windows下我用的是XAMPP環境,其中已經內置PHPUnit了。若是要在命令提示符下使用的話,能夠修改環境變量中的PATH,在裏面加上 C:\xampp\php
(或者你修改後的路徑)。再打開命令提示符,運行phpunit --version
看一下。
第一個Tutorial我使用的是PHPUnit官網上的Getting Started,這裏寫的比它還要簡單一點。
項目的目錄結構以下:
├── phpunit.xml ├── src │ ├── autoload.php │ └── Money.php └── tests └── MoneyTest.php
第一個文件是項目代碼src/Money.php
,內容以下:
amount = $amount; } public function getAmount() { return $this->amount; } public function negate() { return new Money(-1*$this->amount); } }
與之對應的單元測試是tests
目錄下的MoneyTest.php
,注意單元測試文件名最好是*Test.php
,這樣之後指定tests
目錄即可以執行目錄下的全部測試。
negate(); $this->assertEquals(-1, $b->getAmount()); } }
代碼很簡單,$this->assertEquals(-1, $b->getAmount());
即斷言後一個參數的執行結果與前一個參數相等,其餘不解釋了。
如今,若是在MoneyTest.php
里加一行include_once('../src/Money.php');
。而後在項目根目錄下執行phpunit tests/MoneyTest
,就能夠看到執行結果了。
可是,逐個添加include的方式太不方便,最好是能自動include所需的文件,PHPUnit提供了一個參數--bootstrap
,可使用項目的autoload文件。這裏我本身寫了一個最簡單的autoload.php
,只要4行。這個文件並非PHPUnit專用的,應該放在src目錄下。
<?php function __autoload($class){ include $class.'.php'; } spl_autoload_register('__autoload');
當須要Money
類時,就去include Money.php
。寫完__autoload()
函數以後要用spl_autoload_register()
註冊上。
如今就能夠去掉MoneyTest.php
中的include
語句,使用phpunit --bootstrap src/autoload.php tests/MoneyTest
來執行測試了。
雖然能夠自動載入,可是要執行的命令更長了。咱們還能夠寫一個配置文件來爲項目指定bootstrap,這樣就不用每次都寫在命令裏了。
配置文件phpunit.xml
放在項目根目錄下。
若是要執行MoneyTest,在項目根目錄下執行:phpunit tests/MoneyTest
若是要執行tests目錄下的全部測試,在項目根目錄下執行:phpunit tests
你可能會疑惑,上面的php代碼是怎麼回事呢?
那就是一個測試用例,簡單的測試了一個數組操做,進行單元測試通常經過如下四步:
1. 針對生產代碼類 Class 的測試寫在類 ClassTest中。
2. ClassTest(一般)繼承自 PHPUnit\Framework\TestCase。
3. 測試都是命名爲 test* 的公用方法。也能夠在方法的文檔註釋塊(docblock)中使用 @test 標註將其標記爲測試方法。
4. 在測試方法內,相似於 assertEquals()這樣的斷言方法用來對實際值與預期值的匹配作出斷言判斷。
這裏你可能會有幾個地方迷惑:
一、在註釋塊中使用的標註,php能夠經過反射獲得,程序能夠利用獲得的信息進行配置
二、上列中測試用例代碼裏面的TestCase類來自哪裏?並無被加載啊?
上文提到phpunit自己是用php語言寫成的,打包成了phar供使用,phar是可執行的,執行時首先執行包裏面的存根文件stub
你能夠按照上文雲客的另一篇phar帖子介紹的方法提取還原phpunit.phar包,或者使用phpstorm這樣的ide直接打開
在.phar/stub.php裏你將看到存根代碼,TestCase類就是在存根代碼裏面require的
「phpunit yunke」這條命令行代碼將首先運行phpunit腳本,從存根文件開始執行,而後由phpunit加載測試用例代碼
能夠看出程序並非從測試用例腳本開始執行的,如今明白TestCase類哪裏來的了吧
經過以上內容再配合官網文檔,新手應該能夠順利入門了