初学 pytest 记录

  1. 安装

    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]
    
  2. 启动测试

    • 命令行输入 pytest 会自动检索项目中所有的用例去执行 参数 -k “xx” 模糊匹配文件执行
    • 根目录新建 main.py 文件 右键运行脚本
    main.py
    import pytest
    pytest.main()
    
  3. 用户自定义标记

    可以根据不同类型的用例分成不同的种类.在用例多的情况下可以根据需求执行部分种类测试日志.
    配置
    创建配置文件,我这边创建在项目的根目录下 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 标记名称
    
  4. 内置标记

    • 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)
      
  5. 夹具-fixture

    我把fixture 理解成用例执行的前置操作和后置操作(钩子函数)
    比如,在对 web 网站进行测试时,前置必要条件需要先打开浏览器.测试完毕后关闭浏览器.

    • fixture 可以被 fixture 调用
    • 在fixture中的yield关键字可以返回值,只能返回 1 个值
    • 在使用 fixture 中参数scope可以控制夹具的作用范围
      1. function 默认值, 每个用例都会执行一遍
      2. class 每个类执行一遍
      3. module 每个模块执行一遍
      4. session 每个会话执行一遍
      5. 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用例执行结束
  6. 测试报告

    这里用到第三方插件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
    

    在这里插入图片描述

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

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

相关文章

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…

LLMs 系列科普文(11)

目前我们已经介绍了大语言模型训练的两个主要阶段。第一阶段被称为预训练阶段,主要是基于互联网文档进行训练。当你用互联网文档训练一个语言模型时,得到的就是所谓的 base 模型,它本质上就是一个互联网文档模拟器,我们发现这是个…

深度学习环境配置指南:基于Anaconda与PyCharm的全流程操作

一、环境搭建前的准备 1. 查看基础环境位置 conda env list 操作说明:通过该命令确认Anaconda默认环境(base)所在磁盘路径(如D盘),后续操作需跳转至该磁盘根目录。 二、创建与激活独立虚拟环境 1. 创…

【2D与3D SLAM中的扫描匹配算法全面解析】

引言 扫描匹配(Scan Matching)是同步定位与地图构建(SLAM)系统中的核心组件,它通过对齐连续的传感器观测数据来估计机器人的运动。本文将深入探讨2D和3D SLAM中的各种扫描匹配算法,包括数学原理、实现细节以及实际应用中的性能对比,特别关注…

力扣160.相交链表

题目描述 难度:简单 示例 思路 使用双指针 使用指针分别指向两个不同的链表进行比较 解题方法 1.首先进行非空判断 2.初始化指针分别指向两个链表 3.遍历链表 while (pA ! pB): 当pA和pB不相等时,继续循环。如果pA和pB相等,说明找…

本地项目push到git

cd /home/user/project git init 添加远程仓库地址 git remote add origin https://github.com/user/repo.git 创建并切换到新分支 git checkout -b swift 添加文件到暂存区 git add . git commit -m “swift训练评测” git push -u origin swift —force #首次 git push …

uni-app学习笔记二十九--数据缓存

uni.setStorageSync(KEY,DATA) 将 data 存储在本地缓存中指定的 key 中&#xff0c;如果有多个key相同&#xff0c;下面的会覆盖掉原上面的该 key 对应的内容&#xff0c;这是一个同步接口。数据可以是字符串&#xff0c;可以是数组。 <script setup>uni.setStorageSyn…

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…

NFC碰碰卡发视频源码搭建与写卡功能开发实践

在信息快速传播的时代&#xff0c;便捷的数据交互方式成为用户的迫切需求。“碰一碰发视频” 结合写卡功能&#xff0c;为视频分享提供了新颖高效的解决方案&#xff0c;在社交娱乐、商业推广等场景中展现出巨大潜力。本文将详细介绍碰一碰发视频源码搭建以及写卡功能开发的全过…

详解K8s 1.33原地扩缩容功能:原理、实践、局限与发展

你是否有过这样的经历&#xff1f; 精心配置了 Kubernetes 的 Pod&#xff0c;设置了“刚刚好”的 CPU 和内存&#xff08;至少你当时是这么想的&#xff09;&#xff0c;结果应用不是资源紧张喘不过气&#xff0c;就是像“双十一”抢购一样疯狂抢占资源。 过去&#xff0c;唯…

IOS 打包账号发布上传和IOS Xcode证书配置

xcode下载 https://developer.apple.com/download/all/ App发布 https://appstoreconnect.apple.com/ https://appstoreconnect.apple.com/teams/83ba877c-af24-4fa5-aaf2-e9b9b6066e82/apps/6473148620/testflight/groups/eb983352-b2e2-4c29-bbb7-071bf7287795 https://devel…

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…

Significant Location Change

一、Significant Location Change是什么 “Significant Location Change&#xff08;重大位置变化&#xff09;” 是苹果 iOS 系统中一项用于在应用未主动运行时&#xff0c;监测设备位置显著变化的功能。它主要通过基站、Wi-Fi 网络等信号来判断设备是否发生了有意义的位置移…

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…

基于cnn的通用图像分类项目

背景 项目上需要做一个图像分类的工程。本人希望这么一个工程可以帮助学习ai的新同学快速把代码跑起来&#xff0c;快速将自己的数据集投入到实战中&#xff01; 代码仓库地址&#xff1a;imageClassifier: 图片分类器 代码切到master分支&#xff0c;master分支是本地训练图…

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …

从OCR到Document Parsing,AI时代的非结构化数据处理发生了什么改变?

智能文档处理&#xff1a;非结构化数据提出的挑战 在这个时代的每一天&#xff0c;无论是个人处理账单&#xff0c;还是企业处理合同、保险单、发票、报告或成堆的简历&#xff0c;我们都深陷在海量的非结构化数据之中。这类数据不像整齐排列的数据库表格那样规整&#xff0c;…

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…

相关类相关的可视化图像总结

目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系&#xff0c;可直观判断线性相关、非线性相关或无相关关系&#xff0c;点的分布密…