pytest详解(一)

目录

  • 前言
  • 安装
    • 检验
  • 编写测试文件
    • 一个简单完整的pytest的组成结构
  • pytest运行用例时携带的参数(常用)
  • pytest的用例命名规则
  • pytest的常用运行方式
    • pytest指定运行用例
      • 指定运行一个文件夹中的用例
      • 指定运行一个文件夹中的一个文件中的用例
      • 指定运行一个文件夹中的一个文件中的一个用例
  • pytest的用例前置和后置处理
  • pytest的标签使用
  • pytest的conftest的使用
  • pytest的ini文件的使用

前言

  Pytest是⼀个⽤于编写和执行Python测试的全功能测试框架。它是⼀个第三方库,提供了简洁、灵活和易于使用的方式来编写各种类型的测试,包括单元测试、集成测试和功能测试等。
  Pytest是⼀个功能强⼤、易于使用和扩展的Python测试框架,提供了丰富的功能和灵活的测试编写⽅式,使得编写和执行Python测试变得更加⾼效和愉快。

安装

pip install pytest

检验

pytest --version
or 
pip show pytest

编写测试文件

  测试文件通常以 test_ 开头或以 _test 结尾,测试函数和类也以 test_ 开头。

一个简单完整的pytest的组成结构

1、用例主体部分
2、用例运行语句

# file name: test_case.py
"""⽤例主体部分"""
# 主体例⼦⼀
def test_case():print("⽤例被运⾏")
# 主体例⼦⼆
def test_project_duck():
print("烤鸭店利润计算器开始⼯作")
price1 = int(input("请输⼊你的进货价:")) # input传递来的值,都是str
price2 = int(input("请输⼊你的售卖价:"))
num = int(input("请输⼊你今天卖的鸭⼦数量:"))result = (price2 - price1) * num
print("今天你的利润额度为{}元".format(result))
# file name: main.py
"""⽤例运⾏语句"""
import pytest
pytest.main(["-s"])

pytest运行用例时携带的参数(常用)

① -s
  表示开启终端交互,其作⽤是可以让打印的内容输出显示在终端中,或者可以在终
端中与⽤例中的输⼊操作进⾏交互
② -v
  表示详细输出更详细的输出,包括每个测试⽤例的详细结果和其他相关信息,例如
测试⽤例所在的模块、⽂件路径等。
③ -k
  执行用例中包含‘关键字’的用例
④ -m
  执行‘标记’的内容,执行特定的测试用例,执行有相同标记的测试用例

pytest的用例命名规则

  在 pytest 中,有关测试用例和测试⽂件的命名规则有⼀些常⻅的约定。以下是
pytest 的命名规则的⼀些建议和最佳实践:

  1. 测试⽂件的命名:
      测试⽂件应以 test_ 开头或以 _test 结尾。这样 pytest 可以自动识别并执行这些⽂件中的测试用例。例如: test_login.pyuser_test.py 。使用有意义的名称来描述被测试的功能或模块。例如: test_authentication.pytest_user_management.py
  2. 测试用例的命名:
      测试⽤例函数应以 test 开头。这样 pytest 可以⾃动识别并执行这些函数作为测试⽤例。例如: def test_login_success():def test_add_product_to_cart(): 。建议使用下划线 _ 分隔单词,而不是使用空格或其他特殊字符。
      例如: def test_calculate_total_amount():def test_validate_user_permissions(): 。使用有意义的名称来描述测试的目的和预期结果。例如: test_login_success() 测试登录功能的成功场景, test_calculate_total_amount() 测试计算总金额的功能。
  3. 测试类的命名(可选):
      如果使⽤类来组织测试⽤例,可以使用驼峰命名法(CamelCase)为测试类命名,且开头需为Test开头。例如: class TestLogin:classTestUserManagement: 。测试类中的测试⽤例函数仍然应遵循以 test 开头的命名规则。

pytest的常用运行方式

pytest tests/test_module.py::test
pytest tests/test_module.py
pytest tests/

pytest指定运行用例

指定运行一个文件夹中的用例

#file name: main.py
import pytest
pytest.main(['tests/'])

指定运行一个文件夹中的一个文件中的用例

# file name: main.py
import pytest
pytest.main(['tests/test_module.py'])

指定运行一个文件夹中的一个文件中的一个用例

# file name: main.py
import pytest
pytest.main(['tests/test_module.py::test'])

pytest的用例前置和后置处理

   在 pytest 中,你可以使用 setupteardown 函数来定义测试用例的前置和后置
操作。

  1. setup 函数:它会在每个测试⽤例执行之前运行,用于设置测试环境和准备测试数据。
  2. teardown 函数:它会在每个测试用例执行之后运行,⽤于清理测试环境和资源。
    以下是使用 setupteardown 的示例:
def setup():# 前置操作print("执⾏前置操作")def teardown():# 后置操作print("执⾏后置操作")def test_example():# 测试⽤例print("执⾏测试⽤例")

   在 pytest 中,除了全局的 setupteardown 函数之外,还可以定义不同级别的
setupteardown 函数,以满足不同的测试需求。这些级别包括:

  1. 模块级别的 setup 和 teardown
       pytest_setup_modulepytest_teardown_module :在整个测试模块的
    开始和结束时运⾏。
    示例:
def pytest_setup_module():# 模块级别的前置操作print("执⾏模块级别的前置操作")
def pytest_teardown_module():# 模块级别的后置操作print("执⾏模块级别的后置操作")
  1. 类级别的 setupteardown
      setup_classteardown_class :在测试类的开始和结束时运行。
    示例:
class TestClass:@classmethoddef setup_class(cls):# 类级别的前置操作print("执⾏类级别的前置操作")@classmethoddef teardown_class(cls):# 类级别的后置操作print("执⾏类级别的后置操作")
  1. ⽅法级别的 setupteardown
      setup_methodteardown_method :在每个测试⽅法的开始和结束时运
    ⾏。
    示例:
class TestClass:def setup_method(self, method):# ⽅法级别的前置操作print("执⾏⽅法级别的前置操作")def teardown_method(self, method):# ⽅法级别的后置操作print("执⾏⽅法级别的后置操作")def test_example(self):# 测试⽤例print("执⾏测试⽤例")

  通过定义不同级别的 setupteardown 函数,你可以灵活地控制测试用例的前置和后置操作,并在不同的级别上进⾏特定的设置和清理工作。这有助于更好地组织和管理测试代码,并提供更细粒度的控制。

pytest的标签使用

  在Pytest中,标签(也称为标记)是⼀种用于对测试用例进行分类或分组的机制通过为测试用例添加标签,可以在运行测试时选择性地执行特定标签的测试用例,从而方便地控制测试的范围和目标。
  Pytest的标签功能基于装饰器来实现。可以使用 @pytest.mark 装饰器为测试函数或测试类添加标签。常见的用法是在测试函数或测试类上方添加装饰器,并指定相应的标签。
  以下是使用Pytest标签的示例:

import pytest
@pytest.mark.smoke
def test_login():# 测试登录功能assert True
@pytest.mark.regression
def test_registration():# 测试注册功能assert True
@pytest.mark.smoke
def test_add_to_cart():# 测试添加到购物⻋功能assert True
@pytest.mark.regression
def test_checkout():# 测试结账功能assert True

  在项目根目录下的 pytest.ini 文件中可以指定全局标记,以应用于整个项⽬:

iniCopy code
[pytest]
markers =smoke: Run smoke testsregression: Run regression tests

pytest的conftest的使用

  当使用 Pytest 进行测试时, conftest.py 是⼀个特殊的文件,用于管理测试用例中需要通用数据传递。下⾯是⼀些简单的例⼦来说明 conftest.py 的使⽤。
定义⼀个简单的夹具(fixture):

import pytest
@pytest.fixture
def setup_data():return [1, 2, 3, 4, 5]

  在 conftest.py 中定义了⼀个名为 setup_data 的夹具。这个夹具可以在测试中
被使⽤,如下所示:

def test_sum(setup_data):assert sum(setup_data) == 15
def test_traversal(setup_data):for i in setup_data:assert i in setup_data

  pytest.fixturePytest 测试框架中的⼀个装饰器,用于定义测试用例中需要共享的资源、数据或设置的函数。它可以在测试用例执行之前、之后或在每个测试用例之前、之后运行,并提供⼀种方便的方式来管理测试用例的前置条件和后置操作。
  使用 pytest.fixture 装饰器,你可以创建⼀个被 Pytest 自动调用的函数,该函数可以为测试用例提供所需的初始化步骤或共享的数据。这个函数可以返回⼀个值,该值将作为参数传递给测试用例函数。
  通过使用 pytest.fixture ,你可以更方便地管理测试用例的前置条件和后置操作,实现测试数据的共享和代码的重用,从而使测试代码更加简洁、可维护和可扩展。
  pytest.fixture 装饰器可以接受⼀些参数,用于配置和定制 fixture 函数的行为。
以下是⼀些常用的参数:

  1. scope :指定 fixture 的作用域。可以设置为以下几个值之⼀:
    “function” (默认值):每个测试函数都会调用⼀次 fixture。
    “class” :每个测试类都会调用⼀次 fixture。
    “module” :每个测试模块都会调用⼀次 fixture。
    “session” :整个测试会话只会调用⼀次 fixture。
  2. params :参数化 fixture,可以根据不同的参数值生成多个独立的 fixture 实例。
    可以传递⼀个可迭代对象,每个元素都会作为参数值调用fixture。
  3. autouse :自动使用 fixture,无需在测试函数中显式声明使用该 fixture。可以
    设置为 True 或 False 。
  4. name :为 fixture 指定⼀个自定义名称,用于在测试报告和日志中标识 fixture。
  5. 其他参数:可以根据需要添加其他自定义参数,供 fixture 函数使用。

    下面是⼀个例子,展示了如何使用参数来配置 pytest.fixture
import pytest# 指定 fixture 的作⽤域为测试模块
@pytest.fixture(scope="module")
def setup_module():print("Module setup")
# 参数化 fixture
@pytest.fixture(params=[1, 2, 3])
def setup_data(request):print(f"Setup data: {request.param}")return request.param
# ⾃动使⽤ fixture
@pytest.fixture(autouse=True)
def setup_autouse():print("Autouse fixture")
# ⾃定义 fixture 名称
@pytest.fixture(name="custom_fixture")
def setup_custom():print("Custom fixture")
# 测试函数使⽤ fixture
def test_example(setup_module, setup_data, custom_fixture):print(f"Test example: {setup_data}")
# 在测试类中使⽤ fixture
@pytest.mark.usefixtures("setup_module")
class TestClass:def test_class_example(self, setup_data):print(f"Class example: {setup_data}")

  在上述示例中,我们展示了不同参数的用法。 setup_module fixture 的作用域设置为模块级别,因此在测试模块中只会执行⼀次。 setup_data fixture 使用参数化配置,会根据不同的参数值生成多个独立的 fixture 实例。
  setup_autouse fixture 设置为自动使用,无需在测试函数中显式声明使用该 fixturecustom_fixture fixture使用自定义名称。 test_example 测试函数使用了多个fixture,并打印出相应的信息。 TestClass 测试类使用了 setup_module fixture,并在测试方法中使用了setup_data fixture
  通过使用不同的参数配置,可以灵活地定制和管理 pytest.fixture,以满足测试用例的需求。

pytest的ini文件的使用

  Pytest 支持使用 pytest.ini 文件来配置测试运行的各种选项和参数。 pytest.ini 文件位于测试项目的根目录下,可以通过在该文件中设置不同的选项来自定义测试的行为。下面是⼀些 pytest.ini 文件的使用示例和说明:

  1. 配置默认的命令行选项:
[pytest] [pytest]
addopts = -v -s

上述配置使用 addopts 选项指定了默认的命令行选项, -v 表示启用详细输
出, -s 表示禁止捕获标准输出。
2. 选择要运行的测试文件或目录:

[pytest] [pytest]
testpaths = tests/

上述配置使用 testpaths 选项指定了要运行的测试文件或目录的路径。
3. ⾃定义夹具搜索规则:

[pytest] [pytest]
addopts = -v -s
[pytest] [pytest]
testpaths = tests/

  上述配置使⽤ python_filespython_classespython_functions 选项指定了自定义夹具的搜索规则,分别指定了测试⽂件、测试类和测试函数的名称模式。
4. 禁用某些插件:

[pytest] [pytest]
addopts = --disable-warnings

  上述配置使⽤ addopts 选项指定了禁用某些插件的选项, --disable-warnings 表示禁⽤警告信息。
  这些是⼀些 pytest.ini 文件的示例配置,你可以根据需要设置不同的选项来⾃定义测试的⾏为。通过编辑和配置 pytest.ini ⽂件,你可以⽅便地管理测试项⽬的各种选项和参数,提⾼测试的灵活性和可定制性。
  请注意, pytest.ini ⽂件中的选项和参数设置将适⽤于整个测试项⽬,但也可以在命令行中使用选项覆盖部分配置。

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

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

相关文章

汇编——SSE打包整数

SSE也可以进行整数向量的加法,示例如下: ;sse_integer.asm extern printfsection .datadummy db 13 align 16pdivector1 dd 1dd 2dd 3dd 4pdivector2 dd 5dd 6dd 7dd 8fmt1 db "Packed Integer Vector 1: %d, %d, %d, %d",…

【鹅厂摸鱼日记(二)】(生活篇)初到深圳的人情冷暖

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:重生之我在鹅厂摸鱼⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多知识   🔝🔝 摸鱼日记 1. 前言2. 鹅厂的人文关怀…

论文笔记:NEFTune: Noisy Embeddings Improve Instruction Finetuning

iclr 2024 reviewer 评分 5666 1 论文思路 论文的原理很简单:在finetune过程的词向量中引入一些均匀分布的噪声即可明显地提升模型的表现 2 方法评估

JavaScript数组操作方法全录

改变原数组的方法: push() - 将一个或多个元素添加到数组的末尾,并返回新数组的长度。 pop() - 从数组中移除最后一个元素,并返回该元素。 shift() - 从数组中移除第一个元素,并返回该元素。 unshift() - 将一个或多个元素添加到…

2024年第二届交通运输与建筑工程国际会议(IACTCE2024)

2024年第二届交通运输与建筑工程国际会议(IACTCE2024) 会议简介 本次会议旨在为从事交通建设工程等相关领域的专家学者、工程技术人员和研发人员提供一个平台,分享科研成果和前沿技术,了解学术发展趋势,拓宽研究思路…

docker 安装canal

一、新建文件夹 新建文件夹logs, 新建文件canal.properties instance.properties docker.compose.yml canal.propertie 修改如下: 修改instance.properties内容如下 1.1 canal.properties ################################################# ######### …

算法刷题应用知识补充---数论

这里写目录标题 快速幂求a^k%p题结 快速幂求逆元题结 扩展欧几里得求逆元题结 排列组合题结二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 快速幂求a^k%p 题 结 主要用到a的k次方,可以用多个a的…

fastadmin + laragon + nginx的后台访问路径配置

使用过fastadmin的小朋友都知道, fastadmin 默认的是不能访问admin模块的, 它在public 文件夹中又新建了一个 XXX.php 来指向 admin 模块的,作用像 index.php 的文件 以前我每次使用的时候,直接就到 config配置文件中把 admin 模块…

磁盘管理与逻辑卷

磁盘管理 会在linux中使用硬盘 分区 格式化(重新安装文件系统) 挂载 磁盘的硬件架构 扇区:一个扇区512字节,是磁盘的最小单位 磁道:同一盘片不同半径的同心圆 柱面:不同盘片相同半径构成的圆&#xf…

String类(1)

❤️❤️前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&a…

CC工具箱使用指南:【融合同类碎图斑】

一、简介 在一些经过不合理处理的数据中,经常会存在碎图斑,正常情况下用【融合】或【消除】工具即可解决。 但是【融合】工具会融掉无关的字段,【消除】工具则会将碎图斑融给不同用地类型的图斑。 如下图所示,因为B1面积更大&a…

Go-学会方法的基本使用

本节重点: 学会方法的基本使用 方法主要源于 OOP 语言,在传统面向对象语言中 (例如 C), 我们会用一个“类”来封装属于自己的数据和函数,这些类的函数就叫做方法。 虽然 Go 不是经典意义上的面向对象语言,但是我们可以在一些接收…

蓝桥杯嵌入式(G431)备赛笔记——PWM+LCD+按键

目录 题目要求(真题): cubeMX配置: 小试牛刀: Keil代码: 效果演示: 题目要求(真题): 使用第十一届第二场真题,练习PWM波部分的代码&#xff0c…

德国FSL18罗德与施瓦茨频谱分析仪

181/2461/8938产品概述: 频率范围:9 kHz至18 GHz(超范围至20 GHz)频率分辨率:1赫兹28 MHz的信号分析带宽低测量不确定性,即使在微波范围内通用测量应用,例如光谱图轻巧紧凑,便于现场安装、维护和服务 9 kH…

【图论】链式前向星+BFS实现拓扑排序(topSort)

拓扑排序 👏引入 重要概念: 入度:表示一个结点的所有前结点的个数 问题:给定 n 个结点和 m 个边,然后输入所有的边,输出拓扑排序序列 topsort在网上有很多的介绍,这里就省略,主要讲解拓扑排序的思路。 🤔思…

Anthropic Claude 3 加入亚马逊云科技 AI“全家桶”

编辑 | 宋慧 出品 | CSDN AIGC 每天都有新动态发生。最新的消息是亚马逊在 3 月底完成了对 Anthropic 的 40 亿美元投资(也是亚马逊 30 年来最大一笔外部投资),以及 GPT-4 最强对手的 Anthropic Claude 3 已经在亚马逊云科技 Amazon Bedrock…

什么是企业邮箱?企业邮箱和个人邮箱的区别是什么?

拥有一个企业邮箱究竟能给公司带什么益处?这是许多中小企业管理者好奇的,很多人觉得邮箱只要用来收发邮件就够了。但实际上,什么是企业邮箱?企业邮箱和个人邮箱在功能范围有着很大的区别。好的企业邮箱不仅能提高公司内部的沟通效…

【电控笔记5】电流环pi参数整定

旋转坐标系下的电压方程,由id和iq计算出ud和uq 把常数项(上面两个红框)拿出来解耦合,作为前馈,如下 电流环传递函数 电流带宽 响应时间 另一种方法:内膜控制器

RISC-V特权架构 - 中断注入

中断注入 1 中断注入的作用2 mip寄存器3 中断注入后的处理过程 本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 中断注入的作用 中断注入,就是在M模式下,手动向S模式去产生一个中断。 比如:向mip寄存器的bit5…

Web前端开发——Vue概述

前言: 整理下学习笔记,打好基础,daydayup!!! Vue Vue是一套前端框架,基于MVVM(Model-View-ViewModel)思想,实现数据的双向绑定,将编程的专注点放在数据上,可以免除原生JavaScript中的DOM操作&am…