我有一个函数可以调用每个对象的测试。如果当前测试失败,我希望能够重新测试。
foreach (TestObject test in Tests)
{
test.RunTest()
}
//This is in the TestObject class
RunTest()
{
if (failure)
{
//Want to be able to run RunTest() again without interrupting the foreach loop.
}
}
答案 0 :(得分:5)
你们这些代码太多了......
for (var tryCount = 0; tryCount < 3; tryCount++)
if (test.RunTest())
break;
...哦,我想到了一个更短的版本...但它不是那么干净......
for (var tryCount = 0; !test.RunTest() && tryCount < 3; tryCount++);
如果你想重复使用,那就像这样...
static bool RunTest(Func<bool> testCase, int maxRetry)
{
for (var tryCount = 0; tryCount < maxRetry; tryCount++)
if (testCase())
return true;
return false;
}
// usage
var testResult = RunTest(test.RunTest, 3);
// or even...
var testResult = RunTest(
{
try {
return test.RunTest();
} catch (Exception ex) {
Debug.WriteLine(ex);
return false;
}
}, 3);
答案 1 :(得分:2)
对于上面的两个答案,解决方案将导致RunTest()永远运行,如果失败是合法的(即不是瞬态故障,我只能猜测你正在打什么)。您可以考虑执行上述其中一个循环,而是计算一旦达到该阈值就会失败多少次并挽救。类似的东西:
int FailureThreshold = 3;
foreach (TestObject test in Tests)
{
int failCount = 0;
while (failCount < FailureThreshold)
{
if (test.RunTest())
{
break;
}
else
{
failCount++;
}
}
}
您还应该考虑保留循环以便传递多少次的统计信息。这可能是测试稳定性的一个很好的指标。
答案 2 :(得分:0)
有几种方法可以实现这一目标,具体取决于您为什么要这样做。你可以:
1)让RunTest()
返回boolean
表示成功或失败,然后:
foreach (TestObject test in Tests)
{
while(!test.runTest(){}
}
2)使用while
内的RunTest()
:
RunTest()
{
while(true)
{
...test stuff...
if(failure)
continue;
else
break;
}
}
答案 3 :(得分:0)
foreach (TestObject test in Tests)
{
test.RunTest()
}
//This is in the TestObject class
RunTest()
{
//set it to failure or set variable to failure
while (failure)
{
//do the test
//if using variable set it to failure if it failed, success if it succeeded
//will keeping going through the while statement until it succeeds or you cut it off another way
}
// has succeeded
}