【问题标题】:How to discover which test unit checks which lines of code?如何发现哪个测试单元检查了哪些代码行?
【发布时间】:2011-06-21 06:45:51
【问题描述】:

我在玩弄 NUint,希望能找到一种方法来实现哪一行代码在哪个测试中通过。

假设我有一个方法,我有 3 个测试。有什么方法可以找出哪个测试检查哪一行代码?

使用过 NCover,我知道您可以找出哪些行已经过测试,哪些行没有经过测试。但是,您确实看不到哪个单元检查了该代码。

它在处理大量测试时非常有用...

【问题讨论】:

  • 您能解释一下为什么查看哪些测试覆盖了哪些代码行对您有用吗?
  • 请看看 GeertvdC answer cmets
  • 我不认为有什么可以做到这一点...只要测试一段代码,在哪里测试它是否重要? :) 如果您想知道它是否经过实际测试或哪些测试执行它,请将其注释掉并运行您的测试。失败的测试就是您要寻找的测试。
  • 其实这很重要。如果两个测试基本上测试相同的代码,您可以只运行其中一个。当您有数千个测试时,消除冗余测试可以大大减少总测试执行时间。如果您可以跟踪更改为特定测试集的区域的覆盖范围,那么当您更改该区域时,您可以只运行这些测试。这意味着个人贡献者可以在进行更改时运行与他相关的测试。
  • 我来这个问题是因为我发现了一个错误,这是由于根据 NCover 的一条线被恰好一个测试所覆盖。如果它可以告诉我是哪个测试,那将真的很方便,所以我可以修复它...

标签: c# testing nunit code-coverage ncover


【解决方案1】:

JetBrains dotCover 可以帮助您获得所需的信息。 它与 ReSharper 单元测试运行程序集成并收集每个测试数据。 您可以查看每个特定测试涵盖了哪些代码(在 VS 中具有相应的突出显示)。 更有趣的是,对于每段代码,您都可以获得涵盖它的测试列表并轻松地重新运行它们。

更多信息可在此处获得: http://blogs.jetbrains.com/dotnet/2010/07/show-covering-test-with-dotcover/

【讨论】:

  • 谢谢 ;) 希望 NCover 有一天能实现同样的功能! :)
【解决方案2】:

您好,因为大多数人已经回应,目前使用大多数覆盖率工具执行此操作的唯一方法是单独运行每个测试,然后查看每个测试的覆盖率。

但是,使用 OpenCover 是可能的,但需要一些努力。如果您按照到达的顺序从测试和目标中捕获并存储所有序列点,然后逐个测试地分析这些结果,这就是 OpenCover 的原始目标之一 - https://github.com/sawilde/opencover/wiki。目前 OpenCover 只是聚合这些结果,然后丢弃访问数据,但它们可以被存储。当然,如果存在任何并行运行的测试,您必须了解它们。数据量可能令人生畏,这也是它尚未实施的原因之一。

【讨论】:

  • 谢谢Shaun,有希望实现吗? :-)
  • 它正在筹备中 - 时间是我的敌人,可能需要使用备用存储,然后可以稍后开采。
【解决方案3】:

您可以调试您的测试。如果您使用的是 NUnit,您可以将该进程附加到您的 VS。

【讨论】:

  • 如果您的业务层中存在许多抛出异常,您将无法这样做。因为你几乎从来没有达到那个代码!除非你评论所有抛出的异常
【解决方案4】:

NCover 是一种可用于计算单元测试覆盖率的工具。请参阅 NCover.com。

【讨论】:

  • 代码覆盖率只是告诉你哪一行已经被测试了!不是哪个测试单元检查了哪些行
【解决方案5】:

最简单的方法是下载并安装TestDriven.NET 的个人版,它可以运行您的单元测试,并且可以选择使用 NCover 运行和报告代码覆盖率。请注意,较新的 NCover 版本是商业版本,但 TD.NET 中包含的版本有点旧,但可以免费使用。

【讨论】:

  • 我的问题是别的! ;-)
【解决方案6】:

我不知道有什么可以直接实现与您正在寻找的匹配。我最近在automated fault localization 上做了一个项目,我们需要这个确切的功能,我们想出的唯一解决方案是推出我们自己的测试运行器,它还收集每种方法的覆盖率信息。

使用 Visual Studio 2010(Premium 和 Ultimate)可能有一种间接的方式来实现这一点,它引入了 Test Impact Analyzer。这使您可以确定哪些测试会影响对源代码的更改。但是,这仅适用于 MSTest。你可以使用the technique in this blog post 让你的 NUnit 测试在 MSTest 下运行。

【讨论】:

    【解决方案7】:

    您要查找的术语是“代码覆盖率”。

    我没有任何使用 NUnit 执行此操作的经验,但似乎有一个 codeplex 项目可用于 NUnit:http://codecoveragerunner.codeplex.com/

    如果您想查看哪个测试正在测试哪一行代码,您可以在代码行上放置一个断点并调试您的测试吗?当你命中断点时,检查哪个测试是

    当有其他测试抛出异常时,您可以禁用 break on exception 选项:

    • 在 Visual Studio 的菜单中转到“调试”->“异常”并取消选中异常中断。那么您不必在每次异常时都停下来。

    【讨论】:

    • 代码覆盖率只是告诉你哪一行已经被测试了!不是哪个测试单元检查它
    • 好的,那么我没有正确理解您的问题。但是为什么哪条线被哪个测试测试真的很重要呢?我假设您想每次都运行每个测试。单元测试应该很快,否则人们很快就会停止使用。
    • 老实说,有一段代码我找不到它在哪里测试过。还有一段非常相同的其他代码未经测试。因此,我试图找到与其他 1000 个测试类似的单元测试。只要有很多安静的抛出异常,我就不能使用调试,除非我评论所有这些都是不合理的
    • 在代码行设置断点并调试您的测试?当你到达断点时,检查哪个测试正在运行?
    • 在 Visual Studio 的菜单中转到“调试”->“异常”并取消选中异常中断。那么你不必在每一个例外都停下来。
    【解决方案8】:

    简单的答案是,“单独运行每个测试并为该测试收集测试覆盖率数据”。

    您的组织方式可能取决于特定的测试覆盖率工具,以及您选择运行测试的方式。

    对于我们的Test Coverage tools,测试覆盖检测步骤向您的软件添加了一个明确的“TestCoverageDump”方法。通常会在应用程序的“主”程序中插入对该方法的调用,以便当它退出时,您可以获取已运行的任何测试的测试覆盖率数据。

    对于您的任务,您希望修改您的单元测试运行代码,以便在每次测试后进行显式调用 “TestCoverageDump”后跟“TestCoverageReset”(也插入),以便每个测试都有自己的向量。您如何选择将测试名称与向量相关联完全是 在您的控制下,以对源代码中提供的“TestCoverageDump”代码进行一点点调整为代价。

    我们的测试覆盖率显示工具可以轻松组合所有单独的向量,为您提供整体视图。或者您可以查看任何特定向量的覆盖范围。显示工具也将 让您比较不同测试的覆盖率(它们在哪里相交?一个测试什么,另一个不测试?)

    拥有每个测试的覆盖率数据还可以让您确定需要再次运行哪些测试。如果您修改代码并重新运行检测器,它将根据向量之前覆盖的修改代码告诉您需要再次运行哪些测试覆盖率向量(例如,哪些测试)。

    【讨论】:

      【解决方案9】:

      如果您使用的是 Visual Studio,您应该查看 Chris Dexter 的扩展“运行 Coverlet 报告”。 https://marketplace.visualstudio.com/items?itemName=ChrisDexter.RunCoverletReport

      除了上面的综合报告,它还可以做代码高亮,你可以看到哪些代码行被完全覆盖,部分被覆盖,哪些没有。

      【讨论】:

        猜你喜欢
        • 2011-03-12
        • 2018-12-24
        • 2020-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-13
        • 1970-01-01
        相关资源
        最近更新 更多