我正在试图弄清楚如何限制我的测试,以便覆盖率报告者只考虑在为该函数编写特定测试时所涵盖的函数。
PHPUnit doc中的以下示例显示了我尝试实现的非常好的内容:
可以在测试代码中使用@covers注释来指定哪个 测试方法想要测试的方法:
x.plot = min(x) - x
如果执行上述测试,则只会将函数/**
* @covers BankAccount::getBalance
*/
public function testBalanceIsInitiallyZero()
{
$this->assertEquals(0, $this->ba->getBalance());
}
标记为已覆盖,而不是其他。
现在我的JavaScript测试中有一些实际的代码示例。此测试显示了我试图摆脱的不需要的行为:
getBalance
此测试会将函数it('Test get date range', function()
{
expect(dateService.getDateRange('2001-01-01', '2001-01-07')).toEqual(7);
});
标记为,但也标记从 getDateRange
内部调用的任何其他函数。由于这个怪癖,我项目的实际代码覆盖率可能比报告的代码覆盖率低很多。
如何阻止此行为?有没有办法让Karma / Jasmine / Istanbul按照我想要的方式运行,或者我是否需要切换到另一个JavaScript测试框架?
答案 0 :(得分:2)
我没有看到你提出的任何特殊原因。我说如果你的测试导致调用嵌套函数,那么函数也会被覆盖。您确实间接测试了这段代码,那么为什么不应该将其包含在代码覆盖率指标中呢?如果内部函数包含错误,即使它没有直接测试,你的测试也可以捕获它。
您可以使用特殊注释来注释您的代码,告诉伊斯坦布尔忽略某些路径: https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md 但我认为,如果您知道自己并不想要覆盖特定的执行路径,那么不要减少覆盖率,可能是因为要为它编写测试用例太难了。
另外,如果你关心你的低水平"功能单独测试,然后确保您的代码以模块化方式构建,以便您可以先自行测试。您还可以设置不同的测试运行配置,这样您就可以拥有一个仅测试基本逻辑并报告其覆盖范围的套件。
正如评论中所建议的,模拟和依赖注入有助于使您的测试更加集中,但您基本上总是希望进行一些高级测试,以便检查这些部分的集成。如果你嘲笑一切,那么你永远不会测试实际的一起工作。