在前两篇Pytest文章中,我们讲解了安装入门,基本用法,进阶功能等用法。
本篇使用Pytest+Airtest+Allure进行框架搭建,目标是测试移动端app,小程序,公众号H5。尽量贴近于我们日常的工作。
前两篇链接:Pytest框架详解(一)、Pytest框架详解(二)
由于是测试移动端app,小程序,公众号H5,所以需要连接移动端手机,那么adb是必不可少需要安装的。
Pytest
、Airtest
与Allure
均为Python的第三方包,可以直接采用pip
进行安装;Python尽量使用python3
且版本号<=3.9,注意环境变量的填写。
安装完python后,开始安装这三个包,如果安装速度慢,在pip install
指令后加上-i https://pypi.tuna.tsinghua.edu.cn/simple
,会快一些。
adb的安装 ,主要就是下载Android SDK
,再添加环境变量。
命令行cmd中输入adb version
显示adb版本号即安装成功。
关于adb的内容,在adb详解中有更为详细的描述。
#安装pytest
pip install -U pytest
命令行cmd输入pytest --version
可显示安装的版本号即安装成功。
具体的步骤官方文档写的很清楚了,链接:官方文档
Python支持Python2.7或<=3.9,更推荐使用 Python3
#安装Airtest
pip install airtest
命令行cmd输入airtest version
可显示安装的版本号即安装成功。
如果安装完毕还不能使用,报错 ImportError: numpy.core.multiarray failed to import
,可以手工将 numpy
版本号降级至1.19.3就能使用了。
#numpy降级
pip install -U numpy==1.19.3
Airtest的Poco元素控件定位框架需要单独安装
#Poco元素控件定位框架安装
pip install pocoui
Allure的安装需要先安装JDK,配置好环境变量,cmd运行java,javac这些命令都没有问题。
安装pytest套件:
使用allure --version
可显示版本号即为安装成功
本篇,以实战出发,先给大家看一下整个框架的结构
接下来详细解释各个模块的作用
文件夹:
images
:存放图片文件log
:Airtest框架所提供的日志文件(由于我们采用了allure,所以这个实际上是没用的)readme.assets
:readme文件内的图片report
:存放生成的HTML报告(需要基于每次脚本运行后的报告数据)reports
:存放报告数据,格式为:年_月_日_时_分_秒test_cases
:重要py文件-用例集及模块用例utils
:工具集文件类:
config.py
:配置属性类变量launch.py
:用于初始化连接手机和启动APPreadme.md
:框架文档requestments.txt
:第三方包—pip install -r requestments.txtrun.py
:启动整体项目并输出报告pytest.ini
:pytest的配置文件,主要用于过滤不想执行的目录run.py
if __name__ == '__main__':
# 启动连接设备模块
launch()
# 生成报告路径
report_path = report_dir()
# 运行pytest主运行程序
pytest.main(['-s', '-q', '-k not slow', '--alluredir', report_path])
os.system('allure generate %s -o ./report --clean' % report_path)
os.system('allure serve %s' % report_path)
其中launch()
负责自动化连接相应设备;report_dir()
生成年\_月\_日\_时\_分_秒
格式的报告数据路径。
pytest.main
中的参数就不解释了,具体可看前两篇文章解释。
launch.py
def launch():
adb_connect_emulator()
# sleep(2)
device_id = get_device_id()
if not cli_setup():
auto_setup(__file__, logdir=True, devices=[
"android://127.0.0.1:5037/{}?cap_method=MINICAP_STREAM&&ori_method=MINICAPORI&&touch_method=MINITOUCH".format(
device_id),
], project_root="F:/airtest_script/air_py_project_demo")
ST.FIND_TIMEOUT = 10
ST.FIND_TIMEOUT_TMP = 10
ST.SAVE_IMAGE = False
adb_connect_emulator()
作用是自动连接相关移动端设备。
get_device_id()
作用是获取已连接设备的ID。
if not cli_setup()
语法来自于airtest官方文档,可自行查看
utils
文件夹内的tools.py
# 生成报告数据目录路径
def report_dir():
report_path = './reports/data/' + time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime(time.time()))
return report_path
有python基础的应该不难理解
# 生成测试数据,借用了第三方包Faker
# from faker import Faker
def faker_data(num):
faker = Faker('zh_CN')
list_data = []
for i in range(num):
list_data.append((faker.name(), faker.ssn(), faker.phone_number()))
return list_data
# demo
data = [
('Tom',123456),
('Lucy',654321)
]
@pytest.mark.parametrize("username,password",data)
def test_ddt(self,username,password):
print("用户名:%s,密码:%s"%(username,password))
Page Object Model
:一种设计模式—页面-对象-模型>>>解耦
简单的说,就是将页面中的操作(定位,点击等等)和具体的测试方法分离开。
我发现很多人喜欢吹嘘这个概念,实际上,当你真正去用的时候,大多数时候只是额外的增加了工作量,然并卵。
如果需要写相关文档,可借用以下内容
项目概览:
1、期望达成的目的:能达到各公众号,小程序的ui功能自动化。
2、Airtest框架底层为Python语言实现,故项目采用AirTest+Pytest+Allure
协同工作。
3、各框架所负责的功能:
Airtest
:对公众号、小程序的元素控件进行抓取,可使用Poco定位或Airtest图像识别进行Pytest
:对整体用例集、用例进行管理;可单条,批量执行,分类执行等等。Allure
:输出报告,显示各用例执行结果,执行时间等。4、阶段划分:
整个框架就是基于Pytest的自动化管理用例,Airtest的2大定位框架,Allure的报告框架进行搭建。
稳定性高(网易拿Airtest每天测几百台手机)、实用性得看具体场景、易用性高(只需要有一点点python基础)、可扩展性强、。
以上,如果有疑问地方,欢迎私信,留言。