🚀 优质资源分享 🚀

学习路线指引(点击解锁) 知识定位 人群定位
🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

pytest有两种生成测试报告的方法(html和allure),今天就给大家一一介绍下

html

一.pytest-html基本语法

1.安装:pip install pytest-html

2.查看版本:pip show pytest-html

3.生成测试报告基本语法:

语法一:pytest --html=生成报告的url  运行用例的.py文件

语法二:pytest --html=生成报告的url  --self-contained-html 运行用例的.py文件

二.实例

1.创建一个test_pytestHtml.py文件,编写几条用例(忽略警告)

2.在Terminal运行命令:pytest --html=生成报告的url  运行用例的.py文件,运行成功后,这个时候我们去

生成报告的url下可以看见生成两个文件,一个是我们生成的html报告,另一个是assets文件,里面存放的是

css文件,打开素材的html报告后可以看见用例的执行情况

3.我们再在Terminal运行命令:pytest --html=生成报告的url  --self-contained-html 运行用例的.py文件,

同样运行成功后,我们去看下生成的文件,发现只有html生成,并没有assets文件,这是因为css语法

写在了html文件中,没有单独放出来。所以方便以后报告的发送,建议使用第二中语法。

三.修改生成的测试报告(挂钩用法见pytest官方:https://docs.pytest.org/en/latest/reference/reference.html#hooks)

1.环境的修改

我们可以看到在html中248行,环境是以表格的形式呈现出来的,如果我们想删除某些默认环境或者添加自

己想要的环境,可在根目录下创建conftest.py文件,如下图,pytest_configure(config): 许插件和conftest文

件执行初始配置。我在再来重新生成html报告可以看见我们在Environment下修改的内容

2.概括的修改

可以看到源代码中264行表示的是概括,但默认的内容只有用例总数和运行时间,如果我们想要增加自己想要的

信息模块,可在conftest.py下编写函数,再次运行生成html文件就可看见需要的内容了

3.标题的修改

同样在conftest文件下编写pytest_html_report_title函数,如下

allure(如果可以的话建议使用allure,美观+高级+好用)

一.环境配置

1.下载jdk配置java运行环境,下载地址:https://www.oracle.com/java/technologies/downloads/#jdk18-windows

2.下载安装完成后配置java环境变量(属性>高级设置>环境变量>新建),添加JAVA_HOME。

在path下里添加:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

3.配置完成后可在dos窗口输入javac,java -version,能输出版本号及相关指令即安装配置成功

4.下载allure工具:https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/,下载成功

后配置环境变量,path下添加allure的bin文件所在目录

5.配置完成在dos创建输入allure有相关内容时即安装成功

6.安装allure-pytest工具,打开你使用的编程工具,这里以pycharm为例,在Terminal输入pip install allure-pytest

二.allure报告的生成指令

1.生成json文件:pytest  -q --alluredir=生成json文件的路径     需要运行的case路径(说明:-q简要输出)

2.将生成的json文件转出html格式

(1)指定路径生成html报告:allure  generate -o  生成html报告的路径    json文件路径

(2)默认路径生成html报告:allure generate -clear   json文件路径(说明:默认路径

为allure-report,clear清空该路径原有的报告)

(3)open及serve用法

serve:allure serve  -o  生成html报告的路径    json文件路径(说明:与generater

不同的是,serve生成html后会自动在浏览器打开该报告)

open:allure open  -h  ip地址  html路径(说明:打开生成的html报告)

注:serve和open运行时会自动打开一个java进程,且只能手动关闭,因此多次使用

serve和open会增加java消耗

三.allure报告的用法(本次介绍下面几种常用的allure方法)

| 方法 | 说明 |
| @allure.epic() | 一级类目 |
| @allure.feature() | 二级类目 |
| @allure.story() | 三级类目 |
| @allure.title() | 用例标题 |
| @allure.testcase() | case地址 |
| @allure.issue() | bug地址 |
| @allure.description() | case描述 |
| @allure.step() | case步骤 |
| @allure.severity() | case等级 |
| @allure.link() | 链接 |

1.@allure.epic(),allure.feature(),allure.story()的使用

(1)创建一个test.two.py文件,写法如下

?

| 123456789101112 | import allure``@allure``.epic(``"我是一级目录"``)``@allure``.feature(``"我是二级目录"``)``@allure``.story(``"我是三级目录"``)``class TestDome:``def test_one(``self``):``print``(``"我是test_one"``)``assert True def test_two(``self``):``print``(``"我是test_two"``)``assert False |

(2)生成json文件:pytest --alluredir=./report/2022-5-22  testcase/test_two.py

(3)将生成的json文件转出html:allure generate -o ./allure-report/2022-5-22  ./report/2022-5-22

此时我们可以看见allrue-report目录下有个2022-5-22/index.html,打开后在Behaviors下可看见运行case

2.@allure.title()的使用

(1)从上面可以看出每条case的标题都是函数名字(如:test_one,test_two),我们可以用title修改默认标题

?

| 12345678910 | class TestDome:``@allure``.title(``"我是one"``)``def test_one(``self``):``print``(``"我是test_one"``)``assert True @allure``.title(``"我是two"``)``def test_two(``self``):``print``(``"我是test_two"``)``assert False |

(2)运行后的结果

3.@allure.testcase(),@allure.issue(),@allure.link()用法

(1)allure作用与class上,那么该class下所有的函数都会被定义到,如果allure作用于

每个函数上,那么只对该函数生效

?

| 12345678910111213 | @allure``.testcase(``"path url"``, name``=``"我是存放测试用例的地址"``)``@allure``.issue(``"bug url"``, name``=``"bug地址"``)``@allure``.link(``"link url"``, name``=``"链接地址"``)``class TestDome:``@allure``.title(``"我是one"``)``def test_one(``self``):``print``(``"我是test_one"``)``assert True @allure``.title(``"我是two"``)``def test_two(``self``):``print``(``"我是test_two"``)``assert False |

(2)运行后的结果,可以看出case右侧多出links模块

4.@allure.description()用法

(1)用法一:使用description编写case描述

?

| 123456789101112131415161718192021 | import pytest``import allure  @allure``.epic(``"我是一级目录"``)``@allure``.feature(``"我是二级目录"``)``@allure``.story(``"我是三级目录"``)``@allure``.testcase(``"path url"``, name``=``"我是存放测试用例的地址"``)``@allure``.issue(``"bug url"``, name``=``"bug地址"``)``@allure``.link(``"link url"``, name``=``"链接地址"``)``class TestDome:``@allure``.description(``"我是来描述test_one这条case的"``)``@allure``.title(``"我是one"``)``def test_one(``self``):``print``(``"我是test_one"``)``assert True @allure``.title(``"我是two"``)``def test_two(``self``):``print``(``"我是test_two"``)``assert False |

运行后该条case右侧overview多出了description模块

(2)用法二:无需使用@allure.description(),可在函数中使用(“”“”“”),生成测试报告会自动获取

?

| 123456789101112131415161718192021222324 | import pytest``import allure  @allure``.epic(``"我是一级目录"``)``@allure``.feature(``"我是二级目录"``)``@allure``.story(``"我是三级目录"``)``@allure``.testcase(``"path url"``, name``=``"我是存放测试用例的地址"``)``@allure``.issue(``"bug url"``, name``=``"bug地址"``)``@allure``.link(``"link url"``, name``=``"链接地址"``)``class TestDome:``@allure``.title(``"我是one"``)``def test_one(``self``):``"""我是test_one实例方法,该方法是TestDome第一个实例方法"""``print``(``"我是test_one"``)``assert True @allure``.title(``"我是two"``)``def test_two(``self``):``print``(``"我是test_two"``)``assert False # pytest --alluredir=./report/2022-5-22-02  testcase/test_two.py``# allure generate -o ./allure-report/2022-5-22-02  ./report/2022-5-22-02 |

运行后的结果

5.@allure.step()用法

(1)该方法在函数外使用时直接@allure.step()即可。要是在函数中使用,需要with allure.step():

?

| 123456789101112131415 | import pytest``import allure  class TestDome:``@allure``.step(``"步骤一"``)``@allure``.step(``"步骤二"``)``@allure``.step(``"步骤三"``)``def test_one(``self``):``print``(``"我是test_one"``)``assert True def test_two(``self``):``print``(``"我是test_two"``)``assert False |

?

| 123456789101112131415 | import pytest``import allure  class TestDome: def test_one(``self``):``with allure.step(``"步骤一:打开登录页面"``):``with allure.step(``"步骤二:输入正确的用户名和密码"``):``with allure.step(``"步骤三:点击登录"``):``assert True def test_two(``self``):``print``(``"我是test_two"``)``assert False |

运行后结果,可以看到test body下的运行步骤

6.@allure.severity()用法

(1)severity有四种等级

| blocker | 阻塞缺陷 |
| critical | 严重缺陷 |
| normal | 一般缺陷 |
| trivial | 轻微缺陷 |
| minor | 次要缺陷 |

(2)具体用法:@allure.severity(“等级”)

?

| 123456789101112131415 | import pytest``import allure  class TestDome:``@allure``.severity(``"trivial"``)``def test_one(``self``):``with allure.step(``"步骤一:打开登录页面"``):``with allure.step(``"步骤二:输入正确的用户名和密码"``):``with allure.step(``"步骤三:点击登录"``):``assert True def test_two(``self``):``print``(``"我是test_two"``)``assert False |

(3)运行结果,如果不手动定义的话,默认为normal bug

四.allure和pytest参数连用

1.@pyteat.mark.parametrize参数化

?

| 123456789101112131415 | import pytest``import allure  class TestDome:``@pytest``.mark.parametrize(``"param"``, [{``"name"``: "李明"``, "age"``: 18``}, {``"name"``: "李华"``, "age"``: 17``}])``def test_one(``self``,param):``with allure.step(``"步骤一:打开登录页面"``):``with allure.step(``"步骤二:输入正确的用户名和密码"``):``with allure.step(``"步骤三:点击登录"``):``assert True def test_two(``self``):``print``(``"我是test_two"``)``assert False |

运行后结果,可以看出这里test_one运行了两次,成功测试报告后参数值会自己填充在parameters中

2.skip和xfail

(1)我们先来了解下这两种方法的定义

@pytest.mark.skip()来跳过该条case不执行,可以看出以下代码运行后并不会执行test_one  case

import pytestimport allureclass TestDome:    @pytest.mark.skip(reason="跳过该条case")    def test\_one(self):        print("我是test\_one")        assert True    def test\_two(self):        print("我是test\_two")        assert True

@pytest.mark.xfail()标记预期结果值,

?

| 12345678910111213 | import pytest``import allure  class TestDome:``@pytest``.mark.xfail(reason``=``"预期返回True"``)``def test_one(``self``):``print``(``"我是test_one"``)``assert True def test_two1(``self``):``print``(``"我是test_two"``)``assert True |

(2)接下来进入正题,skip and xfail与alure一起使用这里直接贴图吧,具体写法和上面一致

这里可以看出test_one case跳过后并没有运行,置灰显示

五.在allure报告中打印日志和print内容

1.首先我们需要先封装下logging日志,具体写法如下(这里你定义一个函数,编写在函数中)

?

| 1234567891011121314 | import logging``import os logger = logging.getLogger(``"weixin_api_log"``) # 设置日志名称``logger.setLevel(logging.DEBUG) # 设置日志等级``formats = logging.Formatter(``"[%(asctime)s] [%(levelname)s] %(message)s"``) # 设置打印格式``file_url = logging.FileHandler(``"C:/Users/XXX/PycharmProjects/weixin_api/log/weixin.log"``, mode``=``"a+"``,``encoding``=``"utf8"``) # log文件路径``# file_url1 = logging.StreamHandler()  # 操作台打印``file_url.setFormatter(formats) # 赋予打印格式``# file_url1.setFormatter(formats) logger.addHandler(file_url)``# logger.addHandler(file_url1) |

2.创建test_one.py调用logging

?

| 123456789101112131415 | import pytest``import allure``from commom.log import logger``import datetime  class TestDome:``def test_one(``self``):``logger.debug(f``"日志时间:{datetime.datetime.now()}"``)``print``(``"我是test_one"``)``assert True def test_two1(``self``):``print``(``"我是test_two"``)``assert True |

3.运行结果(这里需要注意的是,运行是不用加-s参数,如果加的话,print打印内容不会再报告中显示)

在test body下log里会展示打印的日志,stdout里展示的是print打印的内容

Logo

一站式 AI 云服务平台

更多推荐