【发布时间】:2014-12-11 14:26:56
【问题描述】:
我对代码覆盖率有点困惑。
示例: 我有一个方法,它有多个 if 语句(不是嵌套的),每个语句都附加到一个我完成后返回的字符串。
我的单元测试只是检查初始结果和最终结果,这是我为了这个问题而特意做的。中间什么都没有(所以不检查 else 语句)
问题: 如果我运行该测试,我将获得 100% 的代码覆盖率。我在理解这一点时遇到的问题是我想要方法本身的代码覆盖率,而不是我的测试有多少被命中。由于没有命中 else 语句,它应该会低一些。
我查看了有关单元测试和代码覆盖率的各种教程和 msdn。在某些情况下,测试似乎是从方法本身分析代码(我想做的),但在大多数其他情况下,它只检查测试的代码覆盖率。
我的问题是; 有没有办法将测试链接到方法,以便在我分析测试代码覆盖率时获得方法的代码覆盖率,或者这就是代码覆盖率的目的,用户必须编写测试来解决这些问题分支机构?
感谢您的宝贵时间。
编辑:代码示例。
public static string testingString(string s1, string s2, bool isAllowed, bool isAdmin, bool isCustomer){
string result = string.Format("{0}/{1}", s1, s2);
if (isAllowed) result += "/Allowed";
if (isAdmin) result += "/admin";
if (isCustomer) result += "/customer";
return result;
}
测试:
[TestMethod]
public void testingString_BasicTest()
{
var result = testingString("test1", "test2", false, false, false);
var expectedResult = string.Format("{0}/{1}", "test1", "test2");
Debug.WriteLine("Result should be: " + expectedResult);
Assert.AreEqual(expectedResult, url);
}
testingString_BasicTest 在这种情况下将有 100% 的代码覆盖率,尽管没有达到 3 个 if 语句结果。
【问题讨论】:
-
一个代码示例在这里可能会有所帮助:)
-
这获得了 100% 的代码覆盖率? [您实际上使用覆盖工具运行了这个并查看了报告?] 使用什么工具 [大概是 VS2013]?它可能会获得 100% 的 line 覆盖率;函数中的每一行 line 都会被执行。但很明显,并不是每个 statement 都会被执行。使用 false/false/false,“result += ....”语句显然不会执行。
-
...还需要注意工具限制。许多字节码检测器只能将代码解析到“行”级别,因为字节码最多可以跟踪行号。如果行中的任何语句的任何部分被执行,则按 line 跟踪语句的“语句覆盖”工具实际上可能会混淆“行”被完全覆盖的报告。如果一行中有多个语句,并且您希望能够将它们区分开来,则需要一种更精细的工具来报告语句覆盖率。
-
testingString_BasicTest将显示 100% 的代码覆盖率,因为测试的每一行都已执行。那不重要。重要的是为testingString显示的代码覆盖率对于该方法,您应该看到大约 50% 的代码覆盖率与您的测试。
标签: c# unit-testing visual-studio-2013 code-coverage