【问题标题】:How to specify which functions/methods should be covered by a test, using Karma, Jasmine, and Istanbul如何使用 Karma、Jasmine 和 Istanbul 指定测试应涵盖哪些功能/方法
【发布时间】:2016-06-30 22:43:58
【问题描述】:

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

PHPUnit doc 中的以下示例很好地展示了我尝试实现的目标:

@covers 注解可以在测试代码中用来指定哪个 测试方法要测试的方法:

/**
 * @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 测试?

【问题讨论】:

  • 想到的是使用依赖注入和模拟来减少对实际生产代码的调用次数。
  • 我同意 henrikmerlander 的观点。此外,如果您在被测方法中间接使用真正的函数调用而不是模拟,那么您也在测试该函数
  • 非常好的问题。例如,用 phpunit 进行测试,我们有 /** @coverage **/ phpdoc tag ;)

标签: javascript unit-testing jasmine code-coverage istanbul


【解决方案1】:

我看不出你问什么有什么特别的原因。我会说,如果您的测试导致调用嵌套函数,那么该函数也会被覆盖。您确实在间接测试那段代码,那么为什么不应该将其包含在代码覆盖率指标中呢?如果内部函数包含错误,即使没有直接测试,您的测试也可以捕获它。

您可以使用特殊的 cmets 注释您的代码,以告诉伊斯坦布尔忽略某些路径: https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md 但我认为这更适合相反的情况,如果您知道不希望覆盖特定的执行路径,则不要减少覆盖率,也许是因为为它编写测试用例太难了。

此外,如果您关心单独测试的“低级”功能,请确保您的代码以模块化方式构建,以便您可以先自行测试这些功能。您还可以设置不同的测试运行配置,这样您就可以拥有一个仅测试基本逻辑并报告其覆盖范围的套件。

正如 cmets 中所建议的,模拟和依赖注入有助于使您的测试更加集中,但您基本上总是希望进行一些高级测试,在其中检查这些部分的集成。如果你模拟一切,那么你永远不会测试实际的部分一起工作。

【讨论】:

    猜你喜欢
    • 2012-12-07
    • 2018-01-31
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多