Функция перезапуска, которая работает - PullRequest
1 голос
/ 19 июня 2010

У меня есть функция, которая вызывает тест для каждого объекта.Я хочу провести повторную проверку, если текущий тест не пройден.

        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.
             }
        }

Ответы [ 4 ]

5 голосов
/ 19 июня 2010

Вам, ребята, нравится слишком много кода ...

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);
2 голосов
/ 19 июня 2010

Для обоих ответов, приведенных выше, решения приведут к выполнению RunTest () навсегда, если сбой является допустимым (т. Е. Это не временный сбой, о котором я могу только догадываться, что вы нажали). Вы можете рассмотреть возможность выполнения одного из вышеприведенных циклов, но вместо этого держите счетчик количества сбоев и выходите из строя по достижении этого порога. Что-то вроде:

int FailureThreshold = 3;
foreach (TestObject test in Tests) 
{
    int failCount = 0;

    while (failCount < FailureThreshold)
    {
        if (test.RunTest())
        {
            break;
        }
        else
        {
            failCount++;
        }
    }
}

Вы также должны рассмотреть вопрос о том, сколько раз вам нужно выполнить цикл, чтобы пройти. Это может быть отличным показателем стабильности теста.

0 голосов
/ 19 июня 2010
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
}
0 голосов
/ 19 июня 2010

Есть несколько способов сделать это, в зависимости от того, почему именно вы хотите это сделать. Вы могли бы:

1) RunTest() вернуть boolean в случае успеха или неудачи, а затем:

foreach (TestObject test in Tests)
{
    while(!test.runTest(){}
}

2) Используйте while внутри RunTest():

RunTest()
{
  while(true)
  {
    ...test stuff...

    if(failure)
      continue;
    else
      break;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...