【发布时间】:2014-10-26 20:01:09
【问题描述】:
我有以下示例代码
public static void Method()
{
AutoResetEvent autoReset = new AutoResetEvent(false);
bool canceled = false;
new Thread(() =>
{
Thread.Sleep(1000);
canceled = true;
autoReset.Set();
}).Start();
do
{
Console.WriteLine("Doing something");
} while (autoReset.WaitOne() && !canceled);
Console.WriteLine("Completed");
}
我正在努力实现 100% 的代码覆盖率。所以我只是做了一个简单的测试(什么都不测试,但这不是重点),运行它并分析代码覆盖率:
[TestMethod]
public void TestMethod1()
{
Program.Method();
}
代码覆盖率告诉我只执行了while 行的一部分:
经过一番研究,我尝试反编译代码,发现编译器正在将我的do while更改为:
do
{
Console.WriteLine("Doing something");
flag = (!autoResetEvent.WaitOne() ? false : !flag1);
}
while (flag);
因此,条件运算符中的false 永远不会被测试(并且不可能测试because WaitOne never returns false。一个简单的解决方案就是将while 条件的WaitOne 移出并放在do 内。所以我的问题是:
- 为什么编译器将 and 条件更改为条件运算符?
- 有没有一种方法可以防止编译器执行此操作,方法是保持当前条件不变且不影响其余代码的编译方式?实际上,while 中的条件比这更复杂。像这样保持它会更简单,更易读。
【问题讨论】:
-
为什么你认为这是编译器而不是反编译器的结果?
-
好问题。我认为这是编译器的结果,因为它与我没有被覆盖到 100% 的原因是一致的。贴IL证明是编译器的结果吗?
-
代码覆盖率是一个非常危险的指标。 100% 的覆盖率不会告诉你代码或测试用例的质量——即使是 100% 的代码覆盖率,你仍然可能会错过关键的测试用例和错误。不要为了获得 100% 的覆盖率而拍摄。
标签: c# .net visual-studio unit-testing code-coverage