1) 异常测试
使用背景:为了使业务逻辑更严谨,在bll文件中经常会有各种if else语句并抛异常,而在写对应的单元测试时,我们要考虑到每种情况,并试图提高覆盖率。
方法:使用setExpectedException()方法来设定所预期的异常。
例:测试gold/backend/app/Bll/Zc/House.php的changeRoom方法
/**
* @dataProvider providerOverride
*/
public function testChangeRoom($userId, $houseId, $targetRoomId, $exception)
{
$noneChange = $this->bllHouse->changeRoom(45520, 1, 2); //不用更换
$this->assertTrue($noneChange, 'Change Room Failed.');
$changeSuccess = $this->bllHouse->changeRoom(45520, 1, 1); //更换成功
$this->assertTrue($changeSuccess, 'Change Room Failed.');
$this->setExpectedException($exception);
$this->bllHouse->changeRoom($userId, $houseId, $targetRoomId);
}
public function providerOverride()
{
return array(
array(45520, 1, 3, 'Gold\Exceptions\SystemException\ZcException'),//房产不可选
array(45520, 1, 4, 'Gold\Exceptions\SystemException\ZcException'),//无此目标房产
array(440, 1, 1, 'Gold\Exceptions\SystemException\ZcException'),//无对应用户房产信息
);
}
针对bll文件中的changeRoom方法,每种情况的异常测试都已覆盖到,去查看覆盖率时,你会发现并不是100%。
原因:是在捕获到预期的异常时,测试便不会继续运行,故if语句的‘}’总会显示未被覆盖(如下图示)。
解决办法:在改语句后面加上“@codeCoverageIgnore”,把改行忽略掉。(为了率概率,有种作弊的感觉,有木有。。。)
另外,对于非常简单的方法,比如方法中只有一条return语句,并返回常量,可以不写单测,直接在方法的注释上面加上“@codeCoverageIgnore”,这样在统计覆盖率时就会忽略该方法。
2)mockery的使用(文档链接:http://docs.mockery.io/en/latest/reference/startup_methods.html)
为什么要mock?