成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 使用PHPUnit進(jìn)行單元測試并生成代碼覆蓋率報(bào)告的方法

使用PHPUnit進(jìn)行單元測試并生成代碼覆蓋率報(bào)告的方法

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

安裝PHPUnit

使用 Composer 安裝 PHPUnit

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

使用Composer構(gòu)建你的項(xiàng)目

我們將新建一個(gè)unit項(xiàng)目用于演示單元測試的基本工作流

創(chuàng)建項(xiàng)目結(jié)構(gòu)

mkdir unit  cd unit  mkdir app tests reports
#結(jié)構(gòu)如下
./
├── app #存放業(yè)務(wù)代碼
├── reports #存放覆蓋率報(bào)告
└── tests #存放單元測試

使用Composer構(gòu)建工程

#一路回車即可
composer init

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

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

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

編寫測試用例

創(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)建相應(yī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.

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

代碼覆蓋率

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

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

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.

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

phpunit \

--bootstrap vendor/autoload.php \

--coverage-html=reports/ \

--whitelist app/ \

tests/
#查看覆蓋率報(bào)告
cd reports/  php -S 0.0.0.0:8899

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

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

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

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

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

當(dāng)運(yùn)行測試時(shí),每個(gè)測試類大致就是如下的執(zhí)行步驟

#測試類基境構(gòu)建
setUpBeforeClass

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

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

#測試類基境解構(gòu)
tearDownAfterClass

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

?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>
    !--可以定義多個(gè) suffix 用于指定待執(zhí)行的測試類文件后綴-->
    testsuite name="Tests">
      directory suffix="Test.php">./test/directory>
    /testsuite>
  /testsuites>
  filter>
    whitelist processUncoveredFilesFromWhitelist="true">
      !--可以定義多個(gè) 對./app下的業(yè)務(wù)代碼做覆蓋率統(tǒng)計(jì)-->
      directory suffix=".php">./app/directory>
    /whitelist>
  /filter>
  logging>
    !--覆蓋率報(bào)告生成類型和輸出目錄 lowUpperBound低覆蓋率閾值 highLowerBound高覆蓋率閾值-->
    log type="coverage-html" target="./reports" lowUpperBound="35" highLowerBound="70"/>
  /logging>
/phpunit>

然后直接運(yùn)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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

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

標(biāo)簽:吐魯番 常州 荊門 遵義 徐州 遂寧 武威 寧夏

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《使用PHPUnit進(jìn)行單元測試并生成代碼覆蓋率報(bào)告的方法》,本文關(guān)鍵詞  使用,PHPUnit,進(jìn)行,單元,測試,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《使用PHPUnit進(jìn)行單元測試并生成代碼覆蓋率報(bào)告的方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于使用PHPUnit進(jìn)行單元測試并生成代碼覆蓋率報(bào)告的方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    亚洲日本伦理| 午夜精品一区二| 日本一本a高清免费不卡| 五月综合激情婷婷六月色窝| 成人情视频高清免费观看电影| 欧美大片aaaa| 久久99精品久久久久子伦| 韩国视频一区| 妞干网在线视频| 51精品秘密在线观看| 国产精品一区二区免费在线观看| 无码精品视频一区二区三区| 在线一区二区日韩| 久草视频在线免费| 人人妻人人澡人人爽人人欧美一区| 不卡一二三区首页| 欧美黑白配在线| 成人性生交大片免费看视频在线| 91亚洲午夜精品久久久久久| 2019国产精品自在线拍国产不卡| 欧美一级黄色带| 三上悠亚ssⅰn939无码播放| 最新av番号| 国产精品久久久久婷婷二区次| 日本少妇吞精囗交| 欧美精品国产白浆久久久久| 国产成人一区二区在线| 欧美理论影院| 欧美成aaa人片免费看| 免费一区二区三区在在线视频| 国产亚洲一区字幕| 欧美性一级生活| 国产精品自在自线| 9i精品一二三区| 亚洲永久在线| 97精品资源在线观看| 91麻豆精品久久久久蜜臀| 亚洲欧美三级在线| 亚洲人成电影网站色www| 午夜a成v人精品| 无人日本免费视频| 亚洲精品无码久久久久久| 97蜜桃久久| 色爱综合av| 深夜福利av你懂的| 日韩不卡在线播放| 欧美丰满老妇熟乱xxxxyyy| 欧美黑人巨大xxxx猛交| 午夜在线电影亚洲一区| 久草中文在线观看| 深夜免费福利视频| 久久不射中文字幕| 深夜精品寂寞黄网站在线观看| 中文字幕 欧美日韩| 国产不卡一区| 天天操夜夜操很很操| 久久综合国产精品| 884aa四虎影成人精品一区| 国内自拍一区| 亚洲黄色录像| 天堂av在线免费| ass极品国模人体欣赏| 狠狠操视频网站| 青青视频免费在线观看| 久久五月天色综合| 欧美人与z0zoxxxx视频| 国产精品入口日韩视频大尺度| 亚洲第一在线播放| 97中文字幕在线观看| 国产91精品一区二区麻豆亚洲| 欧美在线视频导航| 三上悠亚在线观看视频| 色婷婷激情视频| 欧美大片国产精品| 国产女同一区二区| 日韩在线视频观看| 国产欧美日韩激情| 欧美精品国产精品日韩精品| 成人欧美一区二区三区在线湿哒哒| 黄页网址大全在线播放| 日本一区二区久久| 人妻少妇一区二区三区| 乱亲女秽乱长久久久| 成人高潮a毛片免费观看网站| 91九色国产ts另类人妖| 三上悠亚在线一区二区| 亚洲国产裸拍裸体视频在线观看乱了中文| 亚洲丝袜精品| 高清国产一区二区三区四区五区| 亚欧日韩另类中文欧美| 神马午夜一区二区| 三级性生活视频| 亚洲精华国产| 天堂视频免费在线观看| 岛国在线视频网站| 亚洲成人网在线播放| 男人的午夜天堂| 性xx色xx综合久久久xx| 成人av网站免费观看| yes4444视频在线观看| 蜜桃久久av一区| 久久国产成人午夜av影院| 国产免费黄色一级片| 亚洲美女久久| 久久精品久久久| 亚洲欧洲无码一区二区三区| 国产在线欧美日韩| 黄色综合网站| 亚洲一区二区| 激情小说综合网| 亚洲欧洲日韩综合| 涩涩视频网站| 粗暴蹂躏中文一区二区三区| 四虎成人精品| 激情小说网站亚洲综合网| 国产精品国模大尺度私拍| 天堂а√在线资源在线| 久久99精品久久久久久动态图| 亚洲裸色大胆大尺寸艺术写真| 香蕉久久一区| 99re热视频精品| 日韩女优av电影| 国产精品高清无码| 国产又爽又黄又嫩又猛又粗| 亚洲日本中文字幕在线| 日韩av网站在线播放| 在线观看天堂av| 久久99国产精品视频| 日韩电影免费网站| 欧美+亚洲+精品+三区| 亚洲欧美精品午睡沙发| 男人日女人下面视频| 国产激情视频在线看| 欧美精品一区二区三区在线看午夜| 欧美中文在线字幕| 亚洲三级久久久| 免费毛片b在线观看| 中文字幕亚洲日本岛国片| 成人亚洲性情网站www在线观看| 国产午夜亚洲精品一级在线| 日韩精品久久久久久久| 欧美一级在线看| 亚洲精品久久久久久| 九九久久久久久久久激情| 国产高潮流白浆| 在线中文字幕第一页| 久久亚洲黄色| 亚洲精品国产一区二区三区| 中文字幕一区二区视频| 国产精品久久久| 亚洲国产精品久久久久久6q| 婷婷久久综合九色国产成人| 精品欧美激情在线观看| 亚洲高清色图| 国产精品久久久国产盗摄| 在线观看成人免费视频| 一二三区精品| 国产精品久久久久久久电影| 制服诱惑一区二区| 欧美乱大交xxxxx| 亚洲欧美视频| 日本一区二区三区免费视频| 久久久久久欧美精品色一二三四| crdy在线观看欧美| 亚洲第一会所| 日韩一级片大全| 久久一区91| 国产福利电影一区二区三区| 日韩在线视频导航| 最新一本之道波多野结衣| 亚洲二区在线播放| 国产又粗又长又爽又黄的视频| 日韩午夜激情av| 俺去啦在线观看| 日韩专区一区二区| 日韩精品一区二区三区丰满| www.在线成人| 四虎影视在线播放| 北条麻妃国产九九精品视频| 成人在线手机视频| 不卡视频免费在线观看| 国产探花精品一区二区| 成人av电影免费| 麻豆中文一区二区| 在线观看日韩一区二区| 国产精品久久久久久av下载红粉| 亚洲一二三在线| 91亚洲精品丁香在线观看| 欧洲亚洲一区二区三区四区五区| 久久高清免费视频| 狠狠色噜噜狠狠色综合久| 蜜乳av一区二区三区| 综合综合综合综合综合网| 99久久国产综合精品女不卡| 国产精品蜜月aⅴ在线| 欧美va天堂| 黑人另类av| 日韩一级精品视频在线观看| 久久嫩草精品久久久久| 国产成人一区二区三区影院| 高清在线观看日韩| 国语自产精品视频在线看抢先版图片| 久本草在线中文字幕亚洲欧美| 欧美日韩免费区域视频在线观看| 国产精品成人无码| 一区二区三区在线观看免费视频| 55夜色66夜色国产精品视频| 激情五月婷婷六月| 欧美激情久久久久久久久久久| 视频一区国产视频| 国产欧美一区二区三区四区| 男人在线视频资源| 一区二区电影免费观看| 国产黄大片在线观看画质优化| 久久天天躁夜夜躁狠狠躁2022| 欧美日韩精品免费看| 亚洲精品在线网站| 成人羞羞在线观看网站| 欧美一级搡bbbb搡bbbb| 国产精品每日更新在线播放网址| 26uuu日韩精品一区二区| h精品动漫在线观看| 精品综合久久久久久8888| 日韩字幕在线观看| 91在线视频九色| 国产后进白嫩翘臀在线观看视频| xxx国产在线观看| 国产免费黄色大片| 国产色婷婷国产综合在线理论片a| 日韩av成人网| jizzjizzjizz亚洲女| 国产人妻大战黑人20p| 四虎1515hh.com| 久久久久久一区二区三区| 国产高清一区日本| 在线电影av不卡网址| 操操操日日日| 综合一区二区三区| av免费观看不卡| 日韩a级片在线观看| 欧美jizzhd精品欧美满| 国产精品白丝jk白祙| 国产精品成人无码| 欧美日韩一区二区三区在线电影| 亚洲成人av免费观看| 国内一区二区在线视频观看| 久久亚洲精品一区| av免费不卡国产观看| 精品卡一卡二| 在线观看视频91| 欧美一区二区三区……| 国产美女免费观看| 久久精品国产免费看久久精品| 国产欧美日韩专区| 欧美激情极品视频| 中文字幕乱码人妻综合二区三区| 国产在线一区二区三区欧美| 欧美乱妇20p| 青草伊人久久| 久久精品国产亚洲夜色av网站| 在线播放一区| 免费污片软件| 日韩av电影中文字幕| 天堂免费在线视频| 日韩成人在线网站| 夜夜嗨av一区二区三区中文字幕| 日韩精品久久久久久久电影99爱| 99在线|亚洲一区二区| 久久久久se| 日韩午夜电影网| 四虎在线免费视频| 欧美aaa大片视频一二区| 99精品国产高清在线观看| 1区2区3区在线| 极品国产人妖chinesets亚洲人妖| 肥熟一91porny丨九色丨| 91成人免费在线视频| 久热精品视频| 蜜桃在线视频| 日韩福利影院| 中文字幕在线观看一区二区| 美女视频一区二区三区在线| 日韩欧美第二区在线观看| 韩国精品久久久999| www.欧美视频| 亚洲欧美不卡| 国产视频一区二区在线播放| 精品深夜av无码一区二区老年| 欧美国产日韩激情| 99久久国产宗和精品1上映| 午夜小视频福利在线观看| 国产欧美日韩另类| 国产在线高清| 国产精品臀控福利在线观看| 在线看成人短视频| 成人做爽爽免费视频| 一二三在线视频| 亚洲人成网站777色婷婷| 999久久久国产999久久久| 一级在线观看| 中文字幕校园春色| 久久久久免费视频| 国产精品污www一区二区三区| 成年男人的天堂| 99精品一区| 欧洲av无码放荡人妇网站| 91在线精品播放| 国产成人a级片| 蜜桃精品久久久久久久免费影院| www..com日韩| 99久久久精品免费观看国产蜜| 国产精品久久视频| 日韩不卡在线播放| 天堂入口网站| 天天躁日日躁成人字幕aⅴ| 污视频在线观看免费| 欧洲av一区二区三区| 国产三级国产精品| 亚洲va综合va国产va中文| 九九热视频在线| 欧美久久久久免费| 日韩毛片精品高清免费| 亚洲免费在线看| jvid福利在线一区二区| 国产激情视频一区二区| 亚洲精品一区二区三区蜜桃下载| 国产成人精品一区二区三区四区| 欧美网站免费|