| 一文 uiautomator2 自动化测试工具使用
在上一篇文章中分享了 pytest 的基本用法,本文进一步介绍 pytest 的其他实用特性和进阶技巧。
pytest fixtures
pytest 中可以使用 @pytest.fixture 装饰器来装饰一个方法,被装饰方法的方法名可以作为一个参数传入到测试方法中。可以使用这种方式来完成测试之前的初始化,也可以返回数据给测试函数。
通常使用 setup 和 teardown 来进行资源的初始化。如果有这样一个场景,测试用例 1 需要依赖登录功能,测试用例 2 不需要登录功能,测试用例 3 需要登录功能。这种场景 setup,teardown 无法实现,可以使用 pytest fixture 功能,在方法前面加个 @pytest.fixture 装饰器,加了这个装饰器的方法可以以参数的形式传入到方法里面执行。
例如在登录的方法,加上 @pytest.fixture 这个装饰器后,将这个用例方法名以参数的形式传到方法里,这个方法就会先执行这个登录方法,再去执行自身的用例步骤,如果没有传入这个登录方法,就不执行登录操作,直接执行已有的步骤。
创建一个文件名为“test_fixture.py”,代码如下:
在上面的代码中,测试用例 test_case1 和 test_case3 分别增加了 login 方法名作为参数,pytest 会发现并调用 @pytest.fixture 标记的 login 功能,运行测试结果如下:
从上面的结果可以看出,test_case1 和 test_case3 运行之前执行了 login 方法,test_case2 没有执行这个方法。
fixture 里面有一个参数 scope,通过 scope 可以控制 fixture 的作用范围,根据作用范围大小划分:session> module> class> function,具体作用范围如下:
Google 官方提供了一个 Android 自动化测试工具(Java 库),基于 Accessibility 服务,功能很强,可以对第三方 App 进行测试,获取屏幕上任意一个 App 的任意一个控件属性,并对其进行任意操作,但有两个缺点:
1.测试脚本只能使用 Java 语言;
2.测试脚本要打包成 jar 或者 apk 包上传到设备上才能运行;
实际工作中,我们希望测试逻辑能够用 Python 编写,能够在电脑上运行的时候就控制手机。所以基于这个目的开发了 python-uiautomator2 自动化测试开源工具,其封装了谷歌自带的 uiautomator2 测试框架,可以运行在支持 Python 的任一系统上,目前版本为 V2.10.2。
GitHub 开源地址:
如图所示,python-uiautomator2 主要分为两个部分,python 客户端,移动设备
- python 端: 运行脚本,并向移动设备发送 HTTP 请求;
- 移动设备:移动设备上运行了封装了 uiautomator2 的 HTTP 服务,解析收到的请求,并转化成 uiautomator2 的代码;
- 整个过程:
- 3.在移动设备上安装 atx-agent(守护进程),随后 atx-agent 启动 uiautomator2 服务(默认 7912 端口)进行监听;
- 4.在 PC 上编写测试脚本并执行(相当于发送 HTTP 请求到移动设备的 server 端);
- 5.移动设备通过 WIFI 或 USB 接收到 PC 上发来的 HTTP 请求,执行制定的操作;
- 使用 pip 安装
- 安装完成后,使用如下 python 代码查看环境是事配置成功
- 说明:后文中所有代码都需要导入 uiautomator2 库,为了简化我使用 u2 代替,d 代表 driver
- 能正确打印出设备的信息则表示安装成功
- 注意:需要安装 adb 工具,并配置到系统环境变量,才能操作手机。
- 安装有问题可以到 issue 列表查询:
- weditor 是一款基于浏览器的 UI 查看器,用来帮助我们查看 UI 元素定位。
- 因为 uiautomator 是独占资源,所以当 atx 运行的时候 uiautomatorviewer 是不能用的,为了减少 atx 频繁的启停,就需要用到此工具
- 使用 pip 安装
- 查看安装是否成功
- 出现如下信息表示安装成功
- 运行 weditor
- ui2 支持 android 中 UiSelector 类中的所有定位方式,详细可以在这个网址查看 https://developer.android.com/reference/android/support/test/uiautomator/UiSelector
- 整体内容如下 , 所有的属性可以通过 weditor 查看到
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FVTTVM0j-1650943994249)(https://ceshiren.com/uploads/default/original/3X/6/4/64b8bdd6a2325dfc7cc39ba27f51c6e7c276aa3a.png)]
- 子元素定位
- child()
- 兄弟元素定位
- sibling()
- 链式调用
- 相对定位支持在left, right, top, bottom, 即在某个元素的前后左右
- 表格标注有 @property 装饰的类属性方法,均为下方示例方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GJArajt8-1650943999497)(https://ceshiren.com/uploads/default/original/3X/b/e/beabe198ecad20b8d842c42e867054e6bb00e703.png)]
exists 其它使用方法:
info() 输出信息:
可以通过上方信息分别获取元素的所有属性
因为 Java uiautoamtor 中默认是不支持 xpath,这是属于 ui2 的扩展功能,速度会相比其它定位方式慢一些
在 xpath 定位中,ui2 中的 description 定位需要替换为 content-desc,resourceId 需要替换为 resource-id
使用方法
Android<4.3 时不能使用拖动
滑动有两个,一个是在 driver 上操作,一个是在元素上操作
元素上操作
从元素的中心向元素边缘滑动
driver 上操作
即对整个屏幕操作
driver 滑动的扩展方法,可以直接实现滑动,不需要再自己封装定位点
android>4.3
对元素操作
封装好的放大缩小操作
设置 scrollable 属性为 True;
滚动类型:horiz 为水平,vert 为垂直;
滚动方向:
- forward 向前
- backward 向后
- toBeginning 滚动至开始
- toEnd 滚动至最后
- to 滚动直接某个元素出现
- 所有方法均返回 Bool 值;
- 5.8.1 输入自定义文本
- 5.8.2 输入按键
- 两种方法
- 目前 press 支持的按键如下
- keyevent 是通过 “adb shell input keyevent” 方式输入,支持按键更加丰富
- 更多详细的按键信息 https://developer.android.com/reference/android/view/KeyEvent.html
- 5.8.3 输入法切换
- 5.8.4 模拟输入法功能
- 可以模拟的功能有 go ,search ,send ,next, done ,previous。
- 如果使用 press 输入按键无效,可以尝试使用此方法输入
- 使用 wather 进行界面的监控,可以用来实现跳过测试过程中的弹框
- 当启动 wather 时,会新建一个线程进行监控
- 可以添加多个 watcher
- 用法
- 2.11.0 版本 新增了一个 watch_context 方法 , 写法相比 watcher 更简洁,官方推荐使用此方法来实现监控,目前只支持 click() 这一种方法。
- 这里可以用来实现图案解锁
- 使用 touch 类
- 这个感觉是比较有用的一个功能,可以在测试用例开始时录制,结束时停止录制,然后如果测试 fail。则上传到测试报告,完美复原操作现场,具体原理后面再去研究。
- 首先需要下载依赖,官方推荐使用镜像下载:
- 执行录制:
- 下载与录制视频同一套依赖。
- 这个功能是首先手动截取需要点击目标的图片,然后 ui2 在界面中去匹配这个图片,目前我尝试了精确试不是很高,误点率非常高,不建议使用。
- 可以从本地路径及 url 下载安装 APP,此方法无返回值,当安装失败时,会抛出 RuntimeError 异常
- 默认当应用在运行状态执行 start 时不会关闭应用,而是继续保持当前界面。
- 如果需要消除前面的启动状态,则需要加 stop=True 参数。
- stop 和 clear 的区别是结束应用使用的命令不同
- stop 使用的是 “am force-stop”
- clear 使用的是 “pm clear”
- 卸载全部应用返回的包名列表并一定是卸载成功了,最好使用 verbose=true 打印一下信息,这样可以查看到是否卸载成功
- 或者可以修改一下源码,使其只输出成功的包名,注释的为增加的代码,未注释的是源码
- connect() 可以使用如下其它方式进行连接
- 8.2.1 获取 driver 信息
- 8.2.2 获取设备信息
- 会输出测试设备的所有信息,包括电池,CPU,内存等
- 8.2.3 获取屏幕分辨率
- 8.2.4 获取 IP 地址
- 8.3.1 使用 settings 设置
- 查看 settings 默认设置
- 修改默认设置,只需要修改 settings 字典即可
- 8.3.2 使用方法或者属性设置
- http 默认请求超时时间
- 当设备掉线时,等待设备在线时长
- 元素查找默认等待时间
- 打开 HTTP debug 信息
- 休眠
- value 值参考,只要是元组中的任一一个值就可以。
- 打开通知栏
- 打开快速设置
- 8.7.1 导入文件
- 8.7.2 导出文件
- 使用 shell 方法执行
- 8.8.1 执行非阻塞命令
- output 返回的是一个整体的字符串,如果需要抽取值,需要对 output 进行解析提取处理
- 8.8.2 执行阻塞命令(持续执行的命令)
- 源码描述
- 因为有 atx-agent 的存在,Uiautomator 会被一直守护着,如果退出了就会被重新启动起来。但是 Uiautomator 又是霸道的,一旦它在运行,手机上的辅助功能、电脑上的 uiautomatorviewer 就都不能用了,除非关掉该框架本身的 uiautomator
- 使用代码停止
- 手动停止
- 直接打开 ATX APP(init 成功后,就会安装上),点击关闭 UIAutomator
- 以上,欢迎大家一起交流探讨。
原文链接
获取更多相关资料+v~ ceshiren001
获取更多技术文章分享
- function 函数或者方法级别都会被调用
- class 类级别调用一次
- module 模块级别调用一次
- session 是多个文件调用一次(可以跨.py文件调用,每个.py文件就是module)
- 例如整个模块有多条测试用例,需要在全部用例执行之前打开浏览器,全部执行完之后去关闭浏览器,打开和关闭操作只执行一次,如果每次都重新执行打开操作,会非常占用系统资源。这种场景除了setup_module,teardown_module 可以实现,还可以通过设置模块级别的 fixture 装饰器(@pytest.fixture(scope=“module”))来实现。
- scope=‘module’
- fixture 参数 scope=‘module’,module 作用是整个模块都会生效。
- 创建文件名为 test_fixture_scope.py,代码如下:
- 代码解析:
- @pytest.fixture() 如果不写参数,参数默认 scope=‘function’。当 scope=‘module’ 时,在当前 .py 脚本里面所有的用例开始前只执行一次。scope 巧妙与 yield 组合使用,相当于 setup 和 teardown 方法。还可以使用 @pytest.mark.usefixtures 装饰器,传入前置函数名作为参数。
- 运行结果如下:
- 从上面运行结果可以看出,scope=“module” 与 yield 结合,相当于 setup_module 和 teardown_module 方法。整个模块运行之前调用了 open()方法中 yield 前面的打印输出“打开浏览器”,整个运行之后调用了 yield 后面的打印语句“执行 teardown !”与“关闭浏览器”。yield 来唤醒 teardown 的执行,如果用例出现异常,不影响 yield 后面的 teardown 执行。可以使用 @pytest.mark.usefixtures 装饰器来进行方法的传入。
- fixture scope 为 session 级别是可以跨 .py 模块调用的,也就是当我们有多个 .py 文件的用例时,如果多个用例只需调用一次 fixture,可以将 scope=‘session’,并且写到 conftest.py 文件里。写到 conftest.py 文件可以全局调用这里面的方法。使用的时候不需要导入 conftest.py 这个文件。使用 conftest.py 的规则:
- 1.conftest.py 这个文件名是固定的,不可以更改。
- 2.conftest.py 与运行用例在同一个包下,并且该包中有 init.py 文件
- 3.使用的时候不需要导入 conftest.py,pytest 会自动识别到这个文件
- 4.放到项目的根目录下可以全局调用,放到某个 package 下,就在这个 package 内有效。
- 案例
- 在运行整个项目下的所有的用例,只执行一次打开浏览器。执行完所有的用例之后再执行关闭浏览器,可以在这个项目下创建一个 conftest.py 文件,将打开浏览器操作的方法放在这个文件下,并添加一个装饰器 @pytest.fixture(scope=“session”),就能够实现整个项目所有测试用例的浏览器复用,案例目录结构如下:
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BJwBC56V-1650943865559)(https://ceshiren.com/uploads/default/original/3X/4/1/41a3503196d5fa61a231a7a6bf75ed5d45503467.png)]
- 创建目录 test_scope,并在目录下创建三个文件 conftest.py,test_scope1.py 和 test_scope2.py。
- conftest.py 文件定义了公共方法,pytest 会自动读取 conftest.py 定义的方法,代码如下:
- 创建 test_scope1.py 文件,代码如下:
- 创建文件“test_scope2.py”,代码如下:
- 打开 cmd,进入目录 test_scope/,执行如下命令:
- 或者
- 执行结果如下:
- 执行过程中 pytest 会自动识别当前目录的 conftest.py,不需要导入直接引用里面的方法配置。应用到整个目录下的所有调用这里面的方法中执行。conftest.py 与运行的用例要在同一个 pakage 下,并且这个包下有 init.py 文件
- 如果每条测试用例都需要添加 fixture 功能,则需要在每一要用例方法里面传入这个fixture的名字,这里就可以在装饰器里面添加一个参数 autouse=‘true’,它会自动应用到所有的测试方法中,只是这里没有办法返回值给测试用例。
- 使用方法,在方法前面加上装饰器,如下:
- @pytest.fixture 里设置 autouse 参数值为 true(默认 false),每个测试函数都会自动调用这个前置函数。
- 创建文件名为“test_autouse.py”,代码如下:
- 执行上面这个测试文件,结果如下:
- 从上面的运行结果可以看出,在方法 myfixture() 上面添加了装饰器 @pytest.fixture(autouse=“true”),测试用例无须传入这个 fixture 的名字,它会自动在每条用例之前执行这个 fixture。
- 测试过程中需要大量的测试数据,如果每条测试数据都编写一条测试用例,用例数量将是非常宠大的。一般我们在测试过程中会将测试用到的数据以参数的形式传入到测试用例中,并为每条测试数据生成一个测试结果数据。
- 这时候可以使用 fixture 的参数化功能,在 fixture 方法加上装饰器 @pytest.fixture(params=[1,2,3]),就会传入三个数据 1、2、3,分别将这三个数据传入到用例当中。这里可以传入的数据是个列表。传入的数据需要使用一个固定的参数名 request 来接收。
- 创建文件名为“test_params.py”,代码如下:
- 运行结果如下:
- 从运行结果可以看出,对于 params 里面的每个值,fixture 都会去调用执行一次,使用 request.param 来接受用例参数化的数据,并且为每一个测试数据生成一个测试结果。在测试工作中使用这种参数化的方式,会减少大量的代码量,并且便于阅读与维护。
- 假如项目中有测试用例 1000 条,一条测试用例需要执行 1 分钟,一个测试人员需要 1000 分钟才能完成一轮回归测试。通常我们会用人力成本换取时间成本,加几个人一起执行,时间就会缩短。如果 10 人一起执行只需要 100 分钟,这就是一种并行测试,分布式的场景。
- pytest-xdist 是 pytest 分布式执行插件,可以多个 CPU 或主机执行,这款插件允许用户将测试并发执行(进程级并发),插件是动态决定测试用例执行顺序的,为了保证各个测试能在各个独立线程里正确的执行,应该保证测试用例的独立性(这也符合测试用例设计的最佳实践)。
- 安装
- 多个 CPU 并行执行用例,需要在 pytest 后面添加 -n 参数,如果参数为 auto,会自动检测系统的 CPU 数目。如果参数为数字,则指定运行测试的处理器进程数。
- 案例
- 某个项目有 200 条测试用例,每条测试用例之间没有关联关系,互不影响。这 200 条测试用例需要在 1 小时之内测试完成,可以加个-n参数,使用多 CPU 并行测试。运行方法:
- 进入到项目目录下,执行 pytest 可以将项目目录下所有测试用例识别出来并且运行,加上 -n 参数,可以指定 4 个 CPU 并发执行。大量的测试用例并发执行提速非常明显。
- 测试报告通常在项目中尤为重要,报告可以体现测试人员的工作量,开发人员可以从测试报告中了解缺陷的情况,因此测试报告在测试过程中的地位至关重要,测试报告为纠正软件存在的质量问题提供依据,为软件验收和交付打下基础。测试报告根据内容的侧重点,可以分为 “版本测试报告” 和 “总结测试报告”。执行完 pytest 测试用例,可以使用 pytest-HTML 插件生成 HTML 格式的测试报告。
- 安装
- 执行方法
- 结合 pytest-xdist 使用
- 生成测试报告
- 如下图:
- 生成的测试报告最终是 HTML 格式,报告内容包括标题、运行时间、环境、汇总结果以及用例的通过个数、跳过个数、失败个数、错误个数,期望失败个数、不期望通过个数、重新运行个数、以及错误的详细展示信息。报告会生成在运行脚本的同一路径,需要指定路径添加–html=path/to/html/report.html 这个参数配置报告的路径。如果不添加 --self-contained-html 这个参数,生成报告的 CSS 文件是独立的,分享的时候容易千万数据丢失。
- 编写代码时,我们经常会做出一些假设,断言就是用于在代码中捕捉这些假设。断言表示为一些布尔表达式,测试人员通常会加一些断言来断定中间过程的正确性。断言支持显示最常见的子表达式的值,包括调用,属性,比较以及二元和一元运算符。Python使用 assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。
- 使用方法:
- 案例如下:
- 如果没有断言,没有办法判定用例中每一个测试步骤结果的正确性。在项目中适当的使用断言,来对代码的结构、属性、功能、安全性等场景检查与验证。
- 以上,更多 Python 测试开发实战进阶技能,推荐学习《Python 测试开发实战进阶》课程。
- 【相关阅读】
- Python 测试开发实战进阶,挑战阿里P6+,年薪50W+!
- 干货 | 一文搞定 pytest 自动化测试框架(一)
- 测试面经 | 半年薪资翻倍逆袭大厂,这位“上错车”的测试媛不简单!
- 干货 | 一文搞定 Linux 常用高频命令
- 测试面经 | 从螺丝钉到大厂测试开发,三点学习心得与面试经验
原文链接
- 测试面经 | 从螺丝钉到大厂测试开发,三点学习心得与面试经验
获取更多相关资料+v~ ceshiren001
获取更多技术文章分享
| 一文 uiautomator2 自动化测试工具使用相关推荐
- 干货|一文搞定 uiautomator2 自动化测试工具使用
一.背景简介 Google 官方提供了一个 Android 自动化测试工具(Java 库),基于 Accessibility 服务,功能很强,可以对第三方 App 进行测试,获取屏幕上任意一个 App ...
- APP自动化测试工具uiautomator2,十分钟迅速掌握
目录 前言 一.介绍 二.环境部署 三.编写百度贴吧首页脚本 四.uiautomator2和appium运行速度比较 写在最后,给与的建议: 前言 相信很多使用appium做过APP自动化的人都深有感 ...
- App自动化测试工具Uiautomator2
UI Automator是 google 在 Android4.1 版本发布时推出的一款用Java编写的Android UI 自动化测试工具,基于Android Accessibility 服务,Ac ...
- 盘点:App 移动自动化测试工具
App移动端测试工具非常多,首先 区分 Android 和 iOS,以及 harmonyos 平台,每个平台下都有自己的自动化测试工具.自动化工具又区分 调试工具.monkey 工具.UI自动化工具. ...
- 自动化测试工具Cucumber的简单介绍
随着测试的发展,测试自动化越来越成为人们的关注点. 现在我们公司也在进行接口自动化的推广,在我看来接口自动化的价值就在于整体项目的回归,完成一些没法通过人力进行的测试,比如压力测试. 为了解决测试开发 ...
- 华为云龙api自动化工具_2020年十大最佳自动化测试工具
Best Automation Testing Tools for 2020 对更快交付高质量软件(或"快速质量")的需求要求组织以敏捷,持续集成(CI)和DevOps方法论来寻找 ...
- 自动化电子测试软件,自主开发的MIL测试自动化测试工具
37年,55颗卫星,就在今天北斗真的成功了. 上一篇简单文章中介绍了一下MIL测试的流程,本文章将介绍一个小编自主开发的MIL测试用的自动化测试工具. 目前国内主流测试工具主要有三种类型: 基于第三方 ...
- http 测试工具_20+最好的开源自动化测试工具
本文开始逐步的降低公众号更文频率,提升文章质量,帮忙多点点文章末右下角的"好看"支持下,也可以将本文分享到朋友圈或你身边的朋友,谢谢 最佳开源自动化工具有哪些呢? 在本文中,整理了 ...
- 前端自动化测试工具:SlimerJS、phantomJS 和 CasperJS
对于富客户端的 Web 应用页面,自动登录.页面修改.抓取页面内容.屏幕截图.页面功能测试-面对这些需求,使用后端语言需要花费不少的精力才能实现.此时 SlimerJS.phantomJS 或 Cas ...
最新文章
- 分析轮子(二)- ,, (左移、右移、无符号右移)
- HDU - 1054 Strategic Game(最小点覆盖-二分图最大匹配)
- Linux下PortSentry的配置
- NavigationBar 渐隐效果
- 数据分箱1——人工手动分箱
- Android 屏幕适配:最全面的解决方案
- java8-谓词(predicate)
- excel函数手册_一个函数高手的成长之路
- 机器学习 结构化数据_聊天机器人:根据结构化数据创建自然语言
- 《Python编程实践》查漏笔记
- Ubuntu 20.04.2 LTS安装 最新版 微信(wine)
- 【muduo】TcpClient与TcpServer建立连接过程对比
- 【kafka】kafka windows Invalid UTF-8 middle byte 0xfe
- 运放放大倍数计算公式_16个问题讲透了运算放大器基础的知识点
- 机械寿命预测,多步预测
- activemq 简介 配置
- 旋转(Rotation)矩阵转欧拉角(euler)
- Win10DIY篇:Win10自制纯白图标。(完整版教程)
- 浅陌初心 / vue3-admin-element
- vs错误描述:fatal error C1010:在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“