对于一套.NET测试(MSTest),是否有一种方法可以找到仅由测试的特定子集(即单个TestClass
?)覆盖的代码块
这是我的场景:我在一个旧的代码库中工作,随着时间的推移,它已经建立了一套庞大而缓慢的单元和集成测试。我们希望减少套件的总体运行时间。一种方法是减少集成测试和单元测试之间的冗余。事实上,对于某些单元测试来说,可能存在完全冗余的集成测试。
以下是我想做的:
- 收集整个单元和集成测试套件的代码覆盖率
- 查找不覆盖任何其他测试未覆盖的块的集成测试
- 手动验证报告的测试是否完全冗余,如果是,请删除它们
编辑: 根据到目前为止的反馈,让我强调代码覆盖率只是一个工具,它描绘了真正测试的不完整画面。在对测试的价值进行折现之前,了解测试是很重要的
我们的测试是用MSTest编写的,并使用Visual Studio运行。我熟悉收集代码覆盖率,但不知道如何通过它进行查询。
您正在做出一个非常非常危险的假设:如果其他代码已经在测试集成测试,那么集成测试就没有任何作用。
这是典型的代码覆盖率陷阱。代码覆盖率本质上是没有意义的。它所能可靠地向您展示的只是甚至没有经过测试的代码。它无法验证测试是否测试了任何有价值的东西,或者你的软件中没有错误
您不能只是盲目地比较单元测试和集成测试的代码覆盖率,然后在单元测试已经在测试代码时开始删除集成测试。每个集成测试都应该根据其自身的优点进行评估,以确定它是否在测试单元测试无法验证的有价值的东西。
OpenCover有一个按测试覆盖的功能,它应该可以帮助您收集所需的信息。然而,XML可能会变得有点大,这取决于您的测试和代码库。看看维基如何使用它。
我有点不清楚你是否想
- 找到冗余覆盖相同代码的测试并将其删除(这里需要小心:可能对同一代码有两个测试,测试功能的不同方面),或者
- 是否要查找覆盖特定的、已标识的代码位的所有测试
无论如何,您需要做的是一个测试覆盖工具,它可以在每次测试的基础上收集覆盖向量,然后确定哪些覆盖向量覆盖特定代码,和/或哪些向量相交。
我们的测试覆盖工具可以为包括C#在内的各种语言实现这一点。您将不得不稍微修改MSTest框架,以跟踪它正在运行的测试,并且对于每个测试,在测试完成时转储该测试的测试覆盖向量。
作为该工具的一部分,Test Coverage Vector Display UI将允许您组合任意向量集,并将这些组合(相交?互补?不同?)与其他组合进行比较。要确定哪些单独的向量相交,您需要编写一个小例程来读取测试覆盖向量(本质上是位字符串),并为所有对成对计算它们的相交。