項目代碼常常修改,每每修改一下地方後,其它地方可能相應地也須要做一些修改,但經常被忽視了,從而常常出現各類小 bug,怎樣減小這類錯誤? 一種是使用強類型,能夠發現一些簡單的錯誤;另外一個就是使用單元測試,固然返回結果不符合預期時意味着代碼可能有 bug .php
每一個公共函數或接口的返回值有固定的數據類型與結構,經過判斷結果值是否符合預期來排除一些簡單的錯誤。 運行測試時,但願一條命令運行全部測試代碼,多是跨文件甚至是跨目錄。 phpunit 是一個可能實現單元測試經常使用須要的工具。html
單元測試不能解決全部問題,單元測試主要測試函數的返回值,而具體頁面的呈現是否正確,須要模仿瀏覽器行爲來進行測試,好比php-webdriver,chrome拓展程序等都是能夠考慮的方法。web
若是簡單粗暴地計算,只要是有測試的函數或方法就是覆蓋,那答案是能夠。 但每一個函數的全部可能都測試到? 這個應該是不可能的,否則,程序就永遠不會出 bug 了。 單元測試的目的是減小 bug ,而沒有人能保證程序絕對不會有 bug 。chrome
其中php5.6 對應 phpunit5.X 版本bootstrap
phpuint6.X 要求 php7.0以上windows
內容爲:瀏覽器
@ php %~dp0phpunit-5.7.9.phar %*
而後把該目錄添加到環境變量中,安裝完成 運行php7
phpunit -v
測試一下便可app
hahaTest.php 的基本內容能夠這樣寫:函數
<?php use PHPUnit\Framework\TestCase; require("./src/index.php"); class hahaTest extends TestCase{ //必須是public且方法名是test開頭的纔會參與測試,protected和private的測試時會提示錯誤 public function test_index(){ $index=new index();//index.php中的類 $re=$index->haha(); $this->assertEquals(1,$re);//測試 ./src/index.php 中的index類的haha方法返回值是否是1 } }
命令行運行:
phpunit hahaTest.php
/** //必須是文檔註釋,不能自動生成文檔註釋的要注意一下:第一行必定要兩個*號 * @depends test_haha 提供數據的函數的返回值做爲參數 */ public function test_hehe($re){ //$re 是 test_haha 的返回值,能夠在這個方法內使用 }
最好先建立一個基類:baseTest繼承自 TestCase類,文件名爲aaTest.php,寫aa是保證讓它最早被加載,加Test是由於不加的不會被加載運行。 aaTest.php 文件中能夠寫公共函數,須要公共引進的,一些前置的操做,而後其它測試類繼承這個類就能夠了
另外一種解決方案: 使用 phpunit.xml 文件,把啓動須要的內容寫到 base.php 文件,而後在 phpunit 的 bootstrap 屬於中引入該文件 執行 phpunit dir 時,若是沒有添加 -c phpunit.xml 的話,它會自動在當前目錄下查找phpunit.xml或phpunit.xml.dist文件,經過配製文件,能夠指定加載順序 在配置中引入了的文件會優先加載,而後會默認加載*Test.php文件
<?xml version="1.0" encoding="UTF-8"?> <phpunit bootstrap="./Index/baseTest.php"> <testsuites> <testsuite name="index"> <file>./Index/loginTest.php</file> //寫了的會優先加載 </testsuite> </testsuites> </phpunit>
<!-- 使用 phpunit.xml 配置文件,寫在testsuite 中的會優先加載,而且按寫的順序加載 -->
<!-- 目前的解決方法:繼承須要依賴的類,再重寫須要依賴的方法,直接經過parent:: 來調用,這樣就可使用 @depends 了 補充:這樣會有問題,繼承其它測試類,會沒被繼承的方法重複測試, 經測試後發現,直接使用 類名::方法名 是能夠添加到依賴的 -->
<!-- 運行時,添加 -v 參數,如: phpunit index -v -->