使用PHPUnit进行单元测试并生成代码覆盖率报告的方法

安装PHPUnit

使用 Composer 安装 PHPUnit

  #查看composer的全局bin目录 将其加入系统 path 路径 方便后续直接运行安装的命令  composer global config bin-dir --absolute  #全局安装 phpunit  composer 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 这里我为节省排版就不写注释了

使用PHPUnit进行单元测试并生成代码覆盖率报告的方法

这样我们就对业务代码AppExample做单元测试,并且获得我们单元测试的代码覆盖率,现在自然是百分之百,因为我的测试用例已经访问了AppExample的所有方法,没有遗漏的,开发中则能体现出你的测试时用力对业务代码测试度的完善性。

基境共享测试数据

可能你会发现我们在每个测试方法中都创建了AppExample对象,在一些场景下是重复劳动,为什么不能只创建一次然后供其他测试方法访问呢?这需要理解 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一个测试类对象  #第一个测试用例  setUp  assertPreConditions  assertPostConditions  tearDown    #new一个测试类对象  #第二个测试用例  setUp  assertPreConditions  assertPostConditions  tearDown  ...    #测试类基境解构  tearDownAfterClass

所以我们可以在测试类构建时使用setUpBeforeClass创建一个 AppExample 对象作为测试类的静态成员变量(tearDownAfterClass主要用于一些资源清理,比如关闭文件,数据库连接),然后让每一个测试方法用例使用它:

                            ./test                                    ./app                    

然后直接运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

以上就是本文的全部内容。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论