2010-06-18 4 views
1

J'ai une fonction qui appelle un test sur chaque objet. Je veux être en mesure de retester si le test en cours échoue.Fonction de redémarrage en cours d'exécution

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

Répondre

2

Pour les deux réponses ci-dessus, les solutions se traduiront par RunTest() en cours d'exécution pour toujours si l'échec est légitime (c'est-à-dire pas une défaillance transitoire, que je ne peux gu ess est ce que vous frappez). Vous pouvez envisager de faire l'une des boucles ci-dessus, mais au lieu de tenir compte du nombre d'échecs et de renflouer une fois ce seuil atteint. Quelque chose comme:

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

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

Vous devriez également envisager la tenue de statistiques pour combien de fois vous devez faire une boucle pour passer. Cela pourrait être un excellent indicateur de la stabilité des tests.

0

Il existe plusieurs façons de procéder, en fonction de la raison pour laquelle vous souhaitez effectuer cette opération. Vous pouvez:

1) ont RunTest() retour boolean pour le succès ou l'échec, puis:

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

2) Utilisez un while intérieur de RunTest():

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

    if(failure) 
     continue; 
    else 
     break; 
    } 
} 
+0

grands esprits pensent :) – Kyra

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

Vous les gars comme trop de code ...

for (var tryCount = 0; tryCount < 3; tryCount++) 
    if (test.RunTest()) 
     break; 

... oh je pensais d'une version encore plus court ... mais ce n'est pas aussi propre ...

for (var tryCount = 0; !test.RunTest() && tryCount < 3; tryCount++); 

Si vous voulez la réutilisation alors quelque chose comme ceci ...

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); 
Questions connexes