gpt4 book ai didi

javascript - 如何使用 Karma、Jasmine 和 Istanbul 指定测试应涵盖哪些功能/方法

转载 作者:可可西里 更新时间:2023-11-01 02:27:23 26 4
gpt4 key购买 nike

我正在尝试弄清楚如何限制我的测试,以便覆盖率报告者只考虑在为该功能专门编写测试时覆盖的功能。

下面的例子来自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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com