UiAutomator 开源项目:小红书移动 UI 并发自动化测试实践之 DisCartierEJ

haifengrundadi · 发布于 2017年06月04日 · 最后由 datafu 回复于 2017年06月06日 · 最后更新自管理员 Lihuazhang · 3095 次阅读
本帖已被设为精华帖!

开源项目:小红书移动UI并发自动化测试实践之DisCartierEJ

@ Arthor: Juan Liu
@ Date : 2017.06.03

相关背景

随着小红书发展,各种自动化产品也在逐渐使用,提高工作效率、节省时间,也更多的保证了正确性。在小红书,移动UI自动化方面,尝试的项目之一就是当前的这个DisCartierEJ项目。

在这个项目进行两个月左右的时候,我写了一篇文章总结了当时的思路小红书自动化平台实践之 Cartier,主要是讲解了思路方面和架构方面,这次更多的是关注代码方面,在架构方面也有了一点点改进。

开源背景

  1. 项目基本上达到了预期的目标,可以无连接的实现多台设备同时并行正确运行。
  2. 开源出来,希望在大家使用的过程中,更加的优化项目和代码。
  3. 实习快结束了,开源也是一次回头过来好好看看设计思路和代码的过程,优化交付给下一位同事。

github地址

DisCartierEJ的地址:https://github.com/haifengrundadi/DisCartierEJ

CartierEJ的地址:https://github.com/haifengrundadi/CariterEJ

DisCartierEJ 的优点

  1. 利用docker将appium及其依赖的工具放在一个容器中,这样使用者(比如开发或者其他相关测试人员等)只需要pull镜像文件,就可以运行了,不需要一个个去安装各种依赖,减去不必要的时间。ps:我刚接触的时候,花了一天多的时间装了各种软件,遇到各种配置问题,更会浪费许多时间,这些时间对仅仅使用的人来说,毫无必要,对需要开发的人来说,犯错还是有价值的。

  2. 利用stf管理设备,这样不管你在哪都可以进行使用手机,不必每次都将手机通过usb连接计算机。更为重要的是,你可以任意选择你想要的手机,选择多台同时运行,相当于一个资源池的概念。ps:你在出差,你身边没有手机,突然想运行一个case,这个时候打开电脑,运行就好。

  3. 多台并行运行case。之前,都是一个计算机上运行一个appium,一个appium server对应一个device,很难将一个case一下子运行在多个设备上,测试兼容性不是很方便。

  4. 在jenkins可以进行巡检,并将结果通过展示出来,(这个还没有实现,有尝试过,但是没有办法把本地运行stf的机器(需要将手机本地连接到一个主机上)当做腾讯云的一个slave,而暂时暂停(ssh连接,如果通过域名,应该是可以作为一个slave的))。

DisCartierEJ 的架构

上图是DisCartierEJ的架构图,下面根据一个使用者的流程对这个图进行介绍。

  1. 深蓝色部分,用户希望自己的case在三台设备上跑一下。
  2. 将自己case pull到github或者能下载的地方

    https://github.com/haifengrundadi/CartierEJ.git

  3. git clone DisCartierEJ代码

    git clone https://github.com/haifengrundadi/DisCartierEJ.git

  4. 将DisCartierEJ中的Dockerfile中的获取CartierEJ的代码更改为步骤2的地址,并生成对应的镜像。

    ...
    #=======================================
    # pull code from git
    #=======================================
    RUN git clone https://github.com/haifengrundadi/CartierEJ.git
    ...

    生成对应的镜像

    docker build -t appium_cartierej_docker:latest .

  5. 运行DisCartierEJ,它会去STF上寻找三台符合要求的设备返回。

  6. 然后将返回来的三个设备信息,根据设备名生产三个文件夹,并将每个设备的信息注入到相应文件夹下的docker_compose.yml中的环境变量中。

  7. 启动up每一个文件夹下的docker_compose.yml,生成对应的容器,每个容器会先启动appium 然后运行case。

  8. 对应的日志会映射在本地,jenkins 根据日志,生成report。

Demo演示

下面我们运行一个实例来演示DisCartierEJ项目。

需求: 将一个login的case运行在stf所有可用的手机上。

前置条件: 先下载Docker,并运行。

正式步骤:

  1. 编写一个login case,所有的case要按照CartierEJ进行编写(非常简单)。

    只需要clone上面的代码即可。

    git clone https://github.com/haifengrundadi/CartierEJ.git

  2. 修改或者按着模板添加自己的功能,然后将代码上传到自己的github上。

    自己现在github上新建一个项目,名字叫CartierEJ。
    其他如何push到github上,看github的提示。

  3. 从github上git clone DisCartierEJ这个项目。将DisCartierEJ中的Dockerfile中的获取CartierEJ的代码更改为步骤2的地址,并生成对应的镜像。

    ...
    #=======================================
    # pull code from git
    #=======================================
    RUN git clone https://github.com/haifengrundadi/CartierEJ.git
    ...

    生成对应的镜像(这个第一次比较慢,因为镜像比较大)

    docker build -t appium_cartierej_docker:latest .

  4. 修改DisCartierEJ的配置文件config.py。见下

  5. 进入到DisCartierEJ的core的generator.py

    python generator.py

config.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# the apk place in container
APK_NAME = "/apk_shell/xxx.apk"

# stf_url address
STF_URL = "http://xxx.xxx.xxx.xxx:7100/api/v1/devices"
"""
access token of stf
STF uses OAuth 2.0 for authentication. In order to use the API,
you will first need to generate an access token. Access tokens
can be easily generated from the STF UI. Just go to the Settings
tab and generate a new access token in Keys section.
Don't forget to save this token somewhere, you will not be able to see it again.
"""
TOKEN = "xxx"

STF_DELETE_URL = "http://xxx.xxx.xxx.xxx:7100/api/v1/user/devices/"

# some variables in desired_capablities
PLATFORM_NAME = 'Android'
NEW_COMMAND_TIMEOUT = 60

# come infomation needed by docker_compose.yml
APPIUM_CARTIEREJ_IMAGE = "appium_cartierej_docker:latest"
PORTS = 4723
APPIUM_CARTIEREJ_CMD = "bash /app_shell/app.sh"
APP_APK_VOLUMES = "/Users/red/xxx/:/apk_shell"

"""
Use device name as directory to save docker_compose.yml and app.sh
Need abs path
"""
DOCKER_COMPOSE_VOLUMES = "xxx/DisCartierEJ/resources/dockercomposes/"

# logs save place in local
LOCAL_LOG_DIR = "/Users/red/xxx/logs/"
APPIUM_CARTIEREJ_LOGS_VOLUMES = LOCAL_LOG_DIR + 'RANDOM:/opt/node/CartierEJ/logs'  # RANDOM为变量在生成的过程中替换

# case to run
CASE_NAME = "test_login.py"

结果

感受

一直坚持到现在,终于要先告一个段落,感谢一直坚持的自己。第一次把自己的代码安装规范一点的样式发出来。首先,发现自己的代码能力还是弱,很多知识不熟悉。第二,写文档对自己真是一个考验,也是一种成长和反思。第三,能心无杂物的去做一件事不容易。还有,把代码拿出来分享只是一个开始和阶段总结,希望大家一起讨论。

后续文章

开源项目:移动自动化测试框架 DisCartierEJ 之 CartierEJ 介绍

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 27 条回复
110 Lihuazhang 将本帖设为了精华贴 06月04日 18:12
168ed0

谢谢分享

15593
168ed0xct012 回复

希望大家可以一起学习。

162b12

感谢分享,感谢开源。。。学习了。

15593
162b12shaoyao520 回复

希望能把思路拿出来和大家一起思考一下

2457

@haifengrundadi 赞分享,继续加油

8139

一直有个问题想问题楼主,无线连接的话手机一定要root,但目前也不是所有手机能root吧,我看到楼主是用三星的,第二个是appium和手机能不同在一台电脑上进行通信吗,我不知道自己有没有看错,你的appium是用docker镜像开的吧,那对应的ip是宿主机ip还是独立ip,如何是独立ip又怎么通讯,我印象中appium一般只会读到所在机器的设备,其他是读不到的,才疏学浅,请赐教,因为我也做了个类似的,现在卡在远程通信那里

9260
8139terrychow 回复

无线连接手机不需要root!

8139
9260willys 回复

怎么做呢,我试的时候都是说没权限开放端口,有教程不。求指教

9260
8139terrychow 回复

http://blog.csdn.net/alexbxp/article/details/7242083,可以看一下这一篇博客。

8139
9260willys 回复

好,拜谢,但上面写的还是需要root权限啊

8331
8139terrychow 回复
  1. adb tcpip 5555 2.断开手机连接 输入adb connect 3.adb devices 可以看到手机已经无线连接上了 自测小米5 没有root
9260
8139terrychow 回复

使用第一个方法,不需要root。你试试就知道了。

8139
9260willys 回复

好,拜谢orz

8139
8331sysayy 回复

好,我再试试,谢谢

50
8139terrychow 回复

确实不需要root,不如你自己动手试一下,比别人告诉你的来的更受益,估计需要5分钟的时间吧

50

感谢楼主分享,赞一下开源精神。

8139
50simple 回复

好,谢谢提点

480

之前 Jenkins Master 在云上,运维帮忙做了端口映射连到内网的 Slave 上的。ngrok 或者“花生壳”之类的工具都可以。

624

mark 思路不错

15593
624qileilove 回复

思路个人觉着是一个可以试着去尝试的方向。

15593
480sanlengjingvv 回复

花生壳之内的估计是可以的。但是那个还没有去试。不通过域名的话,那个端口被封。

15593
8139terrychow 回复

我们把所有的手机都放在一台stf上面,然后会那台机器会有一个内部ip地址,比如是10.12.111.111,这样的话,每一个手机都会有一个地址。例如:10.12.111.111:7401,10.12.111.111:7409等,再把这些信息注入到appium的镜像中,就可以了。如何将stf获取的手机信息注入到镜像中,其实是通过docker-compose.yml的环境变量的。下面,我会写一篇文章单独介绍这个思路。

15593
2457xdf 回复

希望大家一起努力,让测试更简单。

8139
15593haifengrundadi 回复

嗯,我大概理解你的思路了,也有一些新想法,多谢教导先

15593
8139terrychow 回复

都是讨论哈,大家开开心心工作,蛮好的。

9631

学习

96

ios 可以用吗

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