Appium Appium grid ----appium 的并行化测试

lucktail · 2014年04月16日 · 最后由 Samuel Yang 回复于 2018年05月07日 · 7426 次阅读
本帖已被设为精华帖!

知道 selenium grid2 可以提供并行化。
可是怎么把它应用到 Appium 上啊,研究了一个礼拜一筹莫展。
希望大家能给点儿思路,谢谢~
并行化做的好痛苦啊!!

----------目前的一些进展,初步实现并行化---------
---希望对大家有所帮助---
步骤:
1.下载 selenium-server-standalone-2.41.0.jar
地址:http://selenium-release.storage.googleapis.com/index.html?path=2.41/
2.启动配置 nodeconfig.json
3.启动命令行启动 hub(已经安装了 java jdk)java -jar selenium-server-standalone-2.41.0.jar -role hub
4.启动 appium server
5.能在 http://localhost:4444/grid/consolehub 上注册的 node中找到
6.执行测试脚本。

detail:
1.如何配置 nodeconfig.json
感谢 @seveniruby 在 3 楼提供重要思路---修改 nodeconfig 文件。
感谢 @arnox 在 9 楼提到

Grid node config file:
https://github.com/appium/appium/blob/master/docs/en/grid.md

ps:官方的文档 grid.md 中"host": ,没有加上双引号的,估计是它的疏漏。应改为"host": ""

感谢 @vigossjjj 在 19 楼的 nodeconfig.json 源码

2.测试脚本修改
self.driver = webdriver.Remote(
command_executor='http://*.*.*.*:4723/wd/hub',
desired_capabilities={
'browserName': '',
'device': 'iPhone Simulator',
'platform': 'Mac',
'version': '7.1',
'app': app_remote
})
ps:command_executor 中 *.*.*.*写的是要执行此测试用例的 node(appium server) 的 ip 地址.

存在的问题:
1.hub 端不知道如何获取 node 的测试信息
2.如果执行的测试用例触发 app 漏洞,如何定位 app 出错位置 愁人啊!
希望大家给点思路。

共收到 54 条回复 时间 点赞

需要对 Appium 的源码进行更改吗?

nodeconfig 参数可以做到. 不过比较坑的是, 因为 appium 会固定占用 2 个端口, 所以几个 pc 理论上只能用来同时控制一个手机.
所以为了避免冲突, 你需要调整对应的端口数字, 4723 和 4724. 这两个端口在参数里面貌似不能完全修改, 所以还需要修改代码
当然不知道新版本怎么样了

#3 楼 @seveniruby 虽然不是很懂,不过先谢谢。。……_^
我想法是一个 Server(hub) 然后 有多个 Client,每个 Client 控制一个手机或者模拟器。n 个 client 分别执行不同的测试用例......以达到并行测试的目的。
所以不是很明白 “几个 pc 理论上只能用来同时控制一个手机” 是什么意思?
我是用 appium.dmg 安装的,不是通过命令行,这样还可以修改 nodeconfig 参数 或者修改代码吗?(是不是最好修改了代码后通过命令行安装?)
并行化这个问题纠结了好久,实在是不知道从何下手,谢谢了~


是这个文件吗?可是找不到它啊

#4 楼 @lucktail 写错了, 是理论上一个 pc 只能控制一个手机, 修改代码才能实现一个 pc 控制多个手机.
在 grid 模式下, 你可以认为 appium server 就变成了 grid 里面的 client. 这块内容 appium 设计的不太好, 希望后续会有所改善.

下个月等 1.0 放出来, 我会做个完整的 grid 模型给大家做参考.

#7 楼 @seveniruby 嗯~ 太好了!
因为马上就是毕设的中期检查,所以想抓紧把并行化做出来。我只是想实现一台 PC 一部手机就好。如果 appium server 是 grid 里的 client ,那 hub 的角色由谁来充当呢?

Grid Hub 你需要自己启用啊,和 selenium Grid2.0 hub 启用一样的

#10 楼 @arnox 是的 因为 selenium 和 appium 在协议上一致, 所以 grid 可以通用

#11 楼 @seveniruby 不用改代码 我一直用的好好的 #11 楼 @seveniruby

#12 楼 @vigossjjj 你是通过参数配置修改端口的吗

#9 楼 @arnox 太好了!! 我学习一下

#10 楼 @arnox 恩恩,因为以前没有接触过 selenium 所以都不知道从何下手。我去看看 selenium grid2.0 thx~

#12 楼 @vigossjjj 你好,我尝试了一下编写 nodeconfig.json 文件,我已经启动了 hub 端口默认 4444.但是启动 appium server 的时候报错。你的 nodeconfig 文件是怎么写的啊。

报错信息为:

好难过啊!

报错问题已解决:代码第 17 行 把 127.0.0.1 改为 “127.0.0.1” 也就是加上双引号。
ps:官方的文档 grid.md 中是没有加上双引号的,估计是它的疏漏。

#17 楼 @lucktail @seveniruby 多手机连接肯定没问题的,用了半年了.....

#19 楼 @vigossjjj 嗯 谢了~ 那个 “browserName”:“IOS_TestAnget1” 是什么意思啊 我的 “browserName” 是空着的

#19 楼 @vigossjjj 我是之前看 appium 的 google groups 里面提到, 说是因为端口会导致一个 pc 只能同时连接一个手机端. 你有没有看过, 如果是同时连接多个手机的时候, 端口是如何分配的? adb forward 的端口会根据你配置的启动端口一直 +1 吗

#20 楼 @lucktail 那个是自定义的字符串 连接多个设备执行时我为了区分多个设备 #21 楼 @seveniruby #20 楼 @lucktail

#21 楼 @seveniruby Android 的没研究,iOS 的本身一台机器也只能实例一个 instrument 也就是一个 iphone 我是多台 Mac 分布执行 #21 楼 @seveniruby

#23 楼 @vigossjjj 晕 他的问题是一个电脑要连接多个手机吧

我也在弄这块,请问楼主实现了吗?

#1 楼 @lucktail 我也在弄这块,请问楼主实现了吗?

#23 楼 @seveniruby 你可以试试用多个端口启动多个服务 一个手机指一个 server 端口

服务器本森会开 2 个端口, 4723 和 4724, 麻烦的是 4724 必须和手机里面的 app 启动的端口保持一致, 所以估计还是需要代码. appium 估计也会考虑这个问题吧

#26 楼 @yujie 嗯 就是按照大家回复里的方法 修改 nodeconfig 文件 然后 开了一个 selenium-grid 的 hub 基本是实现了。但还有一个问题,就是 hub 怎么收集 node 的测试结果

#29 楼 @lucktail 请问,nodeconfig 文件在哪里修改啊。/Users/me/nodeconfig 没有啊。你那边实现了连接多台手机了么?

#30 楼 @benlooking 可以自己新建一个 nodeconfig.json 文件。 目前一台电脑只能连接一部手机

#31 楼 @lucktail 恩,我新建了文件,我要怎么用他呢。node . -V --nodeconfig /path/to/nodeconfig.json 不行样。。只能连接一部手机么,那请问 grid 有什么用处呢?

  1. 不知道你说的节点测试信息是什么,http://localhost:4444/grid/api/proxy?id=nodeip:nodeport 可以获取这个节点的一些信息。 2.测试请求首先发到 hub,然后 hub 再分发到具体的 node,这个过程可以从日志里找到。当然可能不一定能匹配到你运行的测试用例,不知道在 Capabilities 里加个唯一 id 可否来标记。

#1 楼 @lucktail 请问楼主,这个问题解决了没?我也想知道。

这个问题,有人知道怎么解了吗

#3 楼 @seveniruby 请问如何做到一个 PC 机对多个终端设备进行测试?代码应该如何改,nodeconfig.json 文件应该怎么配置?

{
  "capabilities":
      [
       {
          "platformName":"iOS",
          "platformVersion":"7.1.2",
          "deviceName":"iPhone4s",
          "app":"com.ios.app"
        }
      ],
  "configuration":
  {
    "cleanUpCycle":2000,
    "timeout":30000,
    "proxy":"org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
    "url":"http://0.0.0.0:5000/wd/hub",
    "host":"0.0.0.0",
    "port":5000,
    "maxSession":10,
    "register":true,
    "registerCycle":1000,
    "hubPort":4444,
    "hubHost":"0.0.0.0"
  }
}

#36 楼 @wangcityboy 新版本不需要修改代码了, 通过参数可以设置不同的端口了. iOS 的我不熟悉, 你问其他同学吧. 买不起 iphone

#37 楼 @seveniruby 请问怎样设置参数?

#38 楼 @wangcityboy 请问你弄出来了么?我配置了两份 config.json,然后启动了两个 appium 服务,但是还是不能并行测试啊,mac instrument 只能同时操作一个设备。。和直接配置 appium 启动端口一样,没法实现并行测试。。

#23 楼 @vigossjjj 请问分布执行怎么弄的?最近也在搞这个,发现 mac 只能同时操作一个设备,根本无法并行测试啊。。

#32 楼 @benlooking 同感,grid 也无法实现 ios 的并行测试啊。。。

#6 楼 @seveniruby 请问如何修改代码能实现一台 mac 同时连接多个设备呢?

IOS 没戏!

目前只在 Android 上测试并发成功

#27 楼 @vigossjjj 同你的这个想法

1 device per instruments. So 1 device per MAC. Its an Apple limitation

#44 楼 @a00ium 并发的代码发来看看,用线程》?

#46 楼 @doria 1 device per instrument,2 device 2 instruments,你连多少台设备,就能开多少个 instrument

@a00ium 同求代码?

按照上面你们所说的,我的 appium server 还是没能注册成节点
问题出在哪儿了呢

楼主现在解决了吗,一台机器,链接多台手机?

斯拉 回复

解决了么

补充:使用 UI Automator2 时,还需在启动 appium server 指定 systemPort。如:
node . --nodeconfig nodeconfig1.json -a 127.0.0.1 -p 4724 -bp 8189 --session-override -U emulator-5556 --default-capabilities '{"systemPort": 10010}'
官方已有说明:https://github.com/appium/appium/blob/master/docs/en/advanced-concepts/parallel-tests.md

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册