企业级 接口自动化测试框架:Pytest+Allure+Excel

1. Allure 简介

简介

Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具,它不仅以 Web 的方式展示了简介的测试结果,而且允许参与开发过程的每个人可以从日常执行的测试中,最大限度地提取有用信息。

Allure 是由 Java 语言开发的,支持 Pytest,JaveScript、PHP、Ruby 等。

  • 从 DEV/QA 的角度来看,Allure 提供了详尽的测试报告,比如简化了常见缺陷的统计;失败的测试可以分为 bug 和被中断的测试;还可以配置日志、步骤、fixture、附件、计时、执行历史;以及与 TMS、BUG 管理系统、Jenkins 集成等。所以,通过以上配置,所有负责的开发人员和测试人员可以尽可能地掌握测试信息。
  • 从管理者的角度来看,Allure 提供了一个清晰的“大图”,即 High Level 的统计报告,其中包括已覆盖的特性、缺陷聚集的位置、执行时间轴的外观以及许多其他方便的事情。Allure 的模块化和可扩展性保证了你总是能够对某些东西进行微调,使得 Allure 更适合你。

那么下面就来说说如何使报告更加详细的显示我们需要的信息,以及 Allure 与 Jenkins 的集成。

安装

(Windows/Mac 通用安装方法)

下载地址:https://github.com/allure-framework/allure2/releases,下载所需版本的 zip 包。

安装:

  1. 解压 —> 进入 bin 目录 —> 运行 allure.bat
  2. 把 bin 目录加入 Path 环境变量
  3. 配合 pytest,使用 allure2 生成更加精美的测试报告:pip install allure-pytest

运行方法

在测试执行期间收集结果
pytest [测试文件] -s -q --alluredir=./result/ --clean-alluredir
  • -s:表示将执行成功的案例日志打印出来
  • -q:若跟文件执行路径则代表只需要执行的文件
  • --alluredir:指定存储测试结果的路径(若目录不存在则会新建)
  • --clean-alluredir:清除历史结果数据
查看测试报告

方式一:用于在本地渲染后对外展示结果

allure serve ./result/

方式二:用于在本地渲染和查看结果

# 生成报告
allure generate ./result/ -o ./report/ --clean  # 注意:覆盖路径加 --clean# 打开报告
allure open -h 127.0.0.1 -p 8883 ./report/

注意:/report/ 目录中的 index.html 就是最终的结果页面,但直接通过浏览器打开这个文件是看不到实际报告内容的,这是因为实际报告内容需要 allure 进行渲染后才能看到。

 

2. Allure 常用特性

场景:

  • 希望在报告中看到测试功能,子功能或场景,测试步骤,包括测试附加信息。

解决:

  • import allure
  • @allure.feature('功能名称')
  • @allure.story('子功能名称')
  • @allure.title('测试用例名称')
  • @allure.step('步骤细节')
  • @allure.description('测试用例描述')
  • @allure.attach('具体文本信息'):需要附加的信息,可以是数据,文本,图片,视频,网页
  • 如果只测试登录功能运行的时候可以加限制过滤,如:pytest 文件名 --allure_features '购物车功能' --allure_stories '加入购物车'

@alllure.feature() 与 @allure.store() 的关系

feature 相当于一个大的功能或模块。将 case 分类到某个 feature 中,并在报告中的 behaviors 中显示,相当于 testsuite。

story 相当于分支功能/模块,属于 feature 之下的结构,并在报告中的 features 中显示,相当于 testcase。

feature 与 story 类似于父子关系。

@allure.step() 与 with allure.step() 的区别

  • 测试过程中每个步骤,一般放在具体逻辑方法中。
  • 可以放在关键步骤中,在报告中显示。
  • 在 App、Web 自动化测试当中,建议每切换到一个新的页面当做一个 step。
  • 用法:
    • @allure.step():只能以装饰器的形式放在类或者方法上。
    • with allure.step():可以放在测试用例方法里面,但测试步骤的代码需要被该语句包含。

给测试用例划分优先级

场景:

通常测试有冒烟测试、回归测试、线上验证测试等,那么就需要按照重要性级别来分别执行,比如上线时要把主流程和重要模块都跑一遍。

解决:

  • 通过附加 pytest.mark 标记描述
  • 通过 allure.feature、allure.story 标记描述
  • 通过 allure.severity 直接标记用例级别

根据测试用例的重要性划分测试用例等级,如果没指定等级,默认为 NORMAL 级别:

  • BLOCKER:阻塞缺陷(功能未实现,无法下一步)
  • CRITICAL:严重缺陷(功能点缺失)
  • NORMAL:一般缺陷(边界情况,格式错误)
  • MINOR:次要缺陷(界面错误与ui需求不符)
  • TRIVIAL:轻微缺陷(必须项无提示,或者提示不规范)

步骤: 

  1. 在方法、函数和类上面加:@allure.severity(allure.severity_level.TRIVIAL)
  2. 指定执行对应级别的用例:pytest -s -v 文件名 --allure-severities normal, critical

给 Allure 测试报告添加内容(图片、附件、文本、截图、HTML 等)

场景:

  • 前端自动化测试经常需要附加图片或 html,比如在适当的地方、适当的时机截图等。

解决:

  • @allure.attach() 显示许多不同类型的提供的附件,可以补充测试、步骤或测试结果。

步骤:

  • 在测试报告里附加网页:
    • 格式:allure.attach(body(内容), name, attachment_typeextension)
    • 示例:allure.attach('<head>/head><body>首页</body>', '这是错误页的结果信息', allure.attachment_type.HTML)
  • 在测试报告里附加图片:
    • 格式:allure.attach.file(source, name, attachment_type, extension)
    • 示例:allure.attach.file("./result/b.png", attachment_type=allure.attachment_type.PNG)

集成测试管理系统

@allure.link()、@allure.issue()、@allure.testcase() 主要是为了将 Allure 报告和测试管理系统集成,可以更快速地跳转到公司内部地址。

先看看三个装饰器的源码:

def link(url, link_type=LinkType.LINK, name=None):return safely(plugin_manager.hook.decorate_as_link(url=url, link_type=link_type, name=name))def issue(url, name=None):return link(url, link_type=LinkType.ISSUE, name=name)def testcase(url, name=None):return link(url, link_type=LinkType.TEST_CASE, name=name)

小结
  • issue() 和 testcase() 其实调用的也是 link(),只是 link_type 不一样。
  • 必传参数 url:跳转的链接。
  • 可选参数 name:显示在 Allure 报告的名字,如果不传就是显示完整的链接(建议传,不然可读性不高)。
  • 可以理解成:三个方法是一样的,我们都提供跳转链接和名字,只是链接的 type 不一样,最终显示出来的样式不一样而已(type 不一样,样式不一样)。
  • 如果你喜欢,只用 @allure.link() 也可以。
  • 而出现三个装饰器的原因是为了更好地将链接进行分类(访问链接、Bug 链接、测试用例链接)。
代码示例

import allureTEST_CASE_LINK = 'https://github.com/qameta/allure-integrations/issues/8#issuecomment-268313637'@allure.link('https://www.youtube.com/watch?v=4YYzUTYZRMU')
def test_with_link():pass@allure.link('https://www.youtube.com/watch?v=Su5p2TqZxKU', name='点击我看一看youtube吧')
def test_with_named_link():pass@allure.issue('140', 'bug issue链接')
def test_with_issue_link():pass@allure.testcase(TEST_CASE_LINK, '测试用例地址')
def test_with_testcase_link():pass

运行结果,查看 Allure 报告

1)@allure.link() 不传 name 参数时的样式

如下图所示,不传 name 时,当链接很长,可读性就比较差啦。

2)@allure.link() 传了 name 参数时的样式

3)@allure.testcase() 的样式

如下图所示,和 link() 传了 name 参数时一样:

4)@allure.issue() 的样式

如下图所示,多了个虫子样式:

 

3. 接口自动化测试框架示例

完整工程:https://github.com/juno3550/InterfaceAutoTestWithPytest

测试方法示例

 1 import pytest2 import allure3 import logging4 from util.assert_util import assert_keyword5 from util.request_util import api_request6 from util.global_var import *7 from util.excel_util import excel_util8 9 
10 register_test_data = excel_util.get_sheet_data("注册")
11 login_test_data = excel_util.get_sheet_data("登录")
12 
13 
14 @allure.feature("登录模块")
15 @pytest.mark.dependency(name="TestLoginModule")
16 class TestLoginModule:
17         
18     @allure.story("注册功能")
19     @allure.title('用户注册')  # 指定测试用例标题,默认是函数名
20     @allure.description('通过接口进行用户注册')  # 添加测试用例描述
21     @allure.severity(allure.severity_level.BLOCKER)  # 阻塞级别
22     @pytest.mark.run(order=1)
23     @pytest.mark.parametrize('case_data', register_test_data)
24     def test_register(self, case_data):
25         with allure.step("读取请求数据,调用接口"):
26             logging.info("接口用例数据:%s" % case_data)
27             response = api_request(case_data[API_IP], case_data[API_URI], case_data[REQUEST_METHOD],
28                                    case_data[API_REQUEST_DATA], case_data[RESPONSE_EXTRACT_VAR],
29                                    case_data[REQUEST_HEADER], case_data[REQUEST_COOKIE])
30         with allure.step("获取响应数据,进行断言"):
31             assert_keyword(response, case_data[RESPONSE_ASSERT_KEYWORD])
32 
33     @allure.story("登录功能")
34     @allure.title('用户登录')  # 指定测试用例标题,默认是函数名
35     @allure.description('通过接口进行用户登录')  # 添加测试用例描述
36     @allure.severity(allure.severity_level.BLOCKER)  # 阻塞级别
37     @pytest.mark.run(order=2)
38     @pytest.mark.parametrize('case_data', login_test_data)
39     def test_login(self, case_data):
40         with allure.step("读取请求数据,调用接口"):
41             logging.info("接口用例数据:%s" % case_data)
42             response = api_request(case_data[API_IP], case_data[API_URI], case_data[REQUEST_METHOD],
43                                    case_data[API_REQUEST_DATA], case_data[RESPONSE_EXTRACT_VAR],
44                                    case_data[REQUEST_HEADER], case_data[REQUEST_COOKIE])
45         with allure.step("获取响应数据,进行断言"):
46             assert_keyword(response, case_data[RESPONSE_ASSERT_KEYWORD])
47 
48 
49 if __name__ == "__main__":
50     test_dir = os.path.dirname(__file__)
51     pytest.main(['-s', '-q', test_dir, '--alluredir', '../test_result/', "--clean-alluredir"])
52     os.system('allure generate ../test_result/ -o ../test_report/ --clean')
53     os.system('allure open -h 127.0.0.1 -p 8881 ../test_report/')

测试数据示例

Allure 报告结果示例

  自动化测试相关教程推荐:

2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂!!_哔哩哔哩_bilibili

2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华,学完年薪40W+_哔哩哔哩_bilibili

测试开发相关教程推荐

2023全网最牛,字节测试开发大佬现场教学,从零开始教你成为年薪百万的测试开发工程师_哔哩哔哩_bilibili

postman/jmeter/fiddler测试工具类教程推荐

讲的最详细JMeter接口测试/接口自动化测试项目实战合集教程,学jmeter接口测试一套教程就够了!!_哔哩哔哩_bilibili

2023自学fiddler抓包,请一定要看完【如何1天学会fiddler抓包】的全网最详细视频教程!!_哔哩哔哩_bilibili

2023全网封神,B站讲的最详细的Postman接口测试实战教学,小白都能学会_哔哩哔哩_bilibili

  总结:

 光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!

 

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

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

相关文章

基于selenium工具刷b站播放量(请谨慎使用)

基于selenium工具刷b站播放量&#xff08;请谨慎使用&#xff09; from selenium import webdriver import time import random# 打开B站视频 url input("url:") if url "":url https://www.bilibili.com/video/BV1K64y1574T for i in range(50):# 设置…

【学习记录】从0开始的Linux学习之旅——字符型设备驱动及应用

一、概述 Linux操作系统通常是基于Linux内核&#xff0c;并结合GNU项目中的工具和应用程序而成。Linux操作系统支持多用户、多任务和多线程&#xff0c;具有强大的网络功能和良好的兼容性。基于前面应用与驱动的开发学习&#xff0c;本文主要讲述如何在linux系统上把应用与驱动…

参考信号速度变化存在跳跃时容易发生不稳定的阻抗调节

问题描述 当参考信号速度存在跳跃变化时&#xff0c;阻抗调节系统容易发生不稳定。这是因为阻抗调节系统需要根据参考信号的速度来调整其输出阻抗&#xff0c;以匹配负载阻抗&#xff0c;从而保持系统的稳定性。 当参考信号速度突然变化时&#xff0c;阻抗调节系统可能无法及…

『TypeScript』深入理解变量声明、函数定义、类与接口及泛型

&#x1f4e3;读完这篇文章里你能收获到 了解TypeScript变量声明与类型注解掌握TypeScript函数与方法的使用掌握TypeScript类与接口的使用掌握TypeScript泛型的应用 文章目录 一、变量声明与类型注解1. 变量声明2. 类型注解3. 类型推断 二、函数与方法定义1. 函数定义2. 方法定…

Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)读书笔记 目录

完结状态&#xff1a;未完结 文章目录 前言第1章 Kubernetes入门 11.1 了解Kubernetes 2 附录A Kubernetes核心服务配置详解 915总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; Kubernetes权威指南&#xff1a;从Docker到Kubernetes实践全接触&…

Jmeter 性能测试基础!

压力测试   压力测试分两种场景&#xff1a;一种是单场景&#xff0c;压一个接口的&#xff1b;第二种是混合场景&#xff0c;多个有关联的接口。压测时间&#xff0c;一般场景都运行10-15分钟。如果是疲劳测试&#xff0c;可以压一天或一周&#xff0c;根据实际情况来定。 压…

【编程技术】CUDA TencoreCore编程实例说明

概述 通过一个m16n8k16矩阵乘法的CUDA TencoreCore编程实例&#xff0c;展示load/store mma 的矩阵乘法运行过程 动画实例 CUDA TensoreCore 编程实例

springboot 在自定义注解中注入bean,解决注入bean为null的问题

问题&#xff1a; 在我们开发过程中总会遇到比如在某些场合中需要使用service或者mapper等读取数据库&#xff0c;或者某些自动注入bean失效的情况 解决方法&#xff1a; 1.在构造方法中通过工具类获取需要的bean 工具类代码&#xff1a; import org.springframework.beans…

Spring到底是如何解决循环依赖问题的?

Spring作为当前使用最广泛的框架之一&#xff0c;其重要性不言而喻。所以充分理解Spring的底层实现原理对于咱们Java程序员来说至关重要&#xff0c;那么今天笔者就详细说说Spring框架中一个核心技术点&#xff1a;如何解决循环依赖问题&#xff1f; 什么是循环依赖问题&#x…

深入理解Java中的逃逸分析

目录 1. 对象作用域分析2. 栈上分配3. 同步省略&#xff08;锁消除&#xff09;4. 标量替换 逃逸分析是一种编译器优化技术&#xff0c;用于确定对象的作用域和生命周期。其主要特点包括&#xff1a;对象作用域分析、栈上分配、同步省略和标量替换。现在将详细阐述这些特点&…

延长UPS电源寿命的12大方法

为提高机房UPS电源工作质量&#xff0c;加强日常管理&#xff0c;确保机房UPS不间断电源设备始终处于良好的环境中&#xff0c;设备安全稳定运行。让我们看看UPS不间断电源的使用寿命能达到多长时间&#xff1f;如何维护&#xff1f;UPS电源维护&#xff0c;延长UPS电源寿命。 …

JVM理解

1、JVM是什么&#xff1f; JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。 他是帮助我们将java代码 生成编译后 的 class 文件。 2、JRE、JDK和JVM 的关系 …

用AI批量生成文章的工具有哪些?免费AI生成工具

人工智能&#xff08;AI&#xff09;技术不断演进&#xff0c;为许多领域带来了前所未有的便利。其中&#xff0c;AI生成文章技术作为一个备受关注的领域&#xff0c;为大家提供了独特的解决方案&#xff0c;特别是在批量文章生成的需求上。 1. AI生成文章的方法 开放式AI模型…

springsecurity为什么说使用JWT就可以disable csrf

Cross-Site Request Forgery (CSRF) 是一种攻击&#xff0c;它利用了用户在浏览器中对特定网站的登录状态。攻击者可以在他们控制的网站上构造一个请求&#xff0c;当用户访问这个网站时&#xff0c;这个请求会在用户的浏览器中执行&#xff0c;并带有用户对目标网站的凭证&…

更简单的Redux工具 Toolkit

1 安装 npm install reduxjs/toolkit2 创建store目录 创建store文件夹&#xff0c;里面包含入口文件index.jsx&#xff0c;以及自定义的reduces方法main.jsx的slices文件夹&#xff0c;其中main1.jsx、main2.jsx表示每一个相对独立的reduces数据操作集 store ***slices *****…

基于Browscap对浏览器工具类优化

项目背景 原有的启动平台公共组件库comm-util的浏览器工具类BrowserUtils是基于UserAgentUtils的&#xff0c;但是该项目最后一个版本发布于 2018/01/24&#xff0c;之至今日23年底&#xff0c;已有5年没有维护更新&#xff0c;会造成最新版本的部分浏览器不能正确获取到浏览器…

使用python操作excel文档

导入xlsxwriter包 python轻量化的语言&#xff0c;用来操作文档简直易如反掌&#xff0c;首先你需要导入的是import xlsxwriter包&#xff0c;他包括了操作文档所需要的全部工具方法&#xff0c;你只需要调用就好了。 操作excel指南 首先你需要创建一个文件xlsxwriter.Workb…

http与apache

目录 1.http相关概念 2.http请求的完整过程 3.访问浏览器背后的原理过程 4.动态页面与静态页面区别 静态页面&#xff1a; 动态页面&#xff1a; 5.http协议版本 6.http请求方法 7.HTTP协议报文格式 8.http响应状态码 1xx&#xff1a;提示信息 2xx&#xff1a;成功…

代码随想录算法训练营第四十四天| 518 零钱兑换 || 377 组合总和 Ⅳ

目录 518 零钱兑换 || 377 组合总和 Ⅳ 518 零钱兑换 || 如果求组合数就是外层for循环遍历物品&#xff0c;内层for遍历背包。 class Solution { public:int change(int amount, vector<int>& coins) {vector<int> f(amount 10);//拼凑成总金额为i的总情况…

CPU密集型和IO密集型初学习

目录 1、CPU密集型 2、IO密集型 3、CPU密集型和IO密集型的区别 4、CPU密集型和IO密集型对CPU内核之间的关系 5、核心线程数计算公式 5、扩展&#xff1a;进程和线程 小结 1、CPU密集型 CPU密集型是指计算机程序或任务在执行过程中主要依赖于中央处理器&#xff08;CPU&…