Appium:Ruby:iOS版的appium分布式测试

时间:2017-09-21 09:38:45

标签: ios automation cucumber appium distributed-computing

我正在建立一个完全成熟的自动化测试套件,该套件使用带有Appium的ruby编写,用于移动自动化。

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

我们已经实现了在3台mac机器上运行我们的测试,目前运行与Jenkins集成的不同黄瓜标签。但是,更多的测试只会花费我们更多的时间或更多的时间。

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

我曾尝试使用不同的平台版本加载两个或三个不同的所需功能,但它只按顺序加载测试。

我在网上经历了很多材料,只有在android中实现这一目标的步骤。 iOS支持吗?

或者任何人都可以提供可以帮助我的链接?至 1.在一个mac中跨各种模拟器实现分布式测试 2.使用黄瓜标签分发测试,为每个所需的功能创建实例

更新

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

这是我的代码:

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

我使用传递test的{​​{1}}方法调用启动测试。模拟器同时启动,同时安装应用程序,但测试并不平行。

任何帮助即兴发生这种情况的帮助?

我能够使用udid's并行运行,但我仍然发现这种方法以顺序方式运行测试或根本不运行

PFB代码

rake

我的def run_cucumber(cucumber_options) Cucumber::Rake::Task.new do |t| t.cucumber_opts = cucumber_options end Rake::Task[:cucumber].invoke end task :iphone_7 do |t| ENV['DEVICE'] = 'iphone7' run_cucumber('-r features features/test.feature --format pretty --tags @slave1') end task :iphone_8 do |t| ENV['DEVICE'] = 'iphone8' run_cucumber('-r features features/test.feature --format pretty --tags @slave2') end multitask :all => [:iphone_7,:iphone_8]

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 。不知道我错过了什么。

1 个答案:

答案 0 :(得分:2)

您需要创建一个首先在Rakefile中调用黄瓜耙的方法,如下所示:

columnDef.cellRenderer = KeyRenderer;
columnDef.width = 20;
columnDef.editable = false;

此方法需要cucumber_options。您可以传递与传递命令行相同的选项,如下所示:

 import { ICellEditor, ICellEditorParams, ICellRenderer, CellEditorFactory } from 'ag-grid/main';

export class KeyRenderer implements ICellRenderer {

    private params: any;
    htmlDiv: HTMLDivElement;

    init(params) {


        this.htmlDiv = document.createElement("div");
        this.htmlDiv.style.width = "100%";
        this.htmlDiv.style.height = "100%";
        this.htmlDiv.style.textAlign = "center";
        this.htmlDiv.style.verticalAlign = "middle";



        if (params.data.IsKeyField) {
            if (params.data.IsKeyField == true) {
                this.htmlDiv.innerHTML = "<img src='/images/icon/key.png' style='height:15px'/>";
            }
        }

    }

    getGui() {
        return this.htmlDiv;
    }

    refresh(params: any): boolean {
        this.params = params;

        return true;
    }
}

在此之后,在同一个Rakefile中为特定配置定义rake任务:

def run_cucumber(cucumber_options)
  Cucumber::Rake::Task.new do |t|
    t.cucumber_opts = cucumber_options
  end
  Rake::Task[:cucumber].invoke
end

这里,ENV [“DEVICE”]用于设备配置。您可以在Before块中的env.rb中使用此变量来初始化测试。在Before块中,您可以根据此环境变量初始化设备。

您可以根据需要创建这样的rake任务。

然后,您可以使用ruby的并行gem同时调用多个任务。示例在此链接中 - &gt; Ruby Parallel gem 只需将不同类型的rake任务作为Parallel对象中的参数传递。 例如:

-r features features/test.feature --format pretty --tags @test1

然后触发run_parallel 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