百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

pytest测试框架+allure插件自定义测试报告

ccwgpt 2024-11-02 11:03 121 浏览 0 评论

之前文章我们学习了pytest-html插件生成html测试报告,本章介绍另一个好用的插件。allure-pytest 是pytest的一个插件,帮助我们再pytest测试框架中集成Allure框架来生成详细的测试报告。

Allure 是一个灵活的轻量级多语言测试报告工具,支持包括 pytest /testng在内的多种测试框架,能够生成易于理解和丰富的测试报告。

allure-pytest能够生成包含测试步骤、日志、标题、优先级、附件等详细信息的测试报告,有助于更好地理解测试用例的执行情况。

自定义功能:支持通过装饰器(比如@allure.epic、@allure.feature、@allure.story、@allure.title、@allure.description 等)来添加额外的测试信息,如功能模块、用例标题、严重程度等,从而生成更加详细和有用的报告。

官方文档:https://allurereport.org/docs/pytest/

allure-pytest插件安装

使用pip命令安装: pip install allure-pytest

(安装在pytest工程所运行的python环境,python的安装目录或者虚拟环境目录,可以参考之前文章查看运行环境pycharm配置pytest运行环境)

安装和配置allure命令行工具(mac系统)

以下以mac电脑举例:

1)下载和配置jdk

下载地址:Java Downloads | Oracle,选择适用于Mac OS的JDK版本,点击下载即可。
下载完之后,双击安装包按照如下页面指导直接安装即可

默认安装目录:/Library/Java/JavaVirtualMachines,打开终端,进入目录可以看到jdk程序。

配置环境变量:使用open ~/.bash_profile打开变量文件,不存在先创建一个该文件。

vi命令打开后,添加如下信息保存退出

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-22.jdk/Contents/Home

执行source ~/.bash_profile使配置生效,然后执行java --version可以看到java版本了。

2)下载命令行工具

进入以下地址下载allure工具

https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/

最新的版本是2.9.0

3)配置allure命令行工具

将下载的allure包解压,打开终端,配置环境变量执行vi ~/.bash_profile然后添加export PATH="/Users/aaa/Downloads/allure-2.9.0/bin:$PATH",填写的是allure的目录信息。

执行source ~/.bash_profile使配置生效,然后在任意目录执行allure --version可以看到allure执行成功了。

生成测试报告

测试用例执行后,生成最简易的测试报告,步骤如下:

1)使用时无需导入,直接在用例执行命令中添加参数

执行带上参数--alluredir=./allure-results,参数后面跟着用例结果的目录。

执行后在目标目录中生成的是一堆json文件。

2)将测试结果生成html测试报告

  • 可以生成在线测试报告并自动通过浏览器打开

命令:allure serve allure-results

执行后自动打开浏览器,展示测试报告内容。生成的报告位置见日志打印

  • 自定义生成测试报告的目录,手动在浏览器打开

命令:allure generate allure-results -o allure-report --clean

-o后面跟着报告的目录

--clean表示先清楚该目录内容再生成测试报告,否则会提示目录已被使用。


测试报告如下,比插件pytest-html生成的报告内容更丰富,页面更好看。

Allure报告提供了丰富的信息和功能,展示测试用例执行结果,用例的层级结构,附件和截图,测试指标和趋势图,还有其他的标记、过滤、定制等,让测试结果更加直观和易于理解。

allure的装饰器功能

使用前先导入 import allure

官方文档:https://allurereport.org/docs/pytest-reference/#metadata

装饰器和方法

参数说明

@allure.epic(*epics: str)

@allure.feature(*features: str)

@allure.story(*stories: str)


allure.dynamic.epic(*epics: str)

allure.dynamic.feature(*features: str)

allure.dynamic.story(*stories: str)

定义用例的层级结构,对应敏捷中的需求/特性/故事,每个用例都可以定义多个装饰器或者方法。


@allure.parent_suite(parent_suite_name)

@allure.suite(suite_name)

@allure.sub_suite(sub_suite_name)


allure.dynamic.parent_suite(parent_suite_name)

allure.dynamic.suite(suite_name)

allure.dynamic.sub_suite(sub_suite_name)


定义用例的套件结构:为测试分配父套件、套件或子套件的名称


@allure.title(test_title: str)


allure.dynamic.title(test_title: str)

定义测试用例或者fixture方法的标题

如果测试函数有参数,也支持将参数传入标题中。

@allure.step(title: str)

with allure.step(title: str)--上下文管理器

定义测试用例的步骤

@allure.description(test_description: str)

allure.dynamic.description(test_description: str)

定义测试用例的描述信息。如果没有提供,Allure将使用测试函数的描述。

@allure.tag(*tags: str)

allure.dynamic.tag(*tags: str)

设置测试用例的标记,一次可以接受多个标记。

@allure.severity(severity_level: str)


allure.dynamic.severity(severity_level: str)

设置测试用例的严重性,枚举值:“trivial”···, “minor”, “normal”, “critical”, and “blocker”.

@allure.label(label_type: str, *labels: str)


allure.dynamic.label(label_type: str, *labels: str)

设置测试用例的标签。

该函数的第一个参数是标签名称。它可以是来自LabelType类或任何其他字符串的常量。

第二个和所有剩余的参数都是要添加的值。对于每个值,该函数将添加一个带有给定名称和给定值的标签。

@allure.link(url:str,link_type:str=LinkType.LINK, name: str = None)

@allure.issue(url: str, name: str = None)

@allure.testcase(url: str, name: str = None)


allure.dynamic.link(url: str, link_type: str = LinkType.LINK, name: str = None)

allure.dynamic.issue(url:str,name:str= None)

allure.dynamic.testcase(url: str, name: str = None)

添加与测试用例相关的链接。

allure.attach(body,name=None,attachment_type="text/plain", extension="attach")


allure.attach.file(source,name=None, attachment_type=None, extension=None)

将附件添加到测试报告

@allure.id(id: str)


allure.dynamic.id(id: str)

设置测试用例的id

allure.dynamic.parameter(name,value,excluded=None, mode=None)

显示测试期间使用的参数的name和value。

示例1 添加需求层次结构

@allure.epic("epic")
@allure.feature("features")
@allure.story("assert")
def test_1():
 assert 1 == 1

def test_2():
 allure.dynamic.epic("epic")
 allure.dynamic.feature("features")
 allure.dynamic.story("assert")
 assert 1 == 1

测试用例执行后,生成测试报告如下:点击下面的红框地方可以看到定义的层次结构

示例2 定义套件结构

@allure.parent_suite("ParentSuite")
@allure.suite("Suite")
@allure.sub_suite("Suite-1")
def test_3():
 assert 1 == 1

def test_4():
 allure.dynamic.parent_suite("ParentSuite")
 allure.dynamic.suite("Suite")
 allure.dynamic.sub_suite("Suite-1")
 assert 1 == 1

测试用例执行后,生成测试报告如下:点击下面的红框地方可以看到定义的套件结构

示例 3 定义测试用例标题

class Testcase():
 def test_1(self):
   allure.dynamic.title('测试类中的用例1')
   assert 1 == 1
 
 @allure.title('测试类中的用例2')
 def test_2(self):
   assert 1 == 1

测试用例执行后,生成测试报告如下:点击下面的红框地方可以看到用例的标题(没有定义标题显示的是测试函数名)

示例 4 定义测试用例的步骤

class Testcase():
 def test_1(self):
   allure.dynamic.title('测试类中的用例1')
   with allure.step('先定义变量'):
   		value = 1
   with allure.step('开始断言'):
 		  assert value == 1

 @allure.step('先定义变量')
 def set_value(self):
 		return 1
 
 @allure.step('开始断言')
 def assert_value(self,value):
 		assert value ==1

 @allure.title('测试类中的用例2')
 def test_2(self):
 		value = self.set_value()
 		self.assert_value(value)

分别使用装饰器和上下文管理器的方式设置测试用例的步骤,测试用例执行后,生成测试报告如下:点击下面的红框地方可以看到用例的步骤

示例 5 设置用例的的描述信息

@allure.description('用例断言')
def test_3():
 assert 1 == 1

def test_4():
 allure.dynamic.description('用例断言')
 assert 1 == 1

def test_5():
 """
 断言
 :return: None
 """
 assert 1 == 1

测试用例执行后,生成测试报告如下:点击下面的红框地方可以看到用例的描述

示例 6 设置用例的标记

@allure.tag('tag1','tag2','tag3')
def test_6():
 assert 1 == 1

def test_7():
 allure.dynamic.tag('tag1','tag2','tag3')
 assert 1 == 1

测试用例执行后,生成测试报告如下:点击下面的红框地方可以看到用例的标记信息

示例7 设置用例的严重级别

@allure.severity('critical')
def test_7():
 assert 1 == 1

def test_8():
 allure.dynamic.severity('normal')
 assert 1 == 1

测试用例执行后,生成测试报告如下:下面的红框地方可以看到用例的级别

示例 8 设置用例的链接

@allure.link("https://dev.example.com/", name="Website")
@allure.issue("AUTH-123")
@allure.testcase("TMS-456")
def test_11():
 assert 1 == 1

def test_12():
 allure.dynamic.link("https://dev.example.com/", name="Website")
 allure.dynamic.issue("AUTH-123")
 allure.dynamic.testcase("TMS-456")
 assert 1 == 1

测试用例执行后,生成测试报告如下:下面的红框地方可以看到用例的链接,可以点击跳转。

示例 9 展示用例的参数

def test_15():
 allure.dynamic.parameter('name', 'wang', excluded=None, mode=None)

@pytest.mark.parametrize('name',['wang','li'])
def test_16(name):
 print(name)

用例15使用allure的参数功能,用例16使用pytest的参数功能,测试用例执行后,生成测试报告如下:下面的红框地方可以看到用例的参数信息

示例10 展示用例的附件

从变量中附加内容

allure.attach(body,name=None,attachment_type="text/plain", extension="attach")

在给定的name下添加body作为测试结果的附件(默认为唯一的伪随机字符串)。body必须是bytes或str类型。

def test_17():
  allure.attach('pytest',name="附件",
             attachment_type=allure.attachment_type.TEXT
               )

测试用例执行后,生成测试报告如下:下面的红框地方可以看到用例的附件信息

从文件中阅读附件

allure.attach.file(source,name=None, attachment_type=None, extension=None)

def test_18():
   allure.attach.file('/Users/ue/Desktop/1.png',name="附件",
       attachment_type=allure.attachment_type.PNG
        )

测试用例执行后,生成测试报告如下:下面的红框地方可以看到用例的附件信息(大家可以添加多种格式的附件,示例中的allure.attachment_type有很多种类型)


共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

----感谢读者的阅读和学习,谢谢大家。

---祝愿大家都能够龙腾虎跃,步步高升!!!

相关推荐

一个基于.Net Core遵循Clean Architecture原则开源架构

今天给大家推荐一个遵循CleanArchitecture原则开源架构。项目简介这是基于Asp.netCore6开发的,遵循CleanArchitecture原则,可以高效、快速地构建基于Ra...

AI写代码翻车无数次,我发现只要提前做好这3步,bug立减80%

写十万行全是bug之后终于找到方法了开发"提示词管理助手"新版本那会儿,我差点被bug整崩溃。刚开始两周,全靠AI改代码架构,结果十万行程序漏洞百出。本来以为AI说没问题就稳了,结果...

OneCode低代码平台的事件驱动设计:架构解析与实践

引言:低代码平台的事件驱动范式在现代软件开发中,事件驱动架构(EDA)已成为构建灵活、松耦合系统的核心范式。OneCode低代码平台通过创新性的注解驱动设计,将事件驱动理念深度融入平台架构,实现了业务...

国内大厂AI插件评测:根据UI图生成Vue前端代码

在IDEA中安装大厂的AI插件,打开ruoyi增强项目:yudao-ui-admin-vue31.CodeBuddy插件登录腾讯的CodeBuddy后,大模型选择deepseek-v3,输入提示语:...

AI+低代码技术揭秘(二):核心架构

本文档介绍了为VTJ低代码平台提供支持的基本架构组件,包括Engine编排层、Provider服务系统、数据模型和代码生成管道。有关UI组件库和widget系统的信息,请参阅UI...

GitDiagram用AI把代码库变成可视化架构图

这是一个名为gitdiagram的开源工具,可将GitHub仓库实时转换为交互式架构图,帮助开发者快速理解代码结构。核心功能一键可视化:替换GitHubURL中的"hub...

30天自制操作系统:第六天:代码架构整理与中断处理

1.拆开bootpack.c文件。根据设计模式将对应的功能封装成独立的文件。2.初始化pic:pic(可编程中断控制器):在设计上,cpu单独只能处理一个中断。而pic是将8个中断信号集合成一个中断...

AI写代码越帮越忙?2025年研究揭露惊人真相

近年来,AI工具如雨后春笋般涌现,许多人开始幻想程序员的未来就是“对着AI说几句话”,就能轻松写出完美的代码。然而,2025年的一项最新研究却颠覆了这一期待,揭示了一个令人意外的结果。研究邀请了16位...

一键理解开源项目:两个自动生成GitHub代码架构图与说明书工具

一、GitDiagram可以一键生成github代码仓库的架构图如果想要可视化github开源项目:https://github.com/luler/reflex_ai_fast,也可以直接把域名替换...

5分钟掌握 c# 网络通讯架构及代码示例

以下是C#网络通讯架构的核心要点及代码示例,按协议类型分类整理:一、TCP协议(可靠连接)1.同步通信//服务器端usingSystem.Net.Sockets;usingTcpListene...

从复杂到优雅:用建造者和责任链重塑代码架构

引用设计模式是软件开发中的重要工具,它为解决常见问题提供了标准化的解决方案,提高了代码的可维护性和可扩展性,提升了开发效率,促进了团队协作,提高了软件质量,并帮助开发者更好地适应需求变化。通过学习和应...

低代码开发当道,我还需要学习LangChain这些框架吗?| IT杂谈

专注LLM深度应用,关注我不迷路前两天有位兄弟问了个问题:当然我很能理解这位朋友的担忧:期望效率最大化,时间用在刀刃上,“不要重新发明轮子”嘛。铺天盖地的AI信息轰炸与概念炒作,很容易让人浮躁与迷茫。...

框架设计并不是简单粗暴地写代码,而是要先弄清逻辑

3.框架设计3.框架设计本节我们要开发一个UI框架,底层以白鹭引擎为例。框架设计的第一步并不是直接撸代码,而是先想清楚设计思想,抽象。一个一个的UI窗口是独立的吗?不是的,...

大佬用 Avalonia 框架开发的 C# 代码 IDE

AvalonStudioAvalonStudio是一个开源的跨平台的开发编辑器(IDE),AvalonStudio的目标是成为一个功能齐全,并且可以让开发者快速使用的IDE,提高开发的生产力。A...

轻量级框架Lagent 仅需20行代码即可构建自己的智能代理

站长之家(ChinaZ.com)8月30日消息:Lagent是一个专注于基于LLM模型的代理开发的轻量级框架。它的设计旨在简化和提高这种模型下代理的开发效率。LLM模型是一种强大的工具,可以...

取消回复欢迎 发表评论: