前言
最近正在学习python的pytest框架,和之前使用的unittest框架有很大区别.刚使用pytest框架也非常不习惯,主要是和原来的编程思想有很多区别,后来写了一些代码加上练习多了就习惯了.
本文主要讲解使用uiautomator2+pytest+allure进行Android的UI自动化测试,其实主要目的是写一些实战的脚本来更深入学习pytest框架.
另外也顺便介绍一下uiautomator2这款自动化框架,在使用上也是非常的顺畅.
之前我已经使用appium+testng写了一套自动化脚本了并且在公司实际使用了.这次就不用公司的app测试了,使用上家公司58同城的app进行自动化测试.
介绍
做UI自动化肯定需要选择一种适合的测试框架,比如java的testng、python的unittest,主要目的是让代码的层级明确、简洁、复用性强,本次介绍下python的pytest框架.
pytest
pytest官方:https://docs.pytest.org/en/latest/
The pytest framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries.
官方的一段介绍,简单来说就是让写测试代码更容易并且没有那么多约束.当然这块不重点介绍pytest为什么好、怎么好,只需要记住pytest就是一个测试框架就够了.
uiautomator2
github地址:https://github.com/openatx/uiautomator2
uiautomator2 是一个Android UI自动化框架,支持Python编写测试脚本对设备进行自动.底层基于Google uiautomator,隶属于最近比较火热的openatx项目中.
下图是运行示意图:
设备中需要安装atx-agent作为uiautomator2的服务端,解析收到的请求,并转化成uiautomator2的代码.总体看来交互过程没有那么繁琐,在实际使用上的确比appium快不少.
allure
allure是一款测试报告,炫酷的页面加上多种数据统计,比HTMLTestRunner报告强百倍,当然也支持多语言.
环境搭建
使用mac电脑搭建环境
pytest
最新版本出到4.0了,但是实际使用4.0和allure有些不兼容.
所以推荐使用3.7版本的pytest
uiautomator2
uiautomator2也是python的一个类库,用pip安装即可.
allure
有了测试框架、自动化框架、测试报告,基本上就能coding了.
pytest插件
pytest插件可以实现失败重试、打印进度、指定顺序
当然插件还有很多,这里就不一一介绍了.
实例
初始化driver
做UI自动化都需要初始化一个driver对象,这个driver对象可以点击事件、滑动、双击等操作
uiautomator2的初始化driver方式
相比appium配置很少,同时可以设置全局隐式等待元素时间
fixture机制
unittest框架有setup和teardown方法,用来做初始化和结束测试操作.pytest是用@pytest.fixture方法来实现setup和teardown.
下面这段代码就是定义一个driver_setup方法,来初始化和结束.
另外还有一种方式实现,可以理解为setup和teardown在一个方法内,通过yield关键字停顿.
yield关键字是在python语法生成器和迭代器中使用,用来节省内存.
比如for循环一个大列表,一次性都循环出来非常浪费性能.
所以通过yield关键字来控制循环.
下面演示下yield:
如果直接调用yt函数会发现啥也打印不出来,因为此时只是声明了yt函数并没有真正的使用.
使用next方法调用第一次,输入结果如下:
yield在此时相当于return 0,此时不会输出"第二次打印",会在这块停住.
使用next方法调用第二次,输入结果如下:
再来回顾下上面那个例子:
在yield之前完成了setup操作并且返回self.news对象
在yied之后完成了teardown操作
数据共享
在pytest中只需要写conftest.py类,可以实现数据共享,不需要import就能自动找到一些配置.
测试类
pytest检测如果是test开头或者test结尾的类,都认为是可以执行测试类.
在测试类中写test开头的测试方法
参数化
假设场景是首页搜索多个词,需要借助参数化来完成
指定顺序
假设发布用例,需要先登录才可以.可以通过用例排序的方式先登录,再发布
运行指定级别
假设已经写了很多用例,有些用例是冒烟用例,可以指定级别运行.
使用@pytest.mark.P0
命令行执行: pytest -v -m "P0", 会执行所有P0级别的用例
重试
这个时候需要借助pytest-rerunfailures插件,用法如下:
当然这种方法是指定某个case失败重试
还可以全局设置用户如下:
reruns:重试次数
reruns_delay:重试的间隔时间
hook函数
在conftest.py文件中定义@pytest.hookimpl函数,这个函数可以hook住pytest运行的状况
从代码中可以看出可以获取失败情况的相关信息,当时有了失败信息就可以搞事情了,比如当用例失败的时候截图或者记录失败数量做数据统计.
断言
在跑用例的时候最后一步都会断言一下,比如断言元素是否存在等
还可以这样优化代码:
assert失败后会跑出AssertionError和定义的文案
运行
介绍下几种常用命令行运行
运行某个文件夹下的用例
运行某个文件下的所有用例
运行某个方法
类文件地址::方法名
或者使用-k参数+方法名
运行某个类
有的时候需要调试正个测试类中所有测试方法
直接跟上类文件地址
运行P0级
运行非P0级
main方式
在run.py中写如下代码,这种方式相当于把命令行参数封装到脚本中.
报告
测试代码写完了,还差一个非常好看的报告.以前我们一般都用HTMLTestRunner报告,但是HTMLTestRunner报告功能比较单一并且也不支持失败截图.
偶然在社区中看到了allure的帖子,看了展示报告简直是吊炸天,先附一张跑完用例的截图.
另外可以在代码中设置报告层次,用法如下:
设置allure.feature和allure.story,相当于上下级关系.
失败详情
点击失败用例就能看到失败的相关信息
失败截图
在跑自动化的过程已经遇到失败情况,需要一张截图描述当时的情况.
在上面提到@pytest.hookimpl函数中,最后调用截图方法,使用
allure.attach把截图加上.
需要注意的是attach中的第二个参数是图片的二进制信息.
uiautomator2基本操作
启动服务
执行如下命令:
会在手机上安装atx-agent.apk并且会在手机上启动服务
监听的是手机上的ip+默认7921.
事件
事件类型比如点击和滑动等,介绍几个常用的.
点击
根据id、xpath、text定位元素,和appium使用上差别不大.
滑动
前4个参数是坐标,time是控制滑动时间
监听
这个用于首次启动app点击权限或者开屏幕广告
when方法就相当于if判断,满足条件才会点击,可以生去一大堆逻辑代码.
查看元素
安装
需要安装weditor库
启动工具
会在自动打开浏览器并且展示元素,相当于web版本的uiautomatorviewer,使用起来比较方便.
无线运行
上边提到的手机ip,有个这个手机ip就可以进行无线运行脚本
把connect中的方法替换成手机ip就可以了
项目地址
写了一套demo代码,需要安装下58同城最新版apk.
代码地址:https://github.com/xinxi1990/atxdemo.git
执行方式:
在根目录运行python run.py
报告生成在:reports/index.html
结语
随着自动化技术的不断更新,可以选择的技术手段更多.但是要根据自己公司项目和技术成熟度多方面因素选择自动化框架.
领取专属 10元无门槛券
私享最新 技术干货