pytest两种生成测试报告的方法——html

news2024/11/15 5:38:01

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行表示的是概括,但默认的内容只有用例总数和运行时间,如果我们想要增加自己想要的c

在这里插入图片描述
信息模块,可在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会增加内存消耗


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


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

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

import allure<br><br>
@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修改默认标题

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作用于

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

@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描述

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(),可在函数中使用(“”“”“”),生成测试报告会自动获取

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():

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

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有四种等级

在这里插入图片描述
(2)具体用法:@allure.severity(“等级”)

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参数化

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

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日志,具体写法如下(这里你定义一个函数,编写在函数中)

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

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打印的内容

最后:下方这份完整的自动化测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取 【保证100%免费】

)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/382091.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32物联网项目之程序框架

前言&#xff1a; 这个系列&#xff0c;我主要写我用32f103实现的各种功能模块&#xff0c;已经程序编写过程中&#xff0c;硬件调试中出现的问题&#xff0c;一边记录&#xff0c;一边分享&#xff0c;一边复盘。 使用的是STM32cubemax&#xff0c;自动生成代码&#xff0c;…

每日学术速递3.2

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Interactive Segmentation as Gaussian Process Classification(CVPR 2023) 标题&#xff1a;作为高斯过程分类的交互式分割 作者&#xff1a;Minghao Zhou, Hong Wang, Qian Zha…

tensorflow1.14.0安装教程--保姆级

//方法不止一种&#xff0c;下面仅展示一种。 注&#xff1a;本人电脑为win11&#xff0c;anaconda的python版本为3.9&#xff0c;但tensorflow需要python版本为3.7&#xff0c;所以下面主要阐述将python版本改为3.7后的安装过程以及常遇到的问题。 1.首先电脑安装好anaconda…

java进阶—多线程

学习线程&#xff0c;我们先来了解了解什么是进程&#xff1f;什么是线程 进程&#xff1a;就是在操作系统中运行的程序 线程&#xff1a;就是进程的一个执行单元&#xff0c;或者一条执行路劲 比如&#xff1a;我们打开应用商店&#xff0c;这个应用商店就是一个进程&#…

字节实习二面

网络体系结构分层&#xff08;7、5、4&#xff09; 答&#xff1a; OSI七层网络体系结构&#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 TCP/IP四层网络体系结构&#xff1a;物理层、网际层、传输层、应用层 TCP/IP五层网络体系结构&#xff1a;物…

ShopWind 多商户商城更新,Vue 3 前后端分离,页面自定义装修

本次为 V4 版本更新&#xff0c;新系统架构(技术栈)vue3 vite (打包编译工具) Composition API(组合式 API setup) Element Plus vueRouter (路由) 第三方组件&#xff1a;axios (数据请求) wangeditor(编辑器)&#xff0c;都是通过接口访问数据&#xff0c;页面效果更佳了…

【强烈建议收藏:MySQL面试必问系列之并发事务锁专题】

一.知识回顾 上节课我们一起学习了MySQL面试必问系列之事务&#xff0c;没有学习的同学可以看一下上一篇文章&#xff0c;肯定对你会有帮助&#xff0c;学习过的同学肯定知道&#xff0c;上节课我们留了一个小尾巴&#xff0c;这个小尾巴是什么呢&#xff1f;就是没有详细展开…

MPI ubuntu安装,mpicc,mpicxx,mpif90的区别

介绍 MPI是并行计算的一个支持库&#xff0c;支持对C、C、fortran语言进行并行计算。 安装基础环境 ubuntu进行gcc/g/gfortran的安装&#xff1a; gcc&#xff1a; ubuntu下自带gcc编译器。可以通过gcc -v命令来查看是否安装。 g&#xff1a; sudo apt-get install buil…

【Python学习笔记】第二十四节 Python 正则表达式

一、正则表达式简介正则表达式&#xff08;regular expression&#xff09;是一个特殊的字符序列&#xff0c;它能帮助你方便的检查一个字符串是否与某种模式匹配。正则表达式是对字符串&#xff08;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特…

Day07-flex布局

文章目录弹性布局一 简介二 弹性容器案例-让多个div排成一行三 容器项目的对齐方式案例1-justify-content(主轴对齐)案例2-flex-wrap(换行)案例3-align-items(侧轴对齐)案例4-align-self(项目垂直对齐)案例5-flex-direction(改变轴向)案例6-弹性布局应用四 弹性项目-flex属性案…

离开央视的欧阳夏丹,在艺考培训机构当老师,是金子到哪都会发光

说起中央电视台&#xff0c;大家都认为这是主持界的殿堂&#xff0c;但凡能在这里工作的人&#xff0c;都是出类拔萃的人才。在中央电视台&#xff0c;确实也出现过很多人才&#xff0c;比如说主持界的康辉、撒贝宁、朱军、周涛等等。 除了以上这些主持人&#xff0c;欧阳夏丹也…

【高效办公】批量生成固定模板的文件夹名称

老师让你按照他的要求生成每位学生的文件夹,你是学委,让你马上完成该任务,但你又不想是手动一个一个码字,因此聪明的你就看到了本篇文章啦!!! 虽说一个人懒惰,并不是好的事情。 但这个似乎合情合理啊~ 然后,就动手想办法,一开始就真的打算码字了。。 思路 在实际开…

机器学习笔记之狄利克雷过程(二)基于标量参数作用的推导过程

机器学习笔记之狄利克雷过程——基于标量参数作用的推导过程引言回顾&#xff1a;狄利克雷过程——基本介绍狄利克雷过程——定义小插曲&#xff1a;狄利克雷分布的简单性质关于标量参数作用的推导过程引言 上一节以高斯混合模型为引&#xff0c;简单介绍了狄利克雷过程(Diric…

虹科分享| 浅谈HK-Edgility边缘计算平台

上周&#xff0c;我们推出了虹科新品HK-Edgility边缘计算平台以及uCPE解决方案。本篇文章我们再来谈一谈到底什么是边缘计算&#xff1f;为什么需要边缘计算&#xff1f;边缘计算和云计算有什么关系&#xff1f;HK-Edgility边缘计算平台将为您带来什么&#xff1f;一、边缘计算…

【C++】vector实现(深浅拷贝详细理解,迭代器失效)

&#x1f345;可以先去这个网站看一下个个函数的功能 本文不再详细介绍&#xff0c;vector的底层还是顺序表&#xff0c;我讲的很详细&#xff0c;建议没学过顺序表的先预习一下&#xff08;主页搜索顺序表&#xff0c;还有配套习题&#xff09; C网站关于vector的接口函数信息…

雅思积累(十八)同义替换

同义替换&#xff1a;sophisticated —— complicatedspecific —— detailed —— particularquantity —— wealth —— volume —— numbersettle —— schedule —— arrange —— fixswift —— rapid —— fast —— quickexpertise —— professional knowledge —— sk…

【云原生kubernetes】k8s中job与cronjob使用详解

一、前言 job&#xff0c;顾名思义就是任务&#xff0c;job的概念在很多框架中都有&#xff0c;而且实际业务场景中也使用非常广泛&#xff0c;比如大家熟悉的hadoop&#xff0c;客户端可以向集群提交一个job&#xff0c;然后集群根据一定的调度策略来处理这个job&#xff1b; …

【2023unity游戏制作-mango的冒险】-6.关卡设计

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity游戏制作 ⭐mango的冒险关卡设计⭐ 文章目录⭐mango的冒险关卡设计⭐&#x1f468;‍&#…

软件测试之jira

Jira 1. Jira 概述 JIRA 是澳大利亚 Atlassian 公司开发的一款优秀的问题跟踪管理软件工具&#xff0c;可以对各种类型的问题进行跟踪管理&#xff0c;包括缺陷、任务、需求、改进等。JIRA采用J2EE技术&#xff0c;能够跨平台部署。它正被广泛的开源软件组织&#xff0c;以及…

更新 TKK 失败,请检查网络连接。谷歌翻译 translation插件不能用解决办法 亲测有效

谷歌翻译无法使用&#xff0c;谷歌回应解释是&#xff0c;谷歌翻译使用率过低&#xff0c;所以选择停止服务。网上也有说法&#xff0c;指出根本原因为&#xff0c;提供API接口的googleapis被墙&#xff0c;这导致js文件和字体资源无法加载。 这里提供两种解决办法 方案一 修…