亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 使用PHPUnit進行單元測試并生成代碼覆蓋率報告的方法

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

熱門標簽:銀川ai電話機器人 浙江外呼電話系統(tǒng)軟件 電梯外呼線路板維修視頻 上海公司外呼系統(tǒng)線路 十堰ai電話機器人效果怎么樣 地圖標注風向標 芒果電銷機器人 安陽自動外呼系統(tǒng)價格是多少 臨沂智能電銷機器人軟件

安裝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手冊學習更多高級用法。

代碼覆蓋率

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

測試覆蓋率的檢測對象是我們的業(yè)務代碼,PHPUnit通過檢測我們編寫的測試用例調(diào)用了哪些函數(shù),哪些類,哪些方法,每一個控制流程是否都執(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參數(shù)來設定我們需要檢測覆蓋率的業(yè)務代碼路徑,下面演示一下具體操作:

phpunit \

--bootstrap vendor/autoload.php \

--coverage-html=reports/ \

--whitelist app/ \

tests/
#查看覆蓋率報告
cd reports/  php -S 0.0.0.0:8899

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

基境共享測試數(shù)據(jù)

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

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

即測試的執(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()//測試類構建/解構時調(diào)用
protected function setUp()/tearDown()//測試方法執(zhí)行前/后調(diào)用
protected function assertPreConditions()/assertPostConditions()//斷言前/后調(diào)用

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

#測試類基境構建
setUpBeforeClass

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

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

#測試類基境解構
tearDownAfterClass

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

?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í)行順序,并使用傳遞參數(shù)的方式來滿足需求。

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

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

您可能感興趣的文章:
  • PHPUnit 單元測試安裝與使用入門教程
  • ThinkPHP5與單元測試PHPUnit使用詳解
  • PHP單元測試配置與使用方法詳解
  • PHPUnit + Laravel單元測試常用技能
  • PHP使用phpunit進行單元測試示例
  • PHPStorm中如何對nodejs項目進行單元測試詳解
  • PHP單元測試框架PHPUnit用法詳解
  • thinkPHP框架單元測試庫tpunit用法示例
  • 淺談如何提高PHP代碼質(zhì)量之單元測試

標簽:吐魯番 常州 荊門 遵義 徐州 遂寧 武威 寧夏

巨人網(wǎng)絡通訊聲明:本文標題《使用PHPUnit進行單元測試并生成代碼覆蓋率報告的方法》,本文關鍵詞  使用,PHPUnit,進行,單元,測試,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《使用PHPUnit進行單元測試并生成代碼覆蓋率報告的方法》相關的同類信息!
  • 本頁收集關于使用PHPUnit進行單元測試并生成代碼覆蓋率報告的方法的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    久久成人综合网| 九九久久99| 日韩一级黄色片| 99久久网站| 国产伦精品一区二区三区无广告 | 日韩中文字幕在线观看视频| 尤物视频网站在线| 九九久久99| 亚飞与亚基在线观看| 欧美电影免费看大全| 成人a大片在线观看| 欧美激情在线精品video| 午夜家庭影院| 亚洲第一视频在线播放| 国产一区二区精品| 欧美一区二区三区在线观看| 99久久精品国产国产毛片| 久久精品欧美一区二区| 国产激情一区二区三区| 国产亚洲免费观看| 国产亚洲免费观看| 久久成人性色生活片| 99久久网站| 欧美一区二区三区性| 国产视频一区二区在线播放| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 成人免费观看视频| 成人高清视频免费观看| 999久久久免费精品国产牛牛| 国产一区精品| 日韩中文字幕一区| 欧美电影免费| 国产精品123| 精品视频免费在线| 亚洲精品影院一区二区| 免费国产在线观看| 精品久久久久久中文字幕2017| 国产亚洲免费观看| 毛片的网站| 毛片高清| 九九久久国产精品大片| 日本特黄特色aaa大片免费| 91麻豆高清国产在线播放| 久久精品免视看国产明星| 尤物视频网站在线| 国产精品123| 成人av在线播放| 国产亚洲精品成人a在线| 欧美国产日韩久久久| 国产91丝袜在线播放0| 日韩专区第一页| 欧美a免费| 日日爽天天| 一级女性大黄生活片免费| 国产一级强片在线观看| 国产精品免费精品自在线观看| 国产伦久视频免费观看视频| 亚飞与亚基在线观看| 精品在线观看国产| 国产麻豆精品| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日韩欧美一二三区| 日本伦理片网站| 久久成人性色生活片| 成人免费观看视频| 免费的黄色小视频| 99色视频在线| 999精品在线| 国产伦精品一区三区视频| 韩国三级香港三级日本三级la | 精品视频免费看| 99色视频| 久久成人综合网| 免费一级片在线观看| 日本在线播放一区| 韩国毛片免费| 久久精品大片| 成人av在线播放| 免费的黄色小视频| 国产麻豆精品hdvideoss| 成人在激情在线视频| 国产网站免费观看| 美国一区二区三区| 午夜在线亚洲男人午在线| 成人高清视频在线观看| 黄视频网站在线看| 亚洲wwwwww| 久久国产精品只做精品| 一级毛片看真人在线视频| 99色视频在线观看| 日本特黄特色aaa大片免费| 国产视频一区二区在线观看| 99久久精品国产免费| 国产伦理精品| 九九免费精品视频| 国产欧美精品| 欧美日本免费| 精品国产香蕉伊思人在线又爽又黄| 99热视热频这里只有精品| 久久国产精品自由自在| 国产一级生活片| 99色播| 欧美爱色| 久久精品道一区二区三区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 欧美大片a一级毛片视频| 日韩专区第一页| 欧美1区| 精品毛片视频| 日本在线播放一区| 久久福利影视| 香蕉视频久久| 精品国产一区二区三区久久久蜜臀 | 成人在激情在线视频| 韩国毛片基地| 色综合久久天天综合绕观看| 亚洲精品中文字幕久久久久久| 欧美电影免费| 国产网站免费观看| 日韩在线观看视频免费| 一本高清在线| 国产伦精品一区二区三区在线观看 | 二级片在线观看| 天天做人人爱夜夜爽2020毛片| 九九九国产| 中文字幕一区二区三区 精品| 国产激情一区二区三区| 午夜精品国产自在现线拍| 国产国产人免费视频成69堂| 精品视频在线观看免费| 九九久久国产精品大片| 久久精品免视看国产成人2021| 免费的黄色小视频| 国产一级强片在线观看| 成人影院一区二区三区| 成人免费观看网欧美片| 久久精品大片| 黄视频网站在线看| 91麻豆高清国产在线播放| 一 级 黄 中国色 片| 二级片在线观看| 国产网站在线| 国产视频久久久| 91麻豆精品国产高清在线| 九九久久国产精品大片| 久久99中文字幕| 高清一级淫片a级中文字幕| 色综合久久天天综合| 国产韩国精品一区二区三区| 国产网站免费观看| 久久精品道一区二区三区| 精品毛片视频| 九九久久99| 久久久久久久免费视频| 欧美激情一区二区三区在线| 色综合久久天天综合| 一级女性全黄久久生活片| 99久久精品费精品国产一区二区| 欧美电影免费看大全| 精品国产一区二区三区国产馆| 91麻豆精品国产综合久久久| 欧美激情影院| 91麻豆精品国产自产在线| 国产麻豆精品hdvideoss| 99久久精品费精品国产一区二区| 四虎影视久久久免费| 成人免费网站视频ww| 亚洲女人国产香蕉久久精品| 欧美激情一区二区三区在线| 国产一区二区精品久久| 国产伦精品一区二区三区在线观看 | 麻豆系列 在线视频| 久久福利影视| 久久精品免视看国产成人2021| 久久国产精品自线拍免费| 日韩一级黄色| 色综合久久天天综合观看| 人人干人人插| 精品视频在线观看免费| 亚洲wwwwww| 国产视频一区二区在线播放| a级精品九九九大片免费看| 成人免费观看男女羞羞视频| 欧美激情在线精品video| 国产成人精品综合| 欧美电影免费看大全| 精品视频免费看| 一级女性全黄生活片免费| 成人免费高清视频| 999精品在线| 国产一区二区精品| 黄色福利| 亚洲第一页乱| 国产麻豆精品免费密入口| 九九干| 国产视频久久久| 亚洲精品久久玖玖玖玖| 99色视频在线观看| 国产不卡在线看| 99色视频在线观看|