我很好奇是否有任何内置机制可以retry在 Visual Studio 2008 C# 单元测试框架中进行测试。
举个例子,我有一个 C# 单元测试,如下所示:
[TestMethod]
public void MyMethod() {
DoSomething();
Assert.Something();
}
现在,偶尔DoSomething()
表现不佳;在这种情况下我想重新运行DoSomething()
方法在到达断言之前。显然我可以做类似的事情:
...
do {
Initialization();
DoSomething();
} while (PerformedOK() == false);
Assert.Something();
...
尽管这有点麻烦,因为添加了循环并重复测试初始化,否则这将完全由其他方法/类构造函数处理。
我的问题是是否有更方便的机制来重试测试,例如:
DoSomething();
if (PerformedOK() == false) Retry();
else Assert.Something();
这将自动重试测试without将其注册为失败,同时照常执行所有常规初始化代码。
严重地...
有时 DoSomething() 会执行
严重地
每次测试都应该是绿色的。如果测试的代码有时执行“糟糕”,那么您需要修复代码,隔离不同的行为。您应该进行两项测试,一项是当 DoSomething 失败(并且应该失败)时断言正确,另一项是当 DoSomething 正常(并且应该正常)时断言正确。
在测试中重试逻辑在我看来是错误的。您应该始终对预期结果进行断言,并且您应该能够隔离和检测您的代码以返回您期望的结果。
[编辑-添加了一些可用于重试循环的代码]
您可以创建一个循环包装器,它接受任何方法并调用它 X 次,或者直到它成功。您还可以让 Loop 函数调用您的 init,或将其作为单独的参数传递。如果成功,该方法还可以返回布尔值。更改签名以满足您的需要。
[TestMethod]
public void something()
{
Loop.LoopMe(TestMethod,3);
Assert.Something();
}
class Loop
{
public static void LoopMe(Action action, int maxRetry)
{
Exception lastException = null;
while (maxRetry > 0)
{
try
{
action();
return;
}
catch (Exception e)
{
lastException = e;
maxRetry--;
}
}
throw lastException;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)