2014-09-03 37 views
0

我已經在WPF C#應用程序中使用SpecFlow而最近開始,對於UI測試。我有一個運行一系列鏈接場景的功能,我想知道是否有一種方法可以在某個場景失敗時停止執行功能。我知道如果調試可以停止執行,但我想知道是否可以在運行時停止執行。我一直在考慮試圖在[AfterScenario()]方法中停止它。這可以做到嗎?SpecFlow停止功能的情況下,一個方案失敗

[AfterScenario()] 
public static void After() 
{ 
    if (TestContext.CurrentContext.Result.State != TestState.Success) 
    { 
     //stop feature from going to the next scenario 
    } 
} 
+3

這讓我聞到了味道。這聽起來像你有一個順序依賴於你的方案,這可能最終導致你的問題。你可以做的是一起走的告誡東西[沿着這些線路(http://stackoverflow.com/questions/24928270/is-it-valid-to-have-specflow-features-depending-on-other-features)與這個問題和答案。我相信你會更好地讓每個場景獨立。 – 2014-09-03 14:06:36

+0

如果您的測試是由其他測試運行者運行的,該怎麼辦? Specrun和ncruch都將並行運行測試,這將破壞您的情況。構建服務器上使用的運行器也可能以不同的順序運行它們。例如Team City似乎按字母順序運行測試。 – 2014-09-03 22:06:05

+0

你能舉一個例子說明你如何將這些場景連接在一起?這可能有助於理解你的用例。 – 2014-09-03 22:07:58

回答

2

使用Feature Context,你很可能有每個句子開始這樣的事情...

Given Previous tests did not fail 

在那句話,你驗證當前的功能方面沒有虛假值。這可能看起來像這樣...

bool testsPass = FeatureContext.Current["TestsPass"]; 
Assert.IsTrue(testsPass); 

你必須記住在任何斷言之前設置此值。副手,這可能是這個樣子......

bool testPassed = //something to test 
FeatureContext.Current["testsPass"] = testPassed; 
Assert.IsTrue(testPassed); 

正如評論說,通常它不是期望的場景總是在一個特定的順序運行是個好主意。取決於跑步者,他們可能無法按預期行事。

注意:第二次看,BeforeScenario可能會更好,但我仍然建議使用@serial標籤或其他東西來表明它在做什麼。

0

我不知道,如果停止整個功能運行是可能的,畢竟真的那麼specflow確實是產生在你選擇的框架,然後由一些測試運行運行測試。我知道沒有一個單元測試運行人員會允許在一個失敗的情況下完全中止所有其他測試。但這並不意味着你想要的是不可能的。

我能想到的辦法「假」你想要什麼,但它是一個壞主意。您可以在AfterScenario中設置某種標誌(例如在磁盤上創建文件或設置互斥鎖),然後在BeforeScenario中檢查此標誌並快速失敗(帶有類似'跳過測試以檢測到以前失敗'的消息)if該標誌存在。您可以清除BeforeFeature上的標誌以確保測試始終清潔。

就像我說的,我認爲這是一個壞主意,你真的應該重新考慮如何你的測試工作。

根據您最後的評論給予額外的信息看來,即使你重新創建的特徵DB,然後在乾淨的數據庫運行多個場景,其實每個場景都需要自己乾淨的數據庫。你能不能爲每個場景創建一個新的數據庫,然後讓一個場景在給定的場景中創建它需要的所有數據,然後只測試一件事情?從長遠來看,這似乎更具可擴展性和可維護性。

我以前做過類似這樣的東西,會爲每個場景一個新的數據庫和它的工作確定。

相關問題