此文章来源于项目官方公众号:“AirtestProject”
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途

前言

最近依然收到来自答疑群小伙伴对生成报告这方面的疑问,包含生成报告和导出报告的区别、能不能不用 IDE 来生成报告、如何在用脚本生成/导出报告等等,今天的推文将跟大家一一详解这些问题:

1.在 IDE 中一键生成、导出报告

① 生成报告

如果同学们使用我们专用的编辑器 AirtestIDE 来编写和运行脚本,那么同学们就可以非常便捷地在 IDE 中使用快捷键生成和导出报告。

运行完脚本之后,点击顶部菜单栏的 查看报告 按钮(快捷键 Ctrl+L),即可快速生成并在浏览器中打开 html 格式的报告:

若想查看生成报告的本地文件,可以 右键 点击脚本名称,选择 打开报告文件目录

细心的同学还会发现,在我们点击 查看报告 按钮的同时,log 查看窗会出现 1 条生成报告的命令(这条命令非常重要,下文我们也会讲到):

其实在这条命令中,通过 --outfile 参数,我们也可以知道报告所在的本地文件路径。

但这里有一个新手同学很容易犯的错误值得我们注意下,很多同学找到了报告所在的本地文件夹之后,就直接把这个文件夹打包发给同事/领导查看,结果发现,同事/领导根本不能正常查看这个报告:

出现这个问题的原因其实是,这样生成的 html 报告,里面的一些图片路径和静态资源路径是 绝对路径 。当报告被发到别的电脑上时,html 再想通过绝对路径找到这些图片资源和静态资源,就不可能了,所以才造成 其他人看到的报告完全没有图片和相应样式 的情况。

② 导出报告

那么,为了让别人也可以看到同学们本地生成的报告,我们在 IDE 中提供了导出报告的功能,右键点击脚本名称,选择 导出报告 ,之后再选择导出报告的存放路径即可:

导出报告之后,图片资源和静态资源的路径都被改成了相对路径,并且文件夹中还打包了对应的静态资源文件。这样我们再把导出好的报告发到别的电脑查看时,就不会出现上述问题了。

③ 生成报告失败

另外,在 IDE 中生成/导出报告的时候,我们还有可能会遇到报告生成失败的问题:

这时候可以复制 log 查看窗里面那条生成报告的命令,到本地命令行中运行,查看具体的报错原因(不会分析报错原因也可以发送到 官方答疑 Q 群 1017250147 ,获取官方解答)。

目前遇到最常见的原因就是,同学们在 IDE 中设置了本地 python 环境,并且本地 python 环境中同时安装了 pocopocoui ,这两个库冲突导致生成报告失败。

2.用命令行生成、导出报告

也有很多同学并不满足于在 IDE 中运行脚本,所以他们就会使用命令行来运行脚本、生成报告等等。需要注意的是,在命令行中运行 Airtest 脚本,使用的 python 环境就是 本地 python 环境 了,不是 IDE 集成好的带有 airtestpocoui 库的精简 python 环境(注意是 pocoui ,不是 poco ,若已经安装了 poco ,则需要卸载,否则会跟 pocoui 有冲突)。

所以我们在命令行运行脚本、生成报告之前,要先确保我们本地的 python 环境已经已经装好了 airtestpocoui ,使用 pip list 指令即可查看。

安装命令如下:

pip install airtest
pip install pocoui
① 运行脚本 airtest run ...

在生成报告之前,我们需要先运行 1 次 airtest 脚本,运行脚本的命令是 airtest run + 脚本文件路径 ,另外该命令还可以传入以下几个参数:

示例如下:

airtest run D:/test/report_test.air --device Android:/// --log C:/Users/xiaoming/log --recording 

如果同学们对在命令行运行脚本还不是那么熟悉,可以先在 IDE 中运行脚本,观察 log 查看窗里面那条运行脚本的命令是如何写的,甚至我们可以直接复制该命令到命令行中执行。

② 生成报告 airtest report...

运行完脚本之后,我们就可以在命令行中用 airtest report + 脚本文件路径 指令来生成一份 HTML 格式的报告。

该命令也有非常多的可传参数,例如:

示例如下:

airtest report D:/test/report_test.air --log_root C:/Users/xiaoming/log --outfile E:/log_test/log.html --lang zh

另外,在上文我们有提到,点击 IDE 中 查看报告 按钮的时候,log 查看窗会相应地出现 1 条生成报告的命令,我们也可以复制该命令到命令行中运行,也能够帮助我们生成报告。

③ 导出报告 --export ...

未使用导出参数 --export 生成的报告,与 IDE 点击查看报告按钮生成的报告是一样的,只能在本地查看,不能发到别的电脑上查看。

若需要导出报告,我们需要在生成报告指令时,添加上这个 --export 参数:

# 使用了export参数,outfile参数会失效,所以使用了export参数就可以不使用outfile
airtest report D:/test/report_test.air --log_root C:/Users/xiaoming/log --lang zh --export E:/log_test/

这样生成的报告,图片和资源路径才会是相对路径,并且包含了静态资源文件,能发到别的电脑上查看。

④ 静态资源--static_root ...

但一些经常导出报告的同学会发现,每次导出 1 份报告,就会带有 1 份相同的静态资源文件 static ,它包含了报告中的 css 和 js 等文件,这样的重复拷贝占用了很多的磁盘空间。并且我们知道,除非报告的样式做了某些更新,否则这些静态资源文件都是固定不变的。

所以我们可不可以把这个静态资源文件统一放到 1 个地方,每一份 HTML 报告都去这个地方访问这些静态资源呢?这样即使静态文件有所改变,我们也只需要替换掉这个地方的静态资源文件即可。

答案当然是可以的,使用 --static_root 参数即可实现!我们可以将这些资源文件部署到静态资源文件服务器上,用例如 https://host:port/static/css/ 的路径来访问它。然后在生成报告时,将这个部署出来的服务器地址作为 --static_root 的参数传过去:

airtest report D:/test/report_test.air --log_root C:/Users/xiaoming/log --lang zh --static_root https://host:port  --export E:/log_test/

这样导出的 HTML 报告,里面的静态资源路径,都是部署好的服务器地址。另外需要注意的是,传入 --static_root 的参数需要以 http 开头才能被识别:

关于在命令行生成、导出报告的内容,我们在之前的推文 导出报告总是出错怎么办 有更加详细的介绍和示例,对在命令行运行脚本、生成报告感兴趣的同学可以前往查看下。

3.在脚本中生成、导出报告

如果不借助 IDE 和命令行,我们能不能直接在脚本中调用一些接口,让脚本执行完毕时,自动生成或者导出 1 份报告给我们呢?

我们可以借助 simple_report() 接口或者 LogToHtml() 类来实现。

simple_report生成报告

先来讲讲这个 simple_report 接口,它其实是 1 个简化版的生成报告的接口,可以减少同学们的理解成本和使用成本:

如果同学们不指定任何参数,该接口会使用默认的参数生成 1 份 HTML 格式的报告,output='log.html' 表示在当前脚本路径下生成名为 log.html 的 airtest 报告:

from airtest.report.report import simple_report
simple_report(__file__)

如果指定了 output 参数,则会按指定路径生成报告:

from airtest.report.report import simple_report
simple_report(__file__,logpath=True,output=r"D:\test\report02\log.html")

LogToHtml导出报告

如果同学们不需要通过脚本的形式导出报告,仅需要生成报告在本地查看的话,只要使用 simple_report 接口即可。

但如果需要通过脚本的形式来导出 1 份报告,则需要用到 LogToHtml 类:

这个类的参数相对于 simple_report() 就复杂的多了,包含:

示例如下,我们在指定路径 D:\test\report02 中导出了 D:\test\report01.air 脚本的运行报告,报告语言为英文:

from airtest.report.report import LogToHtml

h1 = LogToHtml(script_root=r'D:\test\report01.air', log_root=r"D:\test\report01.air\log", export_dir=r"D:\test\report02" ,logfile=r'D:\test\report01.air\log\log.txt', lang='en', plugins=None)
h1.report()

③ 用 try-finally 保证最后都能生成报告

一般情况下,生成报告的语句应该是放在所有用例脚本的后面,保证用例执行完毕之后,才执行生成脚本的语句。

但这里容易出现一种情况,一旦前面有用例脚本执行失败,终止了整个脚本的运行,即还没有执行到生成报告的语句时,脚本运行就已经停止了,这样也不能够正常生成报告。

所以我们可以用 try-finally 语句,不论脚本是否运行失败,最终都会生成 1 份运行报告:

try:
    poco("com.netease.newsreader.activity:id/bjd").wait_for_appearance()
    poco("com.netease.newsreader.activity:id/awo").click()
    ...
finally:
    simple_report(__file__,logpath=True,output="../netease_music/登录.html")
    print("-----执行完毕-----")

Airtest 官网:airtest.netease.com/
Airtest 教程官网:airtest.doc.io.netease.com/
搭建企业私有云服务:airlab.163.com/b2b


↙↙↙阅读原文可查看相关链接,并与作者交流