我有黄瓜测试可以同时在多个设备和模拟器上运行。虽然我能够在jenkins中使用多个作业并对其进行参数化,但我不认为这是最好的方法,因为将来我们可以添加更多设备,而且我不希望在jenkins中有无尽的工作。
当我尝试使用rake任务时,我发现它按顺序执行而不是并行执行
这是两个佣金任务:
def run_cucumber(profile)
Cucumber::Rake::Task.new do |t|
t.profile = profile
end
Rake::MultiTask[:cucumber].invoke
end
task 'Device1' do |t|
run_cucumber('MotoZ2Play')
end
task 'Device2' do |t|
run_cucumber('MotoG5Plus')
end
以下是我使用multi task
multitask 'build_parallel' => ['Device1', 'Device2']
这似乎又不是并行执行,而是按顺序执行。
我尝试使用代码实现并行测试gem:
Parallel.map([:Device1,:Device2,:Device3,:Device4,:Device5]) {|task| Rake::Task[task].invoke }
但这似乎在我的黄瓜特征文件中执行随机场景,我们希望场景按照我们编写的顺序执行。
如何实现并行rake任务?
更新
通过使用解决它
Parallel.each
代替Parallel.map
答案 0 :(得分:1)
有一个名为parallel_tests
https://github.com/grosser/parallel_tests的gem,它使您可以创建自定义的rake任务并并行运行它们。
您还可以指定要使用的CPU数量。
这是我刚才做的一些简单示例:
namespace :my_task do
task :a => :environment do
100.times {
puts "A"
}
end
task :b => :environment do
100.times {
puts "B"
}
end
task :c => :environment do
Rake::Task["my_task:a"].execute
Rake::Task["my_task:b"].execute
end
end
输出类似于:
B
B
B
B
A
A
B
B
B
B
B
B
B
B
B
B
A
A
A
A
A
A
...
我希望有帮助。
欢呼
答案 1 :(得分:1)
最好的解决方案是使用drake
gem,它是rake
的分支,增加了并发支持。我不知道为什么multitask
对您不起作用,但是主要的问题是您无法指定运行Rakefile的并发量。使用drake时,可以通过-j选项。它类似于make
的-j选项。
安装方式:
gem install drake
假设您有一个Rakefile,如下所示:
task :a do
sleep 5
puts "a"
end
如果您运行drake -j2
,则它将以2并发运行,因此5秒钟后,“ a”和“ b”将同时打印。
但是,如果您运行drake
(或drake -j1
),则5s后将只看到“ a”,然后再5s后将看到“ b”。
Drake不再被维护,但是它仍然运行良好。我已经使用了8年的时间来开发Phusion Passenger。