Appium:Ruby:使用Appium for iOS的分布式测试
我有一个完整的自动化测试套件,使用ruby和Appium为移动自动化编写 我在一台机器上的一个模拟器中运行这些套件,运行56个测试用例需要很多时间,大约1小时(我们有系统测试用例,其中集成了多个检查,如数据库/Api/功能)。我们有更多的额外测试用例添加到我们的方法中 我们已经实现了在3台mac机器上运行我们的测试,目前运行的是集成到Jenkins中的不同cucumber标记。然而,增加更多的测试只会花费我们更多的时间或更多的mac 使用xcode 9,我们可以在一台机器上同时启动多个模拟器,我想知道,是否有任何示例场景或文档说明如何在一台mac机器上跨模拟器实现分布式测试 我曾尝试用不同的平台版本加载两到三个不同的期望功能,但它只按顺序加载测试 我在网上浏览了很多资料,这些资料只有在android中实现这一点的步骤。iOS支持吗 或者有没有人能提供能帮助我的链接?到 1.在一个mac中跨各种模拟器实施分布式测试 2.使用cucumber标记分发测试,为每个所需功能创建实例 更新: 我曾尝试实现多线程选项,并尝试用每个线程启动对特定模拟器创建实例的测试。但是,我发现这些测试不是并行运行的,而是顺序运行的 这是我的代码:Appium:Ruby:使用Appium for iOS的分布式测试,ios,automation,cucumber,appium,distributed-computing,Ios,Automation,Cucumber,Appium,Distributed Computing,我有一个完整的自动化测试套件,使用ruby和Appium为移动自动化编写 我在一台机器上的一个模拟器中运行这些套件,运行56个测试用例需要很多时间,大约1小时(我们有系统测试用例,其中集成了多个检查,如数据库/Api/功能)。我们有更多的额外测试用例添加到我们的方法中 我们已经实现了在3台mac机器上运行我们的测试,目前运行的是集成到Jenkins中的不同cucumber标记。然而,增加更多的测试只会花费我们更多的时间或更多的mac 使用xcode 9,我们可以在一台机器上同时启动多个模拟器,我
def start_app(device_id, wdalocalport)
caps_config = {
platformName: "iOS",
wdaLocalPort: wdalocalport,
deviceName: "iPhone Simulator", #update device as per your need
app: (File.join(File.dirname(__FILE__), "Sequoia.app")),
bundleId: "something",
automationName: "XCUITest",
xcodeOrgId: "something",
xcodeSigningId: "iPhone Developer",
#platformVersion: "10.2",
noReset: "true",
fullReset: "false",
showIOSLog: "true",
autoAcceptAlerts: "true",
showXcodeLog: "true",
useNewWDA: "true",
resetOnSessionStartOnly: "true",
udid: device_id }
appium_lib_config={ port: 4723 }
$opts={ caps: caps_config, appium_lib: appium_lib_config }
setup
end
def setup
@appium = Appium::Driver.new($opts)
@appium.start_driver
#Makes all appium_lib methods accessible from steps
#Starts appium driver before the tests begin
end
def test(device1,device2)
threads = []
threads << Thread.new {
start_app(device1, '8100')
}
threads << Thread.new {
start_app(device2, '8200')
}
threads.each(&:join)
end
end
我的hooks.rb
Before do
check
end
def check
if ENV['DEVICE'] == 'iphone7'
start_app('iPhone6','port','udid')
elsif ENV['DEVICE'] == 'iphone8'
start_app('iphone6','port','udid')
else
puts "Device not"
end
end
我一直在使用
设备而不是。不确定我遗漏了什么。您需要创建一个方法,首先在Rakefile中调用cucumber rake,如下所示:
def run_cucumber(cucumber_options)
Cucumber::Rake::Task.new do |t|
t.cucumber_opts = cucumber_options
end
Rake::Task[:cucumber].invoke
end
此方法将需要多个选项。可以传递与在命令行上传递相同的选项,如下所示:
-r features features/test.feature --format pretty --tags @test1
在此之后,在同一Rakefile中为特定配置定义rake任务:
task :iphone_7 do |t|
ENV["DEVICE"] = "iphone 7"
run_cucumber('-r features features/test.feature --format pretty --tags @test1')
end
task :iphone_8 do |t|
ENV["DEVICE"] = "iphone 8"
run_cucumber('-r features features/test.feature --format pretty --tags @test2')
end
这里,ENV[“DEVICE”]用于设置设备配置。您可以在env.rb in Before块中使用此变量来初始化测试。在Before块中,可以基于此环境变量初始化设备
您可以根据需要创建像这样的rake任务
然后,您可以使用ruby的并行gem同时调用多个任务。示例见此链接->
只需在并行对象中传递不同类型的rake任务作为参数。
例如:
然后触发run_parallel rake任务来执行整个代码。
例如:
您可以使用多线程+异步执行来分发测试,但要做到这一点,需要查看您的框架是否支持这一点。如果你有兴趣,我可以帮你。@PankajKumarKatiyar我喜欢你的帮助。我正在使用cucumber框架,用ruby和gherkin编写测试。我们正在使用appium进行移动测试。我尝试在不同的平台版本中使用两组不同的功能,并实现了线程,使每个```线程都有实例=[][device1,device2].每个do | capability | threads@PankajKumarKatiyar如果您能帮助我实现,我将非常高兴:)请告诉我与您联系的最佳方式?因为stackoverflow不允许大量的comments@PankajKumarKatiyar我尝试过启动实现多线程概念的模拟器。但是,这种行为是不可预料的。我相信这需要一些技巧,请让我知道,如果你的在线和你的输入可以帮助我为你的答复非常感谢。我会检查一下,半个小时后给你更新!同时,今天早上,我试图用多线程实现并行测试,我已经更新了问题。你能看一下吗?>另外,我对rake
的实现不太清楚,因为我对此一无所知。我了解cucumber\u选项
,但对ENV[“设备”]=“iphone6”了解不多。你的意思是说我使用了
ENV[“DEVICE”]==iphone6,如果在
之前
中的条件钩住并加载我已标记到该特定ENV的所需功能,我们是否可以进行连接,以便在我从你那里了解这一点时更好地理解?Skype、slack或hangout?是的,您可以在挂接和加载所需功能之前检查此情况。您可以从中学习如何在项目中编写rake任务->创建rake文件并编写此代码,然后创建一个新的rake任务来并行化它们。我确实创建了一个rake文件,但是我仍然无法理解parallel
gem的实现。我在问题中提到了我实现的代码。你能看一下吗
task :iphone_7 do |t|
ENV["DEVICE"] = "iphone 7"
run_cucumber('-r features features/test.feature --format pretty --tags @test1')
end
task :iphone_8 do |t|
ENV["DEVICE"] = "iphone 8"
run_cucumber('-r features features/test.feature --format pretty --tags @test2')
end
task :run_parallel do |t|
Parallel.map([:iphone_7,:iphone_8]) {|task| Rake::Task[task].invoke }
end
bundle exec rake run_parallel