亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2019年03月08日 09:35:58   作者:big_cat  
這篇文章主要介紹了使用PHPUnit進行單元測試并生成代碼覆蓋率報告的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

安裝PHPUnit

使用 Composer 安裝 PHPUnit

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

使用Composer構建你的項目

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

創(chuàng)建項目結構

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

使用Composer構建工程

#一路回車即可
composer init

#注冊命名空間
vi composer.json
...
  "autoload": {
    "psr-4": {
      "App\\": "app/",
      "Tests\\": "tests/"
    }
  }
...
#更新命名空間
composer dump-autoload

#安裝 phpunit 組件庫
composer require --dev phpunit/phpunit

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

編寫測試用例

創(chuàng)建文件app/Example.php 這里我為節(jié)省排版就不寫注釋了

<?php
namespace 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;
  }
}

創(chuàng)建相應的測試文件tests/ExampleTest.php

<?php
namespace 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");
  }
}

執(zhí)行單元測試

[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.00MB

There was 1 failure:

1) Tests\ExampleTest::testGetMsg
Failed 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:148

FAILURES!
Tests: 3, Assertions: 3, Failures: 1.

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

代碼覆蓋率

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

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

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參數來設定我們需要檢測覆蓋率的業(yè)務代碼路徑,下面演示一下具體操作:

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

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

基境共享測試數據

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

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

即測試的執(zhí)行模式并不是

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

而是

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

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

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

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

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

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

#測試類基境構建
setUpBeforeClass

#new一個測試類對象
#第一個測試用例
setUp
assertPreConditions
assertPostConditions
tearDown

#new一個測試類對象
#第二個測試用例
setUp
assertPreConditions
assertPostConditions
tearDown
...

#測試類基境解構
tearDownAfterClass

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

<?php
namespace Tests;

use App\Example;
use PHPUnit\Framework\TestCase as BaseTestCase;

class ExampleTest extends BaseTestCase
{
  // 類靜態(tài)屬性
  private static $example;

  public static function setUpBeforeClass()
  {
    self::$example = new Example();
  }

  public function testGetTrue()
  {
    // 類的靜態(tài)屬性更新
    self::$example->setMsg("hello big_cat");
    $result = self::$example->getTrue();
    $this->assertTrue($result);
  }

  public function testGetFalse()
  {
    $result = self::$example->getFalse();
    $this->assertFalse($result);
  }

  /**
   * 依賴 testGetTrue 執(zhí)行完畢
   * @depends testGetTrue
   * @return [type] [description]
   */
  public function testGetMsg()
  {
    $result = self::$example->getMsg();
    $this->assertEquals($result, "hello big_cat");
  }
}

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

public function testMethod1()
{
  $this->assertTrue(true);
  return "hello";
}

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

testObj2 = new Test;
testObj2->testMethod2($str);

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

使用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 用于指定待執(zhí)行的測試類文件后綴-->
    <testsuite name="Tests">
      <directory suffix="Test.php">./test</directory>
    </testsuite>
  </testsuites>
  <filter>
    <whitelist processUncoveredFilesFromWhitelist="true">
      <!--可以定義多個 對./app下的業(yè)務代碼做覆蓋率統(tǒng)計-->
      <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.00MB

No tests executed!

Generating code coverage report in HTML format ... done

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

相關文章

  • php注冊和登錄界面的實現案例(推薦)

    php注冊和登錄界面的實現案例(推薦)

    下面小編就為大家?guī)硪黄猵hp注冊和登錄界面的實現案例(推薦)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • PHP實現兩種排課方式

    PHP實現兩種排課方式

    這篇文章主要介紹了PHP實現兩種排課方式,第一種排課方式比較好理解,開始時間和結束時間,第二種比較復雜一些,有開始上課時間和結束上課時間和第幾周,具體實現代碼參考下本文
    2021-06-06
  • PHP實現采集中國天氣網未來7天天氣

    PHP實現采集中國天氣網未來7天天氣

    這篇文章主要介紹了PHP實現采集中國天氣網未來7天天氣方法,本文詳細的講解了需求的實現,也可以做為學習PHP采集的入門教程,需要的朋友可以參考下
    2014-10-10
  • 在WordPress的文章編輯器中設置默認內容的方法

    在WordPress的文章編輯器中設置默認內容的方法

    這篇文章主要介紹了在WordPress的文章編輯器中設置默認內容的方法,包括給不同類型的文章設置不同內容的具體方法,需要的朋友可以參考下
    2015-12-12
  • php等比例縮放圖片及剪切圖片代碼分享

    php等比例縮放圖片及剪切圖片代碼分享

    這篇文章給大家分享的是使用php實現的等比例縮放圖片及剪切圖片的代碼,非常的簡單實用,附上用法,有需要的小伙伴可以參考下。
    2016-02-02
  • PHP獲取當前時間的5種實現方式

    PHP獲取當前時間的5種實現方式

    這篇文章主要介紹了PHP獲取當前時間的5種實現方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • PHP list() 將數組中的值賦給變量的簡單實例

    PHP list() 將數組中的值賦給變量的簡單實例

    下面小編就為大家?guī)硪黄狿HP list() 將數組中的值賦給變量的簡單實例。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • laravel 判斷查詢數據庫返回值的例子

    laravel 判斷查詢數據庫返回值的例子

    今天小編就為大家分享一篇laravel 判斷查詢數據庫返回值的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • php二維數組排序與默認自然排序的方法介紹

    php二維數組排序與默認自然排序的方法介紹

    本篇文章介紹了,在php中二維數組排序與默認自然排序的方法。需要的朋友參考下
    2013-04-04
  • yii2使用ajax返回json的實現方法

    yii2使用ajax返回json的實現方法

    這篇文章主要介紹了yii2使用ajax返回json的實現方法,實例分析了Yii框架使用ajax調用數據及返回json格式數據的相關技巧,需要的朋友可以參考下
    2016-05-05

最新評論