2013-09-16 3 views
-1

J'utilise C# à des fins de test. Un test consiste en plusieurs étapes de test. Si une étape de test échoue, l'ensemble du test doit être annulé. Une étape de test pourrait ressembler à ceci:Renvoie la fonction appelante

Variable1.Value = 1; 
Variable1.write(); 

Variable1.read(); 
if (Variable1.Value != 1) 
{ 
    Console.WriteLine("Fail"); 
    return; //this return aborts the test 
} 
//next test steps 

Je voudrais transférer certaines commandes dans les fonctions propres pour permettre une programmation efficace des cas de test. La fonction pour le code ci-dessus ressemblerait à ceci.

private void verifyValue (TypeOfVariable Var, double Value) 
{ 
    Var.read(); 
    if (Var.Value != Value) 
    { 
     Console.WriteLine("Fail"); 
     return; 
    } 
} 

Et le test ressemblerait à ceci

Variable1.Value = 1; 
Variable1.write(); 
verifyValue(Variable1, 1); 
//next test steps 

Mon problème est maintenant que la return en fonction verifyValue seulement des effets verifyValue mais pas la fonction appelante (alias test).

Est-il possible d'abandonner la fonction d'appel?

+4

Y at-il une raison pour laquelle vous n'utilisez pas un framework de test unitaire et 'Assert'? –

+3

Vous essayez d'implémenter une opération atomique à l'aide des instructions de retour et de l'achèvement de la fonction. Je pense que ce n'est pas une très bonne approche. Au lieu de cela, vous pouvez implémenter des classes qui exécutent toutes les instructions en tant que transaction et, en fonction des exceptions qu'elles lancent, vous pouvez abandonner ou poursuivre l'opération. – Slavo

+1

Sauf si votre exemple est très mauvais, je suis d'accord avec @Slavo. Ce n'est pas comment mettre en œuvre ce que vous essayez d'accomplir. En disant cela, une option coûteuse, mais possible, est de jeter une exception. –

Répondre

0

C'est mieux si vous utilisez Transaction puis, à n'importe quelle exception, annulez toute l'opération. Pour votre code actuel, vous pouvez via une exception et laisser le programme s'arrêter. comme:

throw new Exception("Test Failed - Stopping the program execution"); 
1

Ceci est généralement effectué via Exceptions. Ils se propagent automatiquement dans la pile d'appels. Voici un exemple basé sur votre code:

public class TestFailedException : Exception 
{ 
    public TestFailedException(string message) : base(message) { } 
} 

void Test() 
{ 
    try 
    { 
     Variable1.Value = 1; 
     Variable1.write(); 
     verifyValue(Variable1, 1); 

     //next test steps 
     ... 

     Console.WriteLine("Test succeeded"); 
    } 
    catch (TestFailedException ex) 
    { 
     Console.WriteLine("Test failed: " + ex.Message); 
    } 
} 

private void verifyValue(TypeOfVariable Var, double Value) 
{ 
    Var.read(); 
    if (Var.Value != Value) 
    { 
     throw new TestFailedException("Actual value: " + Var.Value.ToString() 
      + ", expected value: " + Value.ToString()); 
    } 
} 
Questions connexes