我最初在WPF C#应用程序中开始使用SpecFlow进行UI测试。我有一个运行一系列链接场景的功能,我想知道是否有一种方法可以在一个场景失败时停止执行该功能。我知道如果调试可以停止执行,但我想知道我是否可以在运行时停止它。我一直在考虑尝试在[AfterScenario()]方法中停止它。可以这样做吗?
[AfterScenario()]
public static void After()
{
if (TestContext.CurrentContext.Result.State != TestState.Success)
{
//stop feature from going to the next scenario
}
}
答案 0 :(得分: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标签或其他东西来表明它正在做什么。
答案 1 :(得分:0)
我不知道是否可以停止整个功能运行,毕竟所有的specflow都会在您选择的框架中生成测试,然后由一些测试运行器运行。我知道没有单元测试运行器允许完全中止所有其他测试,如果一个失败。但这并不意味着你想要的东西是不可能的。
我可以想出一种“伪造”你想要的东西的方法,但这是一个坏主意。您可以在AfterScenario中设置某种标志(如在磁盘上创建文件或设置互斥锁),然后在BeforeScenario中检查此标志并快速失败(如“检测到先前检测到故障”之类的消息)国旗存在。您可以清除BeforeFeature上的标志,以确保测试始终开始清洁。
就像我说的,我认为这是一个坏主意,你应该重新考虑你的测试是如何工作的。
根据您上次评论中提供的额外信息,即使您为该功能重新创建数据库,然后在干净数据库上运行多个方案,实际上每个方案都需要自己的干净数据库。你能不为每个场景创建一个新的数据库,然后让一个场景创建它所需的所有数据,然后只测试一个东西?从长远来看,这对我来说似乎更具可扩展性和可维护性。
之前我做过类似的事情并为每个场景创建了一个新的数据库,并且运行正常。