针对特定异常(Ruby),立即重新运行失败的Cucumber测试

3

背景:

我们在 Windows 虚拟机上通过 Jenkins 运行 Cucumber。我们经常会遇到以下异常(可能每天两次左右,而套件运行 5 或 6 次):

No connection could be made because the target machine actively refused it. - connect(2)  (Errno::ECONNREFUSED)

这个异常是没有规律的。它可以在任何步骤、任何代码行上发生。我偶尔也会(虽然很少)在本地遇到它。Cucumber失去了与浏览器交互的所有能力,之后的所有测试都失败。

在这段代码中

After do |scenario|
  if scenario.failed?

我想检查是否出现了特定的异常。如果是,我将通过系统调用关闭Chrome浏览器,然后再重新启动它(这很容易)。但是,我希望重新运行刚刚失败的场景,然后继续执行剩余的测试套件。这可能吗?
顺便说一下:我知道浏览器没有关闭有两个原因。1. 在本地我可以看到它。2. 尝试重新启动测试会导致VM上失败,因为Chrome被卡住了。VM没有关机。请记住,这种情况有时也会在本地发生。我花了几个小时搜索解决此问题的解决方案,但我们没有找到有效的方法。
版本:
Cucumber 1.3.8
ruby 1.9.2
chromedriver 2.4 
chrome 29 (We run tests against a javascript environment that uses GWT, which often breaks with new chrome releases)

提前感谢您!

2个回答

3
为什么不使用现有的重新运行格式化程序:
bundle exec cucumber --format rerun --out tmp/failed.txt

失败的测试用例将与行号一起存储在failed.txt中(--out是可选项)。这将在运行后重试所有失败的测试用例。

我不确定是否可以在现有运行中运行/调用场景,因此对于损坏的场景,重新启动Chrome -> 运行失败的测试用例 -> 继续可能无法正常工作,因为您的运行尚未完成。

尽管如此,您可以按照类似的方式捕获异常(伪代码):

After do |scenario|
  if scenario.failed?
  e = scenario.exception

  <match e.class with your exception's class>

如果匹配成功,就使用cucumber @failed.txt创建一个命令,然后跟上其他想要运行的场景。
cucumber @failed.txt features/sample.feature -t @test -t @all -n 'test scenario3' ...

然后单独执行此命令。这将首先执行“failed.txt”文件中的场景(在使用rerun格式化程序时创建),然后继续执行其他测试。

希望这可以帮到你。

我不想在公共场合承认这一点,因为我很可能会受到责备,但我们的一些测试必须按特定顺序运行。这是我们数据和服务的本质。我们对某些字段进行全局验证,我们整个套件的目的就是像真正的用户一样操作,即从开始到结束。我们尽力降低测试之间的依赖性,但正如我所说,这是我们服务的本质。 - Tyler MacMillan
我理解,但是是的,依赖于运行顺序的测试不可靠,而且强烈不建议使用。也许你可以使用实例变量来存储相关/共享数据/状态,并使你的测试更加原子化。除此之外,我没有看到简单的方法来实现你所要求的(因为它本质上需要在cucumber运行中执行cucumber)。 - Sam
1
即使在黄瓜内部踢掉黄瓜也是可能的,但我相信那样会覆盖我的HTML输出,从而有效地破坏之前测试的结果。感谢您在此事上的建议。我可能不得不安排运行除第一个失败的测试以外的所有测试,尽管这仍然可能导致后续测试的失败(由于我提到的那些依赖关系)。 - Tyler MacMillan

-1

你可以直接说:

fail "Your failure message here..."

如果这样做,你会得到一个带有该消息的运行时错误


1
虽然这是真的,但它几乎与问题无关。 - Tyler MacMillan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接