初学 pytest 记录
-
安装
pip install pytest
用例可以是函数也可以是类中的方法
def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc = 12345 @pytest.mark.api def test_str(self):res = add('1', '2')assert res == '12'def test_int(self):res = add(1, 2)assert res == 3def test_list(self):res = add([1, 2], [3, 4])assert res == [1, 2, 3, 4]
-
启动测试
- 命令行输入 pytest 会自动检索项目中所有的用例去执行 参数 -k “xx” 模糊匹配文件执行
- 根目录新建 main.py 文件 右键运行脚本
main.py import pytest pytest.main()
-
用户自定义标记
可以根据不同类型的用例分成不同的种类.在用例多的情况下可以根据需求执行部分种类测试日志.
配置
创建配置文件,我这边创建在项目的根目录下 pytest.ini[pytest] markers =api : 接口测试ui : UI测试ut : 重试login : 登录测试ddt: 数据驱动测试
在 markers 中key:value 形式的就是自定义的标记,名称:注释
打标记
@pytest.mark.标记名称来使用.@pytest.mark.tt def test_func():print()
使用
- 命令行
pytest -m 标记名称
- 添加到配置文件中 pytest.ini 在配置文件中添加参数后.在命令行直接执行 pytest 会自动携带addopts中的参数
[pytest] addopts = -m 标记名称
-
内置标记
- skip 无条件跳过
- skipif 满足条件跳过
- xfail 预期失败
- xfailif 满足条件预期失败
- parametrize 参数化
使用@pytest.mark.parametrize标记.参数1为字段,参数 2 为函数解析出来的嵌套列表@pytest.mark.parametrize('a, b, c', read_csv('/Users/nieminghua/Desktop/pycode/pythonProject/Apytest/data.csv')) def test_ddt(a, b, c):assert int(a) + int(b) == int(c)
-
夹具-fixture
我把fixture 理解成用例执行的前置操作和后置操作(钩子函数)
比如,在对 web 网站进行测试时,前置必要条件需要先打开浏览器.测试完毕后关闭浏览器.- fixture 可以被 fixture 调用
- 在fixture中的yield关键字可以返回值,只能返回 1 个值
- 在使用 fixture 中参数scope可以控制夹具的作用范围
- function 默认值, 每个用例都会执行一遍
- class 每个类执行一遍
- module 每个模块执行一遍
- session 每个会话执行一遍
- package 每个包执行一遍
如果不指定作用域,则每个用例执行都会单独去执行 fixture @pytest.fixture() def func2():# 前置操作print(datetime.now(), "func2用例开始执行")yield [1, 2, 3]# 后置操作print(datetime.now(), "func2用例执行结束")@pytest.mark.usefixtures("func",'func2') def test_1():print('test1')@pytest.mark.usefixtures("func",'func2') def test_2():print('test2')>>> Apytest/test_fixture.py::test_1 2025-06-05 18:32:58.075634 func1用例开始执行 2025-06-05 18:32:58.077104 func2用例开始执行 test1 PASSED2025-06-05 18:32:58.078129 func2用例执行结束 2025-06-05 18:32:58.078950 func1用例执行结束Apytest/test_fixture.py::test_2 2025-06-05 18:32:58.080741 func1用例开始执行 2025-06-05 18:32:58.080920 func2用例开始执行 test2 PASSED2025-06-05 18:32:58.081668 func2用例执行结束 2025-06-05 18:32:58.082254 func1用例执行结束
指定作用域给 fixture 添加scope=“session”
@pytest.fixture(scope='session') def func():# 前置操作print(datetime.now(), "func1用例开始执行")yield# 后置操作print(datetime.now(), "func1用例执行结束")@pytest.fixture(scope='session') def func2():# 前置操作print(datetime.now(), "func2用例开始执行")yield [1, 2, 3]# 后置操作print(datetime.now(), "func2用例执行结束")@pytest.mark.usefixtures("func",'func2') def test_1():print('test1')@pytest.mark.usefixtures("func",'func2') def test_2():print('test2')>>> Apytest/test_fixture.py::test_1 2025-06-06 14:54:55.729863 func1用例开始执行 2025-06-06 14:54:55.730163 func2用例开始执行 test1 PASSED Apytest/test_fixture.py::test_2 test2 PASSED2025-06-06 14:54:55.733253 func2用例执行结束 2025-06-06 14:54:55.733882 func1用例执行结束
对于一些更通用的 fixture 可以定义在conftest.py 文件中.给 fixture添加 autouse=True 参数,和 scope 指定作用域,这样所有的用例在作用域范围内都会自动关联到 fixture.(fixture同样可以嵌套使用)
conftest.py 在 func2 方法中调用了 func 所以即使 func 并没有 autouse=True,一样会被调用. @pytest.fixture(scope='session') def func():# 前置操作print(datetime.now(), "conftest_func1用例开始执行")yield# 后置操作print(datetime.now(), "conftest_func1用例执行结束")@pytest.fixture(autouse=True, scope='session') def func2(func):# 前置操作print(datetime.now(), "conftest_func2用例开始执行")yield [1, 2, 3]# 后置操作print(datetime.now(), "conftest_func2用例执行结束")>>>> Apytest/test_fixture.py::test_1 2025-06-06 16:29:25.996684 conftest_func1用例开始执行 2025-06-06 16:29:25.997059 conftest_func2用例开始执行 test1 PASSED Apytest/test_fixture.py::test_2 test2 PASSED2025-06-06 16:29:26.000212 conftest_func2用例执行结束 2025-06-06 16:29:26.001231 conftest_func1用例执行结束
-
测试报告
这里用到第三方插件allure
pip install allure-pytest
allure下载地址官网
添加启动命令
pytest.ini [pytest] addopts = --alluredir=allure-results --clean-alluredir
加上这条命令后执行完会生成一个allure-results文件,里边放着 json 格式的测试日志.
之后在执行allure generate allure-results -o allure-report --clean命令. -o 参数为报告输出路径
之后打开目录里的 index.html 就可以看到报告
可以在 main.py 文件中通过 os 模块来执行生成的动作,这样每次执行完用例会自动生成报告
import pytest import ospytest.main()os.system("allure generate allure-results -o allure-report --clean")
用例分类
在报告中按功能给用例分类.- @allure.epic 项目名称
- @allure.feature 模块名称
- @allure.story 业务场景名称
- @allure.title 标题
- @allure.description 描述
- @allure.setup 环境信息
- @allure.testcase 测试用例链接
- @allure.issue 缺陷链接
- @allure.link 链接
@allure.epic("hil测试") @allure.feature("故障注入") @allure.story("CVD") @allure.title("HTO") @allure.description("描述 11") @allure.testcase("https://www.baidu.com", "用例链接") @allure.issue("https://www.sogou.com", "缺陷链接", ) @allure.link("链接") @pytest.mark.ut def test_01():assert 1 == 1@allure.epic("hil测试") @allure.feature("故障注入") @allure.story("CVD") @allure.title("低压") @allure.description("描述 11") @allure.testcase("www.baidu.com", "用例链接") @allure.issue("www.sogou.com", "缺陷链接", ) @pytest.mark.ut def test_02():assert 1 == 2@allure.epic("hil测试") @allure.feature("故障注入") @allure.story("HTO") @allure.description("描述 11") @allure.testcase("www.baidu.com", "用例链接") @allure.issue("www.sogou.com", "缺陷链接", ) @pytest.mark.ut def test_03():assert 1 == 1
相关文章:

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...