前面我们讲了unittest框架如何实现报告生成,那么在Pytest中如何实现报告生成呢?在pytest中实现报告生成我们可以使用以下四种方法,如:resultlog文件、JunitXML文件、Html文件、Allure报告等。我们将重点讲解Html和Allure两种报告的生成方式。
——————————————
❶ResultLog、JunitXML文件生成
——————————————
直接使用pytest运行对应的测试用例模块文件,在该文件后面添加两个参数--result-log=log需要存放的路径 --junit-xml=xml所需要保存的路径,具体实现如下:
那么就会在F盘的test目录下会生成两个文件
打开这两个文件你会发现实际不是很好分析结果,所以这两种方式大家只需要知道有这个参数即可,一般很少使用。
——————————————
❷Pytest-html模块基本使用
——————————————
如果想要生成与unittest框架一样的html报告的话,则需要引用第三方模块pytest-html模块。
安装,直接通过pycharm中settings进行安装或者pip install pytest-html。
再次强调,注意你们使用的环境,有些时候装了两套python环境,你们上面的两种安装方式不同则会处于不同的环境中被安装。
安装完成,直接使用命令pytest --html=需要保存报告所在路径 需要执行的测试用例模块文件即可生成html报告了。
在pycharm中具体设置如下:
dos中执行方式:
那么在F盘中会生成如下图所示:
打开test.html文件内容如下图:
从文件夹中发现会生成两个文件,一个是文件夹里面存放的是css样式的,一个是html文件,但是如果我只想生成一个html文件的话,如何实现?
可以添加参数--self-contained-html即可。例如:如下操作
最后你在F盘中会发现只有一个文件test1.html不会生成一个assets文件夹了,因为此时已经将css写入到html页面中去了。
当然,如果你不想用它自带的css样式的话,可以自己写相关的css样式,然后应用到报告中即可,添加参数--css自定义的css样式文件所在路径。
——————————————
❸Pytest-html报告增强
——————————————
大家看到上面的报告应该有所发现我的报告跟你们是否有所不同呢?
因为我实现了报告新增三列去除了一列,分别是Time列、Y OR N列、Description列以及去除了link列。
那么是如何实现的呢?实际大家只是分析和查看官网可以发现,具体提供了操作方式:https://github.com/pytest-dev/pytest-html
下面是官网的部分描述截图
我们来分析下上面代码吧。
首先第一个函数,是实现表格的表头设计,设计了两列,分别是Description和Time。并且Time列实现了排序操作。第二个函数实现是对应表头每行值的定义,实际description指的就是在程序中的doc注释。而Time的值使用的utcnow的值,会发现与当前自己的系统时间相差八小时,因为我们处于的是东八区,utc获取的是世界协调时间。所以我们可以自己通过localtime以及strftime方法完成获取当前计算机时间并自定义格式。
具体实现的代码如下:
from datetime import datetime from py.xml import html import pytest import time #声明报告表格的表头定义 def pytest_html_results_table_header(cells): #insert方法的第一个参数表示是插入到表格的是第几列,第二个参数是表头名 cells.insert(2, html.th('Description')) cells.insert(1, html.th('Time', class_='sortable time', col='time')) cells.insert(3, html.th('Y OR N')) cells.pop() #实现对应表头的行的值的操作,description、实际就是我们声明的每个方法对应docstring值 def pytest_html_results_table_row(report, cells): cells.insert(2, html.td(report.description)) #下面我们自定义格式时间 cells.insert(1, html.td(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()), class_='col-time')) cells.insert(3,html.td("Y")) cells.pop() @pytest.hookimpl(hookwrapper=True) def pytest_runtest_makereport(item, call): outcome = yield report = outcome.get_result() #__doc__属性是系统内置的,前面我们讲过,用于获取类。方法、函数的doc注释 report.description = str(item.function.__doc__)
复制