2013-09-16 4 views
-1

Я использую C# для целей тестирования. Тест состоит из нескольких этапов тестирования. Если один тестовый шаг завершился неудачно, весь тест должен быть прерван. Один тест шаг может выглядеть следующим образом:Возврат вызывающей функции

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

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

Я хотел бы передать некоторые команды в собственные функции, чтобы обеспечить эффективное программирование тестового примера. Функция для вышеприведенного кода будет выглядеть так.

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

И тест будет выглядеть следующим образом

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

Моя проблема теперь, что return функция verifyValue только эффекты verifyValue но не вызывающей функции (так называемый тест).

Есть ли возможность прервать вызывающую функцию?

+4

Есть ли причина, по которой вы не используете модульную систему тестирования и 'Assert'? –

+3

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

+1

Если ваш пример очень плохой, я согласен с @Slavo. Это не то, как реализовать то, что вы пытаетесь достичь. Говоря это, дорогой, но возможный вариант, бросает исключение. –

ответ

0

Лучше, если вы используете транзакцию, а затем в любом случае прекратите все операции. Для вашего текущего кода вы можете с помощью исключения и позволить программе останавливаться. например:

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

Обычно это делается через Exceptions. Они автоматически распространяются через стек вызовов. Вот пример, основанный на вашем коде:

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()); 
    } 
} 
Смежные вопросы