2013-09-16 117 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

是否有任何理由你沒有使用單元測試框架和'斷言'? –

+3

您正試圖通過使用返回語句和函數完成來實現原子操作。我認爲這不是一個很好的方法。相反,您可以實現將所有語句作爲事務執行的類,並根據它們拋出的異常,可以中止或繼續操作。 – 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()); 
    } 
}