一些设置:我们是一个使用Jruby / Cucumber为我们的ETL过程编写验收测试的数据仓库线。这个端到端的流程包括连续启动~15个Informatica工作流程。我之所以提到这一点,那么任何熟悉Informatica的人都会明白为什么当我说运行单个Cucumber场景需要大约3分钟时。将其中的20个放入一个功能中,现在运行一个小时。
我们使用Jenkins作为CI服务器每晚进行黄瓜测试。目前,如果我们有一个场景失败,我们会进入并修复有问题的代码,然后必须再次启动整个作业,等待一个小时的反馈。我们正在寻找的是一种使用可选参数启动jenkins工作的方法,该参数只会重新运行上一次运行失败的情况,从而为我们提供更快的红绿转向。
关于重新运行失败方案的其他一些问题,我能够提出以下Rake任务:
Cucumber::Rake::Task.new(:task_name) do |t|
rerun_file = "temp/task_name_rerun.txt"
tags = "--tags ~@wip --tags @task_name"
html_output = "--format html --out features/build_results/task_name.html"
junit_output = '--format junit --out features/build_results/reports'
rerun_output = "--format rerun --out #{rerun_file}"
outputs = [html_output, junit_output, rerun_output]
if (ENV['Rerun'] == 'TRUE')
t.cucumber_opts = "@#{rerun_file} #{html_output}"
else
t.cucumber_opts = "--format pretty #{tags} #{outputs.join(' ')}"
end
end
当我第一次使用Rerun = FALSE运行时,它运行得很漂亮,并且完全按预期创建task_name_rerun.txt文件。然而,当我打开Rerun并再次启动它时,就好像我没有任何情况通过它,给出了这个输出:
C:\jruby-1.7.20\bin\jruby.exe --1.9 -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) C:\jruby-1.7.20\bin/rake task_name
io/console not supported; tty will not be manipulated
C:/jruby-1.7.20/bin/jruby -S bundle exec cucumber @temp/task_name_rerun.txt --format html --out features/build_results/task_name.html
io/console not supported; tty will not be manipulated
io/console not supported; tty will not be manipulated
Process finished with exit code 0
当我改变选项只是
时t.cucumber_opts = "@#{rerun_file}"
确实可以找到该方案,但现在无法找到相关的步骤:
C:\jruby-1.7.20\bin\jruby.exe --1.9 -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) C:\jruby-1.7.20\bin/rake task_name
io/console not supported; tty will not be manipulated
C:/jruby-1.7.20/bin/jruby -S bundle exec cucumber @temp/task_name_rerun.txt
io/console not supported; tty will not be manipulated
io/console not supported; tty will not be manipulated
@task_name
Feature: My Feature
Scenario: One should Equal One # features/scenarios/extended/path/my_test.feature:4
Given I have a passing test # features/scenarios/extended/path/my_test.feature:5
1 scenario (1 undefined)
1 step (1 undefined)
0m0.180s
You can implement step definitions for undefined steps with these snippets:
Given(/^I have a passing test$/) do
pending # Write code here that turns the phrase above into concrete actions
end
Process finished with exit code 0
所以,我的问题有点双重:
1)是否不能将黄瓜与重新运行文件一起使用并应用其他格式?我发现的所有其他相关问题都涉及立即重新运行Rake任务,因此失败方案的构建报告仍将发布到Jenkins。但是,由于我想再次启动它只执行重新运行,如果Jenkins找不到最近的html报告,if if会将作业标记为不稳定,即使所有场景都变为绿色。我还希望再次从重新运行中输出故障,这样如果说10个场景最初失败,我们修复其中的5个然后重新运行,那么rerun.txt文件将只包含5个最近的失败。
2)我不确定为什么重新运行突然无法找到我的步骤定义。我目前的猜测是因为我的功能文件不是直接在features / scenarios /中。这在基于标签运行之前从未给我们带来过问题,因此我不明白为什么使用场景行号调出特定功能应该突然打破这一点。我还没有验证移动文件是否有效。
编辑:我用第二个问题解决了问题。上面我使用了一堆虚拟文件/文件夹名称来发布问题,在我们的实际测试套件中,嵌套文件夹名称中有空格。删除空格后,它就能正常运行测试。
一些可能有用的额外细节:
答案 0 :(得分:0)
事实证明,解决方案是双重的。一个问题是我们的一些实际文件夹名称中有空格。显然,Cucumber在使用标签运行时并不关心空格,但在通过文件传递时失败(这很有意义)。重命名所有文件夹解决了第二个问题,它不会再次运行。
通过升级到最新版本的Cucumber(2.0.2)解决了无法使用其他格式和输出重新运行的第一个问题的解决方案。我无法将其跟踪到特定的更改日志,但是一旦我升级它就开始工作而没有其他更改。