SpecFlow停止功能的情况下,一个方案失败

SpecFlow停止功能的情况下,一个方案失败

问题描述:

我已经在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://*.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

使用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标签或其他东西来表明它在做什么。

我不知道,如果停止整个功能运行是可能的,毕竟真的那么specflow确实是产生在你选择的框架,然后由一些测试运行运行测试。我知道没有一个单元测试运行人员会允许在一个失败的情况下完全中止所有其他测试。但这并不意味着你想要的是不可能的。

我能想到的办法“假”你想要什么,但它是一个坏主意。您可以在AfterScenario中设置某种标志(例如在磁盘上创建文件或设置互斥锁),然后在BeforeScenario中检查此标志并快速失败(带有类似'跳过测试以检测到以前失败'的消息)if该标志存在。您可以清除BeforeFeature上的标志以确保测试始终清洁。

就像我说的,我认为这是一个坏主意,你真的应该重新考虑如何你的测试工作。

根据您最后的评论给予额外的信息看来,即使你重新创建的特征DB,然后在干净的数据库运行多个场景,其实每个场景都需要自己干净的数据库。你能不能为每个场景创建一个新的数据库,然后让一个场景在给定的场景中创建它需要的所有数据,然后只测试一件事情?从长远来看,这似乎更具可扩展性和可维护性。

我以前做过类似这样的东西,会为每个场景一个新的数据库和它的工作确定。