Appium:Ruby:使用Appium for iOS的分布式测试

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,我们可以在一台机器上同时启动多个模拟器,我

我有一个完整的自动化测试套件,使用ruby和Appium为移动自动化编写

我在一台机器上的一个模拟器中运行这些套件,运行56个测试用例需要很多时间,大约1小时(我们有系统测试用例,其中集成了多个检查,如数据库/Api/功能)。我们有更多的额外测试用例添加到我们的方法中

我们已经实现了在3台mac机器上运行我们的测试,目前运行的是集成到Jenkins中的不同cucumber标记。然而,增加更多的测试只会花费我们更多的时间或更多的mac

使用xcode 9,我们可以在一台机器上同时启动多个模拟器,我想知道,是否有任何示例场景或文档说明如何在一台mac机器上跨模拟器实现分布式测试

我曾尝试用不同的平台版本加载两到三个不同的期望功能,但它只按顺序加载测试

我在网上浏览了很多资料,这些资料只有在android中实现这一点的步骤。iOS支持吗

或者有没有人能提供能帮助我的链接?到 1.在一个mac中跨各种模拟器实施分布式测试 2.使用cucumber标记分发测试,为每个所需功能创建实例

更新:

我曾尝试实现多线程选项,并尝试用每个线程启动对特定模拟器创建实例的测试。但是,我发现这些测试不是并行运行的,而是顺序运行的

这是我的代码:

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