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文件,写法如下

  1. import allure

  2. @allure.epic("我是一级目录")
  3. @allure.feature("我是二级目录")
  4. @allure.story("我是三级目录")
  5. class TestDome:
  6. def test_one(self):
  7. print("我是test_one")
  8. assert True
  9.  
  10. def test_two(self):
  11. print("我是test_two")
  12. 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修改默认标题

  1. class TestDome:
  2. @allure.title("我是one")
  3. def test_one(self):
  4. print("我是test_one")
  5. assert True
  6.  
  7. @allure.title("我是two")
  8. def test_two(self):
  9. print("我是test_two")
  10. assert False

(2)运行后的结果

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

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

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

  1. @allure.testcase("path url", name="我是存放测试用例的地址")
  2. @allure.issue("bug url", name="bug地址")
  3. @allure.link("link url", name="链接地址")
  4. class TestDome:
  5. @allure.title("我是one")
  6. def test_one(self):
  7. print("我是test_one")
  8. assert True
  9.  
  10. @allure.title("我是two")
  11. def test_two(self):
  12. print("我是test_two")
  13. assert False

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

4.@allure.description()用法

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

  1. import pytest
  2. import allure
  3.  
  4. @allure.epic("我是一级目录")
  5. @allure.feature("我是二级目录")
  6. @allure.story("我是三级目录")
  7. @allure.testcase("path url", name="我是存放测试用例的地址")
  8. @allure.issue("bug url", name="bug地址")
  9. @allure.link("link url", name="链接地址")
  10. class TestDome:
  11. @allure.description("我是来描述test_one这条case的")
  12. @allure.title("我是one")
  13. def test_one(self):
  14. print("我是test_one")
  15. assert True
  16.  
  17. @allure.title("我是two")
  18. def test_two(self):
  19. print("我是test_two")
  20. assert False

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

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

  1. import pytest
  2. import allure
  3.  
  4. @allure.epic("我是一级目录")
  5. @allure.feature("我是二级目录")
  6. @allure.story("我是三级目录")
  7. @allure.testcase("path url", name="我是存放测试用例的地址")
  8. @allure.issue("bug url", name="bug地址")
  9. @allure.link("link url", name="链接地址")
  10. class TestDome:
  11. @allure.title("我是one")
  12. def test_one(self):
  13. """我是test_one实例方法,该方法是TestDome第一个实例方法"""
  14. print("我是test_one")
  15. assert True
  16.  
  17. @allure.title("我是two")
  18. def test_two(self):
  19. print("我是test_two")
  20. assert False
  21.  
  22. # pytest --alluredir=./report/2022-5-22-02 testcase/test_two.py
  23. # allure generate -o ./allure-report/2022-5-22-02 ./report/2022-5-22-02

运行后的结果

5.@allure.step()用法

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

  1. import pytest
  2. import allure
  3.  
  4. class TestDome:
  5. @allure.step("步骤一")
  6. @allure.step("步骤二")
  7. @allure.step("步骤三")
  8. def test_one(self):
  9. print("我是test_one")
  10. assert True
  11.  
  12. def test_two(self):
  13. print("我是test_two")
  14. assert False
  1. import pytest
  2. import allure
  3.  
  4. class TestDome:
  5.  
  6. def test_one(self):
  7. with allure.step("步骤一:打开登录页面"):
  8. with allure.step("步骤二:输入正确的用户名和密码"):
  9. with allure.step("步骤三:点击登录"):
  10. assert True
  11.  
  12. def test_two(self):
  13. print("我是test_two")
  14. assert False

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

6.@allure.severity()用法

(1)severity有四种等级

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

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

  1. import pytest
  2. import allure
  3.  
  4. class TestDome:
  5. @allure.severity("trivial")
  6. def test_one(self):
  7. with allure.step("步骤一:打开登录页面"):
  8. with allure.step("步骤二:输入正确的用户名和密码"):
  9. with allure.step("步骤三:点击登录"):
  10. assert True
  11.  
  12. def test_two(self):
  13. print("我是test_two")
  14. assert False

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

四.allure和pytest参数连用

1.@pyteat.mark.parametrize参数化

  1. import pytest
  2. import allure
  3.  
  4. class TestDome:
  5. @pytest.mark.parametrize("param", [{"name": "李明", "age": 18}, {"name": "李华", "age": 17}])
  6. def test_one(self,param):
  7. with allure.step("步骤一:打开登录页面"):
  8. with allure.step("步骤二:输入正确的用户名和密码"):
  9. with allure.step("步骤三:点击登录"):
  10. assert True
  11.  
  12. def test_two(self):
  13. print("我是test_two")
  14. assert False

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

2.skip和xfail

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

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

  1. import pytest
    import allure

    class 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()标记预期结果值,

  1. import pytest
  2. import allure
  3.  
  4. class TestDome:
  5. @pytest.mark.xfail(reason="预期返回True")
  6. def test_one(self):
  7. print("我是test_one")
  8. assert True
  9.  
  10. def test_two1(self):
  11. print("我是test_two")
  12. assert True

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

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

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

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

  1. import logging
  2. import os
  3.  
  4. logger = logging.getLogger("weixin_api_log") # 设置日志名称
  5. logger.setLevel(logging.DEBUG) # 设置日志等级
  6. formats = logging.Formatter("[%(asctime)s] [%(levelname)s] %(message)s") # 设置打印格式
  7. file_url = logging.FileHandler("C:/Users/XXX/PycharmProjects/weixin_api/log/weixin.log", mode="a+",
  8. encoding="utf8") # log文件路径
  9. # file_url1 = logging.StreamHandler() # 操作台打印
  10. file_url.setFormatter(formats) # 赋予打印格式
  11. # file_url1.setFormatter(formats)
  12.  
  13. logger.addHandler(file_url)
  14. # logger.addHandler(file_url1)

2.创建test_one.py调用logging

  1. import pytest
  2. import allure
  3. from commom.log import logger
  4. import datetime
  5.  
  6. class TestDome:
  7. def test_one(self):
  8. logger.debug(f"日志时间:{datetime.datetime.now()}")
  9. print("我是test_one")
  10. assert True
  11.  
  12. def test_two1(self):
  13. print("我是test_two")
  14. assert True

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

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

自动化测试报告(allure/html)的更多相关文章

  1. Allure自动化测试报告我是这样用的

    关于自动化测试报告: 之前用过testNG自带的测试报告.优化过reportNG的测试报告.extentreport.Zreport(大飞总原创),这些是我之前都用过的,也是在去年雯姐和我说过Allu ...

  2. Allure自动化测试报告之修改allure测试报告名称

    1.从github获取allure代码 https://github.com/allure-framework/allure2 2.安装gradle,用于打包jar brew install grad ...

  3. Python&Selenium&pytest借助allure生成自动化测试报告

    一.摘要 本篇博文将介绍Python和Selenium进行自动化测试时,如何借助allure生成自动化测试报告 二.环境配置 首先python环境中安装pytest和pytest_allure_ada ...

  4. 【测试设计】使用jenkins 插件Allure生成漂亮的自动化测试报告

    前言 以前做自动化测试的时候一直用的HTMLTestRunner来生成测试报告,后来也尝试过用Python的PyH模块自己构建测试报告,在后来看到了RobotFramework的测试报告,感觉之前用的 ...

  5. pytest+allure生成接口自动化测试报告

    准备环境 1.安装pytest pip install pytest -i http://pypi.douban.com/simple pytest-ordering pytest.main([ &q ...

  6. jmeter生成html格式接口自动化测试报告

    jmeter生成html格式接口自动化测试报告 jmeter自带执行结果查看的插件,但是需要在jmeter工具中才能查看,如果要向领导提交测试结果,不够方便直观. 笔者刚做了这方面的尝试,总结出来分享 ...

  7. HTMLTESTRunner自动化测试报告增加截图功能

    我们都知道HTMLTESTRunner自动化测试报告,是Unittest单元测试框架报告,那么在做ui测试的时候就有点不适用了. 我们需要出错截图功能. 以下是我改的,增加了截图功能,先展示界面,再展 ...

  8. Python+Selenium----使用HTMLTestRunner.py生成自动化测试报告2(使用PyCharm )

    1.说明 在我前一篇文件(Python+Selenium----使用HTMLTestRunner.py生成自动化测试报告1(使用IDLE ))中简单的写明了,如何生产测试报告,但是使用IDLE很麻烦, ...

  9. Python+Selenium----使用HTMLTestRunner.py生成自动化测试报告1(使用IDLE)

    1.说明 自动化测试报告是一个很重要的测试数据,网上看了一下,使用HTMLTestRunner.py生成自动化测试报告使用的比较多,但是呢,小白刚刚入手,不太懂,看了很多博客,终于生成了一个测试报告, ...

  10. Python2 HTMLTestRunner自动化测试报告美化

    python2 的测试报告美化,需要的同学直接用 #coding=utf-8 """ A TestRunner for use with the Python unit ...

随机推荐

  1. HTTP权威指南:第二章

    URL概览 前面提到,URL资源是HTTP协议所使用的寻找资源位置的定位符.分为三个部分,主要的结构是: 方案://服务器/路径 这种结构使得网络上的每一个资源都只有唯一的命名方法,从而使得浏览器可以 ...

  2. 聊聊 DisplayObject 的x/y/regX/regY/rotation/scale/skew 属性

    首先要指出的是:DisplayObject 实例的属性<x, y> 与 graphics.draw*(x, y, ...) 的参数<x, y>没有关系. 在原生的 Canvas ...

  3. IO流入门

    @ 目录 总结内容 1. IO流是什么 2. 字符流和字节流 3. File常用API(前面类型为返回类型) 4. 编码转换 5. IO流实现流程 6. 输入输出流简单实现 7. 输入输出流简单实现 ...

  4. Windows CMD常用命令集合

    CMD命令: 开始->运行->键入cmd或command(在命令行里可以看到系统版本.文件系统版本) chcp 修改默认字符集chcp 936默认中文chcp 65001 1. appwi ...

  5. npm使用淘宝镜像源

    npm使用淘宝镜像源 单次使用 npm install koa --registry=https://registry.npm.taobao.org 永久使用 配置淘宝镜像源 npm config s ...

  6. Springboot集成cache的key生成策略

    代码接上文:深度理解springboot集成redis缓存之源码解析 ## 1.使用SpEL表达式 @Cacheable(cacheNames = "emp",key = &quo ...

  7. SpringBoot注解自动扫描-底层实现

    分析上文Spring Boot快速入门 @SpringBootApplication public class HelloWorldApplication { public static void m ...

  8. uniapp中添加vant组件

    首先是npm i vant@2 -S 下载vant包 接下来就是找到main.js引入vant 然后就是在页面中直接使用 会发现没有样式 最后再找到app.vue再style里面全局引入vant的样式 ...

  9. java高级用法之:在JNA中使用类型映射

    目录 简介 类型映射的本质 TypeMapper NativeMapped 总结 简介 JNA中有很多种映射,library的映射,函数的映射还有函数参数和返回值的映射,libary和函数的映射比较简 ...

  10. Java语言学习day15--7月21日

    今日内容介绍1.Eclipse开发工具2.超市库存管理系统 ###01Eclipse的下载安装 * A: Eclipse的下载安装  * a: 下载 * http://www.eclipse.org ...