10如何脱离AirtestIDE编写、运行自动化脚本
同学们好,我是网易AirtestProject的团队成员晓娟,欢迎大家来到我们的视频教程专栏《14天Airtest自动化测试小白课程》。
前面我们在教大家编写自动化脚本的时候,一直用的是我们配套的编辑器AirtestIDE,那么也会有很多同学,他们并不想局限在我们配套的IDE上。比如他们想直接用命令行跑脚本,或者他们更习惯使用其它的python编辑器,比如pycharm等等。
所以今天我们来学习下,如何脱离AirtestIDE来编写或者运行脚本。
部署本地的python环境
之前我们就说过,airtest、pocoui和airtest-selenium都是python第三方库,所以只要在python环境里面装上这几个库,我们就可以在这个python环境里面运行这些测试框架的脚本。
而我们的AIirtestIDE是内嵌了1个装好了这些库的精简版的python环境,所以即使我们不在设置里面配置任何本地的python环境,我们依然可以跑airtest、poco或者airtest-selenium脚本。当然,不使用IDE自带的python环境,我们也可以 在选项--设置中,设置同学们本地的python环境,以此来支持更多的python第三方库 :

同理,如果我们想用本地的python环境跑自动化脚本时,就必须保证这个环境已经安装好了我们所需要的库。
另外,对于python版本,我们 更建议大家选择python3 ,python2我们虽然也支持,但毕竟官方也不维护python2了,所以我们更推荐大家使用python3作为大家的运行环境。目前我们也已经支持了在Python3.9下安装我们的airtest、pocoui和airtest-selenium库。
当我们在本地安装好1个python环境之后,可以直接执行python来查看本地python的详细信息。

接下来,我们就可以安装我们要用到的airtest和pocoui等库了,命令如下:
pip install airtest
pip install pocoui
pip install airtest-selenium
需要特别注意的是,poco框架的库名叫pocoui ,同学们不要写错了,如果不小心同时安装了poco和pocoui,请同学们务必卸载掉poco,只留下pocoui,避免影响后续脚本的运行,删除命令如下:
pip uninstall airtest
pip uninstall pocoui
pip uninstall airtest-selenium
安装好了对应的库之后,我们可以使用 pip list 命令查看相应的库是否安装上了:

如果之后有版本更新,我们也可以直接使用命令将本地的库直接更新到最新版本:
pip install -U airtest
pip install -U pocoui
pip install -U airtest-selenium
如同学们在安装过程中,有遇到 安装超时报错 的,可以尝试更换一些国内的安装源来安装这些库,方法如下:
# 豆瓣源
pip install airtest -i https://pypi.tuna.tsinghua.edu.cn/simple
# 常见的国内源
阿里云 http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban) http://pypi.douban.com/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
至此,本地的python环境就部署好了,其实还是非常简单的,准备一个python环境,然后在这个环境里面使用 pip install 命令安装好airtest、pocoui和airtest-selenium库即可。(不做web自动化的话,其实airtest-selenium也可以不安装先,有需要的时候再把它装上去。)
使用命令行跑脚本/生成报告
1. 命令行运行脚本
在命令行执行脚本的命令是airtest run + 脚本文件路径,该命令的可传参数如下:
--device,用来指定连接的被测设备
--log,用来指定log内容和截图存放的目录
--recording,运行脚本时进行录屏操作
--no-image,传入该参数后,在任务运行过程中不再保存截图
举个例子,我们在D:/test/目录下,新建1个叫report_test.air的脚本。并在脚本中编写1条touch脚本。

然后我们在命令行运行这个脚本,指定测试设备为连接上的第一台安卓设备,log保存路径为D:/log/,运行脚本时进行录屏操作,录屏文件保存到D:/log/record01.mp4:
airtest run D:/test/report_test.air --device Android:/// --log D:/log/ --recording D:/log/record01.mp4
运行结束后,我们可以到指定目录下查看是否生成了我们指定的log文件和录屏文件:

其中有几点需要注意的:
① 如果脚本中没有指定运行设备,那么在编写命令行的运行脚本命令时,就必须指定设备;如脚本已指定运行设备,则运行脚本的命令可以不指定设备,刚才我们的示例脚本是没有指定设备的,如果命令行也不指定设备,命令行会提示你没有连接设备,且脚本也不能跑下去。

② 同理,如果命令未指定log参数,则默认是不保存log内容的
③ --device 后面跟的是用于初始化设备的URI字符串,连接iOS、安卓和Windows窗口的字符串是不一样的,我们给大家准备了详细的示例,一起来看一下:
连接Android手机
# 什么都不填写,默认取当前连接中的第一台手机
Android:///
# 连接本机默认端口连的一台设备号为79d03fa的手机
Android://127.0.0.1:5037/79d03fa
# 用本机的adb连接一台adb connect过的远程设备,注意10.254.60.1:5555其实是serialno
Android://127.0.0.1:5037/10.254.60.1:5555
连接iOS手机
iOS:///127.0.0.1:8100
连接Windows窗口
# 连接一个窗口句柄为123456的Windows窗口
Windows:///123456
# 连接一个Windows窗口,窗口名称匹配某个正则表达式
Windows:///?title_re=Unity.*
# 连接windows桌面,不指定任何窗口
Windows:///
连接使用了备选连接参数的设备
# 夜神模拟器(127.0.0.1:62001为夜神模拟器的端口号)
Android://127.0.0.1:5037/127.0.0.1:62001?cap_method=JAVACAP&&ori_method=ADBORI
# 设备号为79d03fa的 MIUI11 设备
Android://127.0.0.1:5037/79d03fa?cap_method=JAVACAP&&ori_method=ADBORI
更多关于设备字符串的内容,我们可以参看这篇公众号教程:

④ 只有当airtest版本大于等于1.1.6时,--recording参数后面才允许自定义录屏文件名,且必须以.mp4结尾。
⑤ 只有当airtest版本大于等于1.1.7时,才有--no-image参数,才能指定运行脚本过程中不保存截图。
2. 命令行生成报告
使用airtest run 命令运行完脚本以后,我们可以使用另一个命令,airtest report + 脚本文件路径指令来生成一份HTML格式的报告。
该命令的可传参数非常多:
--log_root,指定log内容和截图文件所在的目录
--outfile,指定生成报告的目录
--lang,指定报告语言,可以是中文/英文
--export,导出一个包含所有资源的报告文件
--static_root,指定静态资源文件的路径
以刚才的脚本为例,在命令行运行以后,我们就可以继续生成它的报告了,指定log路径为D:/log,生成html报告的路径为D:/log/log.html,指定报告的语言为英文。
airtest report D:/test/report_test.air --log_root D:/log --outfile D:/log/log.html --lang en

之后我们可以到指定的文件夹里面查看对应的报告文件:


另外我们再来看下,--export这个参数,使用这个参数,可以帮我们打包这份测试报告,然后我们可以直接把打包好的这份报告发送给别人查看。如果不使用--export来导出报告的话,html报告里面的图片资源、静态资源路径都是绝对路径,发到别的电脑之后,别人是无法正常查看的。

只有导出之后的报告,里面的图片资源和静态文件资源才会使用相对路径,这样把报告发送到别的电脑上时,我们才能够正常查看。
airtest report D:/test/report_test.air --log_root D:/log --lang en --export D:/export/

打开指定的导出路径,可以看到导出的测试报告文件里面包含了非常多的东西:

报告里面的图片资源和静态资源都是相对路径,我们可以把这份报告发送给别人查看。

最后一个参数--static_root,用于指定静态资源的路径。因为我们每次导出一份报告,都会包含一份相同的static文件,它里面放置了报告的一些css和js等文件。一般来说,除非报告的样式做了某些更新,否则这些静态资源文件都是固定不变的。
因此我们可以将这些资源文件部署到静态资源文件服务器上,用例如 https://host:port/static/css/ 的路径来访问它。然后在生成报告时,将这个部署出来的服务器地址作为 --static_root的参数传过去,这样导出的报告文件里面将不再包含static文件,HTML报告想要访问静态资源文件时,访问的就是 static_root给的地址:
airtest report D:/test/report_test.air --log_root D:/log --lang en --static_root https://host:port/ --export D:/export/
需要注意的是,如果传入给static_root的不是以http开头的资源服务器地址,而是一个本地路径,导出报告时,还是会把给定的本地路径里面的静态文件复制过来一份。
使用pycharm等编写/运行脚本
讲完了如何在命令行上运行自动化脚本,接下来我们再来看看,如果不使用AirtestIDE,如何在其它python编辑器中编写、运行Airtest和poco脚本。
以pycharm编辑器为例,首先需要保证你所用项目使用的python环境里安装了airtest和pocoui库。可以在文件--设置--项目中查看:

如未安装,则点击package右侧的+号,把airtest和pocoui安装好。
环境弄好以后,我们就可以开始编写自动化脚本了,新建一个.py文件,添加上引入和初始化代码,也可以直接把.air脚本的初始化代码复制过来,但需要注意的是,pycharm不会自动帮我们连接设备,所以我们需要自己在脚本中添加连接设备的代码,这里以在auto_setup连接设备为例:
auto_setup(__file__,devices=["android://127.0.0.1:5037/emulator-5554?cap_method=JAVACAP&&ori_method=MINICAPORI&&touch_method=MINITOUCH"])
更多连接设备的接口,可以参看刚才给你们推荐的文章。确保先编写完设备连接的脚本,再来编写airtest脚本,这里以点击微信为例,首先截取一张微信icon的截图,利用你们电脑里装有的截图工具即可,然后把截图文件保存在你本地路径,比如 D:\atest_image\wechat.png,然后把截图的保存路径添加到你的点击脚本里面:
touch(Template(r"D:\atest_image\wechat.png", threshold=0.8,))
这样就完成了1个很简单的自动化脚本了:

当然,如果要编写poco脚本的话,因为在pycharm中看不到设备的UI树,所以我们可以打开AirtestIDE来查看UI树,然后在pycharm上编写对应的poco语句即可。
最后就是生成报告了,我们可以调用一些airtest提供的接口帮助我们生成报告,比如simple_report、LogToHtml类等。
以simple_report接口为例:

因为报告是根据log内容来生成的,所以我们需要在脚本初始化添加logdir参数,用于保存脚本运行的log内容到指定路径,使用simple_report生成报告的时候,也要把logpath传进去,让他去对应的路径找log内容来生成报告。
关于用脚本生成报告更多详细的内容,大家可以参看这篇推文,我们就不一一在这里讲述了。

小结
那么今天的内容就到这里为止啦,这节课的内容比较多,大家课后可以多多实践,好好消化下。

至此,关于自动化脚本编写专题的课程就讲完了,下节课我们将进入一个新的章节,手把手教大家如何接入pocosdk,然后用poco这个框架来测试引擎渲染的游戏。下期我们不见不散~