上文链接:基于PHPunit的单元测试入门(一),本文主要讨论对于单元测试中其他情况的断言测试,以及关于测试覆盖率的一些情况。
在实际使用中,常常需要手动抛出异常,以及一些异常情况的处理;于是在编写测试用例时,必然会涉及一些触发异常的情况,而在PHPUnit中,我们可以通过设置一个“断言异常”来对将要发生的异常进行测试。有以下几种方式:
/** * @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);//失败,同上 }
与异常类似,只是在该版本中缺少直接断言错误的函数(注释声明有), 而是利用了PHP中自带的error_handler,将错误转用自定义的异常进行处理,例:
public function testError(){ $this->setExpectedException("PHPUnit_Framework_Error"); include "no_existed.php";// 试图包含一个不存在的文件 }
有时也会对一些直接的输出结果进行测试,得益于PHP的输出缓冲控制机制(ob_start(),ob_flush()等),可以对即将输出的字符串进行完全匹配或正则匹配;例:
public function testOutput(){ $this->expectOutputRegex("/[0-9]+/");//正则匹配 echo "123"; } public function testFullOutput(){ $this->expectOutputString("123");//完全匹配 echo 123; }
本节主要讨论了PHPUnit对异常,错误以及输出的断言测试,后一部分涉及了代码覆盖率报告的相关内容;在不同版本中,一些细节差别较大,故而实际使用时请根据自己的PHP版本选择适合的PHPUnit版本,参考PHP版本与PHPUnit版本的对应关系,下一节中,将会对测试过程中遇到的特殊情况(跳过的测试,有风险的测试)进行介绍,并且对可重复测试(基境)以及测试组合(套件)的相关内容进行一定的讨论,敬请期待
作者:掠影(萨秋)
转载请联系原作者
邮件ryoalex@foxmail.com