【问题标题】:Finding .NET code covered exclusively by a set of tests查找仅由一组测试覆盖的 .NET 代码
【发布时间】:2015-03-30 21:58:02
【问题描述】:

对于一套 .NET 测试 (MSTest),有没有办法找到仅由特定测试子集(即单个 TestClass)覆盖的代码块?

这是我的场景:我在一个旧代码库中工作,随着时间的推移,该代码库已经构建了一个庞大而缓慢的单元和集成测试套件。我们希望减少套件的整体运行时间。一种方法是减少集成测试和单元测试之间的冗余。事实上,对于某些单元测试来说,可能存在完全多余的集成测试。

这是我想做的:

  1. 收集整套单元和集成测试的代码覆盖率。
  2. 查找不涵盖其他测试未涵盖的任何块的集成测试。
  3. 手动验证报告的测试是否完全冗余,如果是,请将其删除。

编辑: 根据目前的反馈,让我强调代码覆盖率只是一种工具,它描绘了测试真正测试的内容的不完整图景。在贬低它的价值之前理解一个测试是很重要的。

我们的测试是用 MSTest 编写的,并使用 Visual Studio 运行。我对收集代码覆盖率很熟悉,但不知道如何查询。

【问题讨论】:

    标签: .net unit-testing code-coverage mstest


    【解决方案1】:

    您正在做出一个非常非常危险的假设:如果其他代码已经在测试集成测试,那么集成测试将毫无用处。

    这是典型的代码覆盖陷阱。代码覆盖率本质上是没有意义的。它可以可靠地向您展示的是甚至没有尝试测试的代码。它无法验证测试是否在测试任何有价值的东西,或者您的软件中没有错误。

    您不能只是盲目地比较单元测试和集成测试的代码覆盖率,然后在单元测试已经在测试代码时开始删除集成测试。每个集成测试都应根据其自身的优点进行评估,以确定它是否正在测试无法通过单元测试验证的有价值的东西。

    【讨论】:

    • 让我换一种说法:我有一个随着时间推移而老化的代码库。它最古老的测试大多是大型集成测试,我们已经逐渐转向单元测试,希望逐步淘汰运行时间较长的测试。我想根据它们是否涵盖任何有意义的差距来对集成测试进行排序。我同意我们还必须在删除之前评估每个集成。
    • 我的意思是,集成测试可以覆盖与单元测试完全相同的代码并且仍然可以测试单元测试没有的东西
    【解决方案2】:

    OpenCover 有一个按测试覆盖的功能,可以帮助您收集所需的信息。然而,根据您的测试和代码库,XML 可能会变得有点大。看看wiki如何使用它。

    【讨论】:

      【解决方案3】:

      我有点不清楚你是否愿意

      • 查找重复覆盖相同代码的测试并将其删除(您需要小心:您可能对同一代码有两个测试,测试功能的不同方面),或者
      • 您是否要查找涵盖特定代码的所有测试。

      无论如何,您需要做的是一个测试覆盖率工具,它可以在每个测试的基础上收集覆盖率向量,然后确定哪些覆盖率向量覆盖特定代码,和/或哪些向量相交。

      我们的Test Coverage tools 可以为多种语言做到这一点,包括 C#。您必须稍微修改 MSTest 框架以跟踪它正在运行的测试,并且对于每个测试,在测试完成时转储该测试的测试覆盖率向量。

      作为该工具一部分的测试覆盖向量显示 UI 可让您组合任意组向量,并将这些组合(相交?补码?不同?)与其他组合进行比较。要确定哪些单个向量相交,您需要编写一个小例程来读取测试覆盖向量(本质上是位字符串)并为所有对逐对计算它们的相交。

      【讨论】:

      • 我希望完成第一个:找到冗余覆盖相同代码的测试并删除它们。我看到你推荐的是付费工具。我希望有某种方法可以解锁 Visual Studio 的代码覆盖工具已经收集的数据。
      • 本质问题是一样的。你能否获得他们的测试覆盖率数据是一个完全不同的问题。
      猜你喜欢
      • 2023-04-07
      • 2018-10-12
      • 2018-05-21
      • 1970-01-01
      • 2017-06-17
      • 2022-11-01
      • 2023-02-16
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多