国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

使用PHPUnit進行單元測試并生成代碼覆蓋率報告的方法

2024-05-05 00:07:15
字體:
來源:轉載
供稿:網友

安裝PHPUnit

使用 Composer 安裝 PHPUnit

#查看composer的全局bin目錄 將其加入系統 path 路徑 方便后續直接運行安裝的命令composer global config bin-dir --absolute#全局安裝 phpunitcomposer global require --dev phpunit/phpunit#查看版本phpunit --version

使用Composer構建你的項目

我們將新建一個unit項目用于演示單元測試的基本工作流

創建項目結構

mkdir unit && cd unit && mkdir app tests reports#結構如下./├── app #存放業務代碼├── reports #存放覆蓋率報告└── tests #存放單元測試

使用Composer構建工程

#一路回車即可composer init#注冊命名空間vi composer.json...  "autoload": {    "psr-4": {      "App//": "app/",      "Tests//": "tests/"    }  }...#更新命名空間composer dump-autoload#安裝 phpunit 組件庫composer require --dev phpunit/phpunit

到此我們就完成項目框架的構建,下面開始寫業務和測試用例。

編寫測試用例

創建文件app/Example.php 這里我為節省排版就不寫注釋了

<?phpnamespace App;class Example{  private $msg = "hello world";  public function getTrue()  {    return true;  }  public function getFalse()  {    return false;  }  public function setMsg($value)  {    $this->msg = $value;  }  public function getMsg()  {    return $this->msg;  }}

創建相應的測試文件tests/ExampleTest.php

<?phpnamespace Tests;use PHPUnit/Framework/TestCase as BaseTestCase;use App/Example;class ExampleTest extends BaseTestCase{  public function testGetTrue()  {    $example = new Example();    $result = $example->getTrue();    $this->assertTrue($result);  }    public function testGetFalse()  {    $example = new Example();    $result = $example->getFalse();    $this->assertFalse($result);  }    public function testGetMsg()  {    $example = new Example();    $result = $example->getTrue();    // $result is world not big_cat    $this->assertEquals($result, "hello big_cat");  }}

執行單元測試

[root@localhost unit]# phpunit --bootstrap=vendor/autoload.php /tests/PHPUnit 6.5.14 by Sebastian Bergmann and contributors...F                                 3 / 3 (100%)Time: 61 ms, Memory: 4.00MBThere was 1 failure:1) Tests/ExampleTest::testGetMsgFailed asserting that 'hello big_cat' matches expected true./opt/unit/tests/ExampleTest.php:27/root/.config/composer/vendor/phpunit/phpunit/src/TextUI/Command.php:195/root/.config/composer/vendor/phpunit/phpunit/src/TextUI/Command.php:148FAILURES!Tests: 3, Assertions: 3, Failures: 1.

這是一個非常簡單的測試用例類,可以看到,執行了共3個測試用例,共3個斷言,共1個失敗,可以參照PHPUnit手冊學習更多高級用法。

代碼覆蓋率

代碼覆蓋率反應的是測試用例測試對象行,函數/方法,類/特質的訪問率是多少(PHP_CodeCoverage 尚不支持 Opcode覆蓋率、分支覆蓋率 及 路徑覆蓋率),雖然有很多人認為過分看重覆蓋率是不對的,但我們初入測試還是俗氣的追求一下吧。

測試覆蓋率的檢測對象是我們的業務代碼,PHPUnit通過檢測我們編寫的測試用例調用了哪些函數,哪些類,哪些方法,每一個控制流程是否都執行了一遍來計算覆蓋率。

PHPUnit 的覆蓋率依賴 Xdebug,可以生成多種格式:

--coverage-clover <file>  Generate code coverage report in Clover XML format.--coverage-crap4j <file>  Generate code coverage report in Crap4J XML format.--coverage-html <dir>    Generate code coverage report in HTML format.--coverage-php <file>    Export PHP_CodeCoverage object to file.--coverage-text=<file>   Generate code coverage report in text format.--coverage-xml <dir>    Generate code coverage report in PHPUnit XML format.

同時需要使用 --whitelist dir參數來設定我們需要檢測覆蓋率的業務代碼路徑,下面演示一下具體操作:

phpunit /--bootstrap vendor/autoload.php /--coverage-html=reports/ /--whitelist app/ /tests/#查看覆蓋率報告cd reports/ && php -S 0.0.0.0:8899

PHPUnit,單元測試,代碼

PHPUnit,單元測試,代碼

這樣我們就對業務代碼App/Example做單元測試,并且獲得我們單元測試的代碼覆蓋率,現在自然是百分之百,因為我的測試用例已經訪問了App/Example的所有方法,沒有遺漏的,開發中則能體現出你的測試時用力對業務代碼測試度的完善性。

基境共享測試數據

可能你會發現我們在每個測試方法中都創建了App/Example對象,在一些場景下是重復勞動,為什么不能只創建一次然后供其他測試方法訪問呢?這需要理解 PHPUnit 執行測試用例的工作流程。

我們沒有辦法在不同的測試方法中通過某成員屬性來傳遞數據,因為每個測試方法的執行都是新建一個測試類對象,然后調用相應的測試方法

即測試的執行模式并不是

testObj = new ExampleTest();testObj->testMethod1();testObj->testMethod2();

而是

testObj1 = new ExampleTest();testObj1->testMethod1();testObj2 = new ExampleTest();testObj2->testMethod2();

所以testMethod1()修改的屬性狀態無法傳遞給 testMethod2()使用。

PHPUnit則為我們提供了全面的hook接口:

public static function setUpBeforeClass()/tearDownAfterClass()//測試類構建/解構時調用protected function setUp()/tearDown()//測試方法執行前/后調用protected function assertPreConditions()/assertPostConditions()//斷言前/后調用

當運行測試時,每個測試類大致就是如下的執行步驟

#測試類基境構建setUpBeforeClass#new一個測試類對象#第一個測試用例setUpassertPreConditionsassertPostConditionstearDown#new一個測試類對象#第二個測試用例setUpassertPreConditionsassertPostConditionstearDown...#測試類基境解構tearDownAfterClass

所以我們可以在測試類構建時使用setUpBeforeClass創建一個 App/Example 對象作為測試類的靜態成員變量(tearDownAfterClass主要用于一些資源清理,比如關閉文件,數據庫連接),然后讓每一個測試方法用例使用它:

<?phpnamespace Tests;use App/Example;use PHPUnit/Framework/TestCase as BaseTestCase;class ExampleTest extends BaseTestCase{  // 類靜態屬性  private static $example;  public static function setUpBeforeClass()  {    self::$example = new Example();  }  public function testGetTrue()  {    // 類的靜態屬性更新    self::$example->setMsg("hello big_cat");    $result = self::$example->getTrue();    $this->assertTrue($result);  }  public function testGetFalse()  {    $result = self::$example->getFalse();    $this->assertFalse($result);  }  /**   * 依賴 testGetTrue 執行完畢   * @depends testGetTrue   * @return [type] [description]   */  public function testGetMsg()  {    $result = self::$example->getMsg();    $this->assertEquals($result, "hello big_cat");  }}

或者使用@depends注解來聲明二者的執行順序,并使用傳遞參數的方式來滿足需求。

public function testMethod1(){  $this->assertTrue(true);  return "hello";}/** * @depends testMethod1 */public function testMethod2($str){  $this->assertEquals("hello", $str);}
#執行模式大概如下testObj1 = new Test;$str = testObj1->testMethod1();testObj2 = new Test;testObj2->testMethod2($str);

理解測試執行的模式還是很有幫助的,其他高級特性請瀏覽官方文檔

使用phpunit.xml編排測試套件

使用測試套件來管理測試,vi phpunit.xml

<?xml version="1.0" encoding="UTF-8"?><phpunit backupGlobals="false"     backupStaticAttributes="false"     bootstrap="./vendor/autoload.php"     colors="true"     convertErrorsToExceptions="true"     convertNoticesToExceptions="true"     convertWarningsToExceptions="true"     processIsolation="false"     stopOnFailure="false">  <testsuites>    <!--可以定義多個 suffix 用于指定待執行的測試類文件后綴-->    <testsuite name="Tests">      <directory suffix="Test.php">./test</directory>    </testsuite>  </testsuites>  <filter>    <whitelist processUncoveredFilesFromWhitelist="true">      <!--可以定義多個 對./app下的業務代碼做覆蓋率統計-->      <directory suffix=".php">./app</directory>    </whitelist>  </filter>  <logging>    <!--覆蓋率報告生成類型和輸出目錄 lowUpperBound低覆蓋率閾值 highLowerBound高覆蓋率閾值-->    <log type="coverage-html" target="./reports" lowUpperBound="35" highLowerBound="70"/>  </logging></phpunit>

然后直接運phpunit行即可:

[root@localhost unit]# phpunit PHPUnit 6.5.14 by Sebastian Bergmann and contributors.Time: 81 ms, Memory: 4.00MBNo tests executed!Generating code coverage report in HTML format ... done

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 攀枝花市| 亚东县| 砀山县| 祁门县| 独山县| 田阳县| 沐川县| 高安市| 南溪县| 元朗区| 环江| 奈曼旗| 莆田市| 洞口县| 克山县| 满洲里市| 温泉县| 绥中县| 城固县| 惠东县| 阿城市| 工布江达县| 华亭县| 德昌县| 江油市| 嘉兴市| 隆昌县| 邯郸县| 乌海市| 泊头市| 舒城县| 扎鲁特旗| 班玛县| 衡阳县| 嵊州市| 惠州市| 清水河县| 江山市| 广宗县| 吴忠市| 车致|