基于PHPunit的单元测试入门(二)

作者:掠影
最后编辑时间:2018-05-04 23:10:58
浏览次数:2100



接上文

上文链接:基于PHPunit的单元测试入门(一),本文主要讨论对于单元测试中其他情况的断言测试,以及关于测试覆盖率的一些情况。

异常测试

在实际使用中,常常需要手动抛出异常,以及一些异常情况的处理;于是在编写测试用例时,必然会涉及一些触发异常的情况,而在PHPUnit中,我们可以通过设置一个“断言异常”来对将要发生的异常进行测试。有以下几种方式:

  1. 注释声明
/**
 * @expectedException Exception
 */
public function testException(){
    throw new Exception("Exception existed");
}

这里采用了注释声明的形式,注释中的@expectedException实际上就是对异常的断言,而在实际测试函数·testException中,手动抛出了一个Exception对象,故而通过了测试。

        2. 函数中主动声明异常

public function testException(){
    $this->setExpectedException("Exception", "wrong", 400);
    throw new Exception("wrong123", 400);//成功
    throw new Exception("right", 400);//失败,且由于上一条语句已经异常,无法执行
    throw new Exception("wrong123", 300);//失败,同上
}
  • 首先,通过setExpectedException设置断言时,会对异常类名,异常消息,异常代码三者均进行判断,其中异常类名和异常代码两者需要完全相同,而断言异常消息,只需在抛出的异常消息中包含即可;
  • 如上述例子中,"wrong123"包含了"wrong", 故而第一条抛出的异常符合断言要求
  • 其次,与PHP正常流程相同,第一次遇到异常后就会中止运行并打印栈(不捕获的话),故而实际上,上述例子里的三个异常只有一条(第一条)是可以执行的,实际使用时也需要注意这一点

错误测试

与异常类似,只是在该版本中缺少直接断言错误的函数(注释声明有), 而是利用了PHP中自带的error_handler,将错误转用自定义的异常进行处理,例:

public function testError(){
        $this->setExpectedException("PHPUnit_Framework_Error");
        include "no_existed.php";// 试图包含一个不存在的文件
}
  • 测试错误时需要以Exception的形式,异常类型为PHPUnit_Framework_Error以及它的子类
    • 子类根据错误级别声明,如PHPUnit_Framework_Error_Warning,PHPUnit_Framework_Error_Notice等
    • 需要打开相对应的报错级别,才能触发错误;否则自定义的错误捕获器无法捕获到错误,则不能通过这一断言测试,如error_reporting(0)时,无法捕获到任何错误

输出测试

有时也会对一些直接的输出结果进行测试,得益于PHP的输出缓冲控制机制(ob_start(),ob_flush()等),可以对即将输出的字符串进行完全匹配或正则匹配;例:

public function testOutput(){
    $this->expectOutputRegex("/[0-9]+/");//正则匹配
        echo "123";
}
public function testFullOutput(){
    $this->expectOutputString("123");//完全匹配
        echo 123;
}
  • 注意,由于输出缓冲的关系,一个函数里只能进行一次输出测试,需要其他测试的情况则新开一个函数
  • 一般需要输出的场景,均可转化为assertEquals之类的情况,这样可以简化流程(不必声明多个测试函数)

测试覆盖率

  • 在单元测试中,测试覆盖率涉及多个层面(代码行覆盖率,函数覆盖率等,一般覆盖率的高低直接反应了测试的准确度;若一个测试可以百分百覆盖所有代码场景,则说明对代码中涉及的所有情况均进行了遍历(一般来说不大可能);这时若结合详尽完善的测试用例,则很大程度上可以提升代码的可靠性,并减少重复测试和返工的出现。
  • 在PHPUnit中,可以通过命令行参数来指定生成测试覆盖率报告,很大程度上方便了测试人员的工作流程,在PHPUnit中,支持行覆盖率,函数覆盖率与类覆盖率三种,可在覆盖率报告中查看;
    • 需求:安装有xdebug扩展,因为覆盖率报告依赖这一扩展而实现
    • 命令行参数:可通过自选报告生成的格式和位置来自定义报告的样式,这边默认选择生成HTML网页:phpunit --coverage-html /var/www/test_reports ./tests,这里的coverage-html即为选定的生成报告的格式,后面的var/www/...为生成报告的文件夹位置,完成测试后,在这一位置下会出现一份网页报告,里面即为所需要的覆盖率报告
    • 提醒:在新版本(V >7.0) 中,需要用--whitelist 将需要生成覆盖率报告的文件夹加入其中,不在这一白名单内的测试文件则不会在覆盖率报告中;而旧版本(本地V 4.8)里则不需要,默认将会对所有测试文件进行覆盖率报告

总结

本节主要讨论了PHPUnit对异常,错误以及输出的断言测试,后一部分涉及了代码覆盖率报告的相关内容;在不同版本中,一些细节差别较大,故而实际使用时请根据自己的PHP版本选择适合的PHPUnit版本,参考PHP版本与PHPUnit版本的对应关系,下一节中,将会对测试过程中遇到的特殊情况(跳过的测试,有风险的测试)进行介绍,并且对可重复测试(基境)以及测试组合(套件)的相关内容进行一定的讨论,敬请期待

作者:掠影(萨秋)
转载请联系原作者
邮件ryoalex@foxmail.com

取消

感谢您的支持,我会继续努力的!关闭

扫码支持
大家有钱的捧个钱场,没钱的捧个人场233333

打开支付宝扫一扫,即可进行扫码打赏哦

分享到: QQ空间 更多



评论区