c# - 随机失败的 Specflow 测试

标签 c# visual-studio-2010 testing bdd specflow

前言:
虽然我之前在话题Specflow stability中提到过这个问题,我想在一个新话题中再次提出这个问题。这是因为上一个主题的标题具有误导性(我现在认为 Specflow 稳定性不是问题)并且我可以更准确地解决问题。

问题:
当我运行包含 50 个左右测试的完整测试集时,大多数时候随机会有一两个测试失败(有时没有测试失败)。当我将完整的测试集分割成更小的测试集(例如,每个单独的用户故事有 7 或 8 个测试的测试集),并且这些集分别运行时,所有测试都通过了。就像 Luke McGregor 在 Specflow stability 中所说的那样,似乎测试正在共享数据,因此失败了。但为什么只有在运行完整集时才会发生这种情况,而不是在我使用较小的集时发生?

背景:
我正在尝试运行一组 50 个左右的 Specflow 测试。所有这些测试都是为了测试网站的用户界面而设计的。测试在 Visual Studio 2010 中运行,使用 MsTest 作为运行器工具。使用的浏览器是FireFox。目前,测试中采取的步骤是:

  • 在每个场景之前启动一个新的 IIS 进程和一个新的 BrowserSession;
  • 场景运行;
  • 在每个场景之后,IIS Proccess 和 BrowserSession 都会终止;

我在每个单独的测试场景之前启动一个新的 IIS 进程和一个新的 BrowserSession 的原因是为了最大限度地减少 Luke 提到的“数据共享”的风险。可惜无济于事。

我现在有点迷失了问题所在。我在这里是否遗漏了一些明显的(或可能不那么明显的)东西?

提前致谢!

最佳答案

如果您能举出一些测试失败的例子,将会有所帮助。

测试是否因为在页面上找不到某些元素而失败? 如果是这种情况,如果您使用的是 WebDriver,我建议您启用隐式等待。 这会使您的测试套件运行速度变慢,但您将获得稳定性。

WebDriver driver = new FirefoxDriver();
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));

通过浏览器进行测试可能会导致随机失败,特别是如果您的测试不是为了等待元素出现在页面上而设计的。 ajax 调用也会让事情变得非常棘手。

附带说明一下,我建议您避免运行新浏览器并在每次测试前启动 IIS。原因是您的测试套件需要很长时间才能运行。 相反,我建议: - 在测试套件的开头只运行一次 IIS。 (你可以使用标签 [BeforeTestRun]) - 在测试套件开始时只打开一次浏览器 session 。 ([测试运行前]) - 在每次测试结束时,只需注销用户即可清除所有 cookie。 ([AfterScenario])

这将大大加快您的测试套件的速度。

关于共享状态,我建议您使用 [BeforeScenario] 属性重置测试使用的所有数据。 因此,例如,如果您的测试在数据库中设置数据,您将在每次测试运行之前清理数据库。

最后,确保您的测试是自包含的:不应使用其他测试使用的数据。测试需要始终从干净的初始状态运行并创建所需的数据。

关于c# - 随机失败的 Specflow 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12728437/

相关文章:

c# - 与 ASP.NET 标识表和自定义表的多对多关系

c# - 绑定(bind)到静态类实例中的属性

c# - VB.NET 人员在 C# 中的运算符重载

testing - 如何在测试管理器中有效地处理需求?

c# - 单元测试的 Web 资源

c++ - VS 2010 中的 Lambda 表达式与 gcc 相对

.net - Visual Studio vb.net 转到行快捷键(Ctrl + G)不起作用?

c++ - 使Boost工作(Visual Studio 2010 Windows 2007)

java - 为使用 Struts 构建的网站编写中间层测试

ruby - 有没有什么好的ruby测试溯源方案?