- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试弄清楚如何限制我的测试,以便覆盖率报告者只考虑在为该功能专门编写测试时覆盖的功能。
下面的例子来自PHPUnit doc很好地展示了我试图实现的目标:
The @covers annotation can be used in the test code to specify which method(s) a test method wants to test:
/**
* @covers BankAccount::getBalance
*/
public function testBalanceIsInitiallyZero()
{
$this->assertEquals(0, $this->ba->getBalance());
}
如果执行上面的测试,只有函数 getBalance
会被标记为被覆盖,没有其他。
现在是我的 JavaScript 测试中的一些实际代码示例。此测试显示了我试图摆脱的不需要的行为:
it('Test get date range', function()
{
expect(dateService.getDateRange('2001-01-01', '2001-01-07')).toEqual(7);
});
此测试会将函数 getDateRange
标记为已覆盖,但也会标记从内部调用的任何其他函数 getDateRange
。由于这个怪癖,我项目的实际代码覆盖率可能比报告的代码覆盖率低很多。
我怎样才能阻止这种行为?有没有办法让 Karma/Jasmine/Istanbul 以我想要的方式运行,或者我是否需要切换到另一个框架来进行 JavaScript 测试?
最佳答案
我看不出您的要求有任何特殊原因。我会说如果您的测试导致调用嵌套函数,那么该函数也会被覆盖。您确实是在间接测试那段代码,那么为什么不应该将其包含在代码覆盖率指标中呢?如果内部函数包含错误,您的测试可以捕获它,即使它没有直接测试它也是如此。
您可以使用特殊注释来注释您的代码,以告诉 Istanbul 尔忽略某些路径: https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md但我认为这恰恰相反,如果您知道不想覆盖特定的执行路径,则不要减少覆盖率,这可能是因为为它编写测试用例太难了。
此外,如果您关心单独测试的“低级”功能,请确保您的代码以模块化方式构建,以便您可以先自行测试这些功能。您还可以设置不同的测试运行配置,这样您就可以拥有一个仅测试基本逻辑并报告其覆盖率的套件。
正如评论中所建议的,模拟和依赖注入(inject)可以帮助您的测试更加集中,但您基本上总是希望进行一些高级测试,在这些测试中您可以一起检查这些部分的集成。如果您模拟所有内容,那么您永远不会测试协同工作的实际部分。
关于javascript - 如何使用 Karma、Jasmine 和 Istanbul 指定测试应涵盖哪些功能/方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36012202/
我是一名优秀的程序员,十分优秀!