我正在使用在框架4.0中开发的asp.net web forms项目。它目前没有任何单元测试。
我目前正在向网站添加一个新功能,我希望在该功能中引入单元和集成测试。由于不熟悉代码覆盖率的概念,我希望在新特性中实现较高比例的代码覆盖率。
我将使用visual studio和rhino mock提供的集成测试环境来生成mock。对于一个新特性,我应该达到什么级别的代码覆盖率?对于代码覆盖率的新手来说,如何衡量站点的特定功能?
发布于 2011-11-15 10:51:13
在单元测试中持续获得接近95%的代码覆盖率是可能的,但您需要始终关注您实际测试的内容以及您正在减少的内容。
有缺陷的模拟单元测试100%的代码覆盖率比根本没有测试覆盖率更糟糕。一个糟糕的模仿会导致一种错误的安全感--你认为你知道一些关于你的代码在现实世界中的表现,而实际上你什么都不知道。因为你对这个错误的知识有信心,所以你所知道的比什么都少。如果你根本没有测试,那么至少你会有恐惧作为你的向导。
Mocks是一个很棒的测试工具,但您必须记住,您的mock永远不会超过您所认为的真实世界的仿真。在现实世界的代码主流中,你通常不会发现问题。正是在死水的旋涡中,现实世界偏离了理性的期望,模仿会让你进入一种错误的安全感。
集成测试更好地掌握了实际情况,因为您通常是针对真实系统运行的。但是,要在集成测试中模拟失败案例来清除代码路径中的所有角落案例,并挤出最后5%的代码覆盖率,是极其困难的。单元测试擅长强制错误条件和执行代码的错误处理。
请注意,不要对代码覆盖率统计数据进行过多的解读。你知道他们怎么说的:谎言,该死的谎言,和代码覆盖率统计。;>代码覆盖率数据对于深入了解您的单元测试正在做什么是一个有价值的工具,但它并不是绝对正确的。代码覆盖率的结果可能表面上是华而不实的,但需要通过理解来调整。
很少有代码覆盖工具会不厌其烦地告诉您整个故事。大多数简单地告诉您,在测试运行期间的某个时间执行了一行代码。它们不会告诉您该行是否通过代码块在所有可能的代码路径上执行。部分原因是代码路径排列的数量随着每个额外的if语句呈指数增长。这种程度的增长很难管理,也很难想象。
考虑下面的代码:
public class Class1
{
public static void foo(bool a, bool b)
{
int x = 100;
if (a)
Console.WriteLine("statement a");
else
x -= 50;
if (b)
Console.WriteLine("statement c");
else
x -= 50;
double y = 10 / x;
}
}
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
Class1.foo(true, true);
Class1.foo(true, false);
Class1.foo(false, true);
}
}代码覆盖率将告诉您此代码片段中的所有行都已通过您的单元测试。
祝贺你!您已经获得了100%代码覆盖率的荣誉徽章。哦,顺便说一下,您的代码仍然包含崩溃错误。
覆盖结果是正确的,因为单元测试确实测试了代码片段中的每一行代码。但这并不是完整的故事,而是完整的事实。单元测试未执行通过同一执行上下文中的两个else子句传递的(a,b) = (false,false)的代码路径。在现实世界中,这是一条在运行时会导致被零除错误的路径。
不要误会我的意思-单元测试对于在将工作放到鲨鱼池中玩耍之前,检查工作的健全性至关重要。代码覆盖率分析是一个非常强大的工具,可以快速确定代码的哪些部分从未公开过,在发布之前可能需要更多的关注。
使用这些工具,并仔细考虑它们的结果,它们将很好地为您服务。
发布于 2011-11-15 08:11:51
在我看来,在进行单元测试时,代码覆盖率是一个误导性的指标。高覆盖率并不能说明你有很好的单元测试。事实上,在完全不测试的情况下拥有100%的覆盖率是非常容易的。对于单元测试,有趣的复盖率是分支复盖率,但大多数工具都给出了行复盖率。
相反,你应该做的是告诉自己TDD是如何正确完成的。有了适当的TDD,你就可以得到很好的单元测试,而且你不需要测量就知道你有一个非常好的覆盖率。
发布于 2011-11-15 07:48:04
你的问题有点奇怪。
代码覆盖率是显示在特定运行中执行了多少代码的标准。通常,人们使用代码覆盖率作为评估单元测试质量的标准:在这种情况下,未覆盖的代码等于未测试的代码。所以,每个人都希望在这里看到100%。
在您的例子中,如果您有高级版或旗舰版:http://msdn.microsoft.com/en-us/library/ms243186.aspx,则可以直接在VS2010中使用具有相同目的的代码覆盖率
对于ASP.NET应用程序,您可能希望使用其他类型的测试,如UI测试(用于webforms)、负载测试等,这些测试也可以(部分地)生成并直接在VS2010中运行。
https://stackoverflow.com/questions/8129759
复制相似问题