史上最细,接口自动化测试框架-Pytest+Allure+Excel整理(代码)

目录:导读

    • 前言
    • 一、Python编程入门到精通
    • 二、接口自动化项目实战
    • 三、Web自动化项目实战
    • 四、App自动化项目实战
    • 五、一线大厂简历
    • 六、测试开发DevOps体系
    • 七、常用自动化测试工具
    • 八、JMeter性能测试
    • 九、总结(尾部小惊喜)


前言

Allure框架

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

安装

Windows/Mac 通用安装方法:
下载地址:https://github.com/allure-framework/allure2/releases,下载所需版本的 zip 包。

安装:
解压 —> 进入 bin 目录 —> 运行 allure.bat
把 bin 目录加入 Path 环境变量
配合 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 进行渲染后才能看到。

Allure 常用特性

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

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

B1

@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:轻微缺陷(必须项无提示,或者提示不规范)

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

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

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

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

步骤:
在测试报告里附加网页:
格式:allure.attach(body(内容), name, attachment_typeextension)
示例:allure.attach(‘/head>首页’, ‘这是错误页的结果信息’, 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 allure

TEST_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

接口自动化测试框架示例

测试方法示例

import pytest
import allure
import logging
from util.assert_util import assert_keyword
from util.request_util import api_request
from util.global_var import *
from util.excel_util import excel_util


register_test_data = excel_util.get_sheet_data("注册")
login_test_data = excel_util.get_sheet_data("登录")


@allure.feature("登录模块")
@pytest.mark.dependency(name="TestLoginModule")
class TestLoginModule:

    @allure.story("注册功能")
    @allure.title('用户注册')  # 指定测试用例标题,默认是函数名
    @allure.description('通过接口进行用户注册')  # 添加测试用例描述
    @allure.severity(allure.severity_level.BLOCKER)  # 阻塞级别
    @pytest.mark.run(order=1)
    @pytest.mark.parametrize('case_data', register_test_data)
    def test_register(self, case_data):
        with allure.step("读取请求数据,调用接口"):
            logging.info("接口用例数据:%s" % case_data)
            response = api_request(case_data[API_IP], case_data[API_URI], case_data[REQUEST_METHOD],
                                   case_data[API_REQUEST_DATA], case_data[RESPONSE_EXTRACT_VAR],
                                   case_data[REQUEST_HEADER], case_data[REQUEST_COOKIE])
        with allure.step("获取响应数据,进行断言"):
            assert_keyword(response, case_data[RESPONSE_ASSERT_KEYWORD])

    @allure.story("登录功能")
    @allure.title('用户登录')  # 指定测试用例标题,默认是函数名
    @allure.description('通过接口进行用户登录')  # 添加测试用例描述
    @allure.severity(allure.severity_level.BLOCKER)  # 阻塞级别
    @pytest.mark.run(order=2)
    @pytest.mark.parametrize('case_data', login_test_data)
    def test_login(self, case_data):
        with allure.step("读取请求数据,调用接口"):
            logging.info("接口用例数据:%s" % case_data)
            response = api_request(case_data[API_IP], case_data[API_URI], case_data[REQUEST_METHOD],
                                   case_data[API_REQUEST_DATA], case_data[RESPONSE_EXTRACT_VAR],
                                   case_data[REQUEST_HEADER], case_data[REQUEST_COOKIE])
        with allure.step("获取响应数据,进行断言"):
            assert_keyword(response, case_data[RESPONSE_ASSERT_KEYWORD])


if __name__ == "__main__":
    test_dir = os.path.dirname(__file__)
    pytest.main(['-s', '-q', test_dir, '--alluredir', '../test_result/', "--clean-alluredir"])
    os.system('allure generate ../test_result/ -o ../test_report/ --clean')
    os.system('allure open -h 127.0.0.1 -p 8881 ../test_report/')

测试数据示例

B2

Allure 报告结果示例

B3

B4

下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

人生如一场马拉松,不在乎起点,只看终点。坚持奋斗的脚步,才能追逐成功的光芒。每一次努力都是积累,每一次挑战都是成长,相信自己的潜力,勇往直前,创造属于自己的辉煌人生。

不论路途多么艰辛,只要保持初心与激情,努力奋斗便能超越自我,征服一切困难。相信自己的潜力与可能,勇敢冲破束缚,开启属于自己的辉煌篇章,绽放耀眼的人生光芒。

每一步努力,都是离成功更近一步的勇敢挑战;每一次奋斗,都是追求梦想的不懈追逐。不论遇到多少困难与阻碍,心怀坚定信念,毅然前行,终将创造出属于自己的辉煌人生,展现真正的自我价值。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue 自定义事件绑定与解绑

绑定自定义事件 说到 Vue 自定义事件,那就需要搞清楚一个问题,为啥有这个玩意。 说到自定义事件之前,需要理解 组件基础的概念。理解了基础概念之后,我们就知道 Vue 的父子之间的通信, 一是 父组件通过 Prop 向子组件…

qt系列-qt6在线安装慢的问题

.\qt-unified-windows-x64-online.exe --mirror https://mirrors.aliyun.com/qt/下载速度飞快

就业并想要长期发展选数字后端还是ic验证?

“就业并想要长期发展选数字后端还是ic验证?” 这是知乎上的一个热点问题,浏览量达到了13,183。看来有不少同学对这个问题感到疑惑。之前更新了数字后端&数字验证的诸多文章,从学习到职业发展,都写过,唯一没有做过…

Mybatis 知识点

Mybatis 知识点 1.1 Mybatis 简介 1.1.1 什么是 Mybatis Mybatis 是一款优秀的持久层框架支持定制化 SQL、存储过程及高级映射Mybatis 几乎避免了所有的 JDBC 代码和手动设置参数以及获取结果集MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO…

代码随想录算法训练营第三十二天 | 全是没接触过的知识点,要复习

以下题目多次复习 200 岛屿数量未看解答自己编写的青春版重点本题的解题思路,也是之前没有接触过的,四字总结:学会感染! 题解的代码日后复习重新编写 32 最长有效括号未看解答自己编写的青春版重点这道题,动态规划的思…

小鹏遭遇“动荡”,自动驾驶副总裁吴新宙离职,现已完成团队过渡

根据最新消息,小鹏汽车的自动驾驶副总裁吴新宙宣布将加入全球GPU芯片巨头英伟达。吴新宙将成为该公司全球副总裁,直接向英伟达全球CEO黄仁勋汇报。小鹏汽车董事长何小鹏和吴新宙本人已在微博上确认该消息,并解释离职原因涉及家庭和多方面因素…

Spark提交流程

客户端通过脚本将任务提交到yarn执行,yarn启动APPMaster,APPMaster启动Driver线程,Driver负责初始化SparkContext并进行任务的切分和分配任务,交给Executor进行计算。

质数(判定质数 分解质因数 筛质数)

这里写目录标题 一、判定质数思路分析代码实现 二、分解质因数思路分析典型题目代码实现 三、质数筛经典题目思路分析1. 朴素筛法2. 埃氏筛法3. 欧拉筛法 一、判定质数 思路分析 由于每个合数的因子是成对出现的,即如果 d d d 是 n n n 的因子,那么 …

Qt实现引导界面UITour

介绍 最近做了一款键鼠自动化,想第一次安装打开后搞一个引导界面,找了好多资料没啥参考,偶然发现qt有引导界面如下图。 Qt整挺好,但是未找到源码,真的不想手撸,(源码找到了但是Qt整起来太复杂,没法拿来直接…

Python系统学习1-2

目录 一、硬件 二、软件:程序文档 三、基础知识 四、python执行过程 五、Pycharm使用技巧 一、硬件 计算机五大部件:运算器,存储器,控制器、输入设备,输出设备。 运算器和控制器 集成在CPU中。 存储&#xff1a…

Qt Creator 11 开放源码集成开发环境新增集成终端和 GitHub Copilot 支持

导读Qt 项目今天发布了 Qt Creator 11,这是一款开源、免费、跨平台 IDE(集成开发环境)软件的最新稳定版本,适用于 GNU/Linux、macOS 和 Windows 平台。 Qt Creator 11 的亮点包括支持标签、多外壳、颜色和字体的集成终端模拟器&am…

hcip——BGP实验

要求 1.搭建toop 2.地址规划 路由器AS接口地址R11 loop0:1.1.1.1 24 loop1 : 192.168.1.1 24 g0/0/0 12.0.0.1 24 R22 64512 g0/0/0: 12.0.0.2 24 g/0/01: 172.16.0.2 19 g0/0/2: 172.16.96.2 19 R32 64512g0/0/0: 172.16.0.3 19 g0/0/1:1…

在使用Python爬虫时遇到解析错误解决办法汇总

在进行Python爬虫任务时,遇到解析错误是常见的问题之一。解析错误可能是由于网页结构变化、编码问题、XPath选择器错误等原因导致的。为了帮助您解决这个问题,本文将提供一些实用的解决办法,并给出相关的代码示例,希望对您的爬虫任…

实现Feed流的三种模式:拉模式、推模式和推拉结合模式

在互联网产品中,Feed流是一种常见的功能,它可以帮助我们实时获取我们关注的用户的最新动态。Feed流的实现有多种模式,包括拉模式、推模式和推拉结合模式。在本文中,我们将详细介绍这三种模式,并通过Java代码示例来实现…

Centos7 安装man中文版手册

查找man中文安装包: yum search man-pages 安装man-pages-zh-CN.noarch: yum install -y man-pages-zh-CN.noarch

05|Oracle学习(UNIQUE约束)

1. UNIQUE约束介绍 也叫:唯一键约束,用于限定数据表中字段值的唯一性。 1.1 UNIQUE和primary key区别: 主键/联合主键每张表中只有一个。UNIQUE约束可以在一张表中,多个字段中存在。例如:学生的电话、身份证号都是…

091.粉刷房子

一、题目 剑指 Offer II 091. 粉刷房子 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:int minCost(vector<vector<int>>& costs) {int row costs.size();int col costs[0].size();if (row 1)return min(min(costs[0][0], cos…

Mybatis ,Mybatis-plus列表多字段排序,包含sql以及warpper

根据 mybatis 根据多字段排序已经wrapper 根据多字段排序 首先根据咱们返回前端的数据列来规划好排序字段 如下&#xff1a; 这里的字段为返回VO的字段,要转换成数据库字段然后加入到排序中 示例&#xff0c;穿了 surname,cerRank 多字段,然后是倒序 false 首先创建好映射&am…

Python元编程-装饰器介绍、使用

目录 一、Python元编程装饰器介绍 二、装饰器使用 1. 实现认证和授权功能 2.实现缓存功能 3.实现日志输出功能 三、附录 1. logging.basicConfig介绍 2. 精确到毫秒&#xff0c;打印时间 方法一&#xff1a;使用datetime 方法二&#xff1a;使用time 一、Python元编程…

【Git】git reflog git log

前言 日常开发过程中&#xff0c;我们经常会遇到要进行版本回退的情况&#xff0c;这时候需要使用git reflog和git reset 命令 git reflog 常用命令&#xff1a; 1、git reflog -n 查看多少条 2、git reflog show origin 查看远程历史变动 git log 什么都不加默认显示当前分…