查找由一组测试专门涵盖的.NET代码

时间:2015-03-30 21:58:03

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

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

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

以下是我想做的事情:

  1. 通过整套单元和集成测试收集代码覆盖率。
  2. 查找不包含其他测试未涵盖的任何块的集成测试。
  3. 手动验证报告的测试是否完全冗余,如果是,请将其删除。
  4. 编辑: 根据目前为止的反馈,我要强调的是,代码覆盖率只是一种工具,并描绘了测试真正测试的不完整画面。在折扣价值之前了解测试非常重要。

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

3 个答案:

答案 0 :(得分:2)

您正在做出一个非常非常危险的假设:如果其他代码已经在测试它,则集成测试没有用处。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我有点不清楚你是否想要

  • 找到冗余覆盖相同代码并删除它们的测试(这里需要注意:您可能对相同的代码进行两次测试,测试功能的不同方面),或者
  • 是否要查找涵盖特定代码的所有测试。

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

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

作为工具一部分的测试覆盖率矢量显示UI将允许您组合任意矢量集,并将这些组合(交叉?补充?不同?)与其他组合进行比较。要确定哪些单独的向量相交,您需要编写一个小例程来读取测试覆盖率向量(基本上是位串)并为所有对成对计算它们的交叉点。