单元测试框架Pytest的基本操作

本文详细介绍了Pytest单元测试框架,包括命名规则、自定义查找规则、3种运行方式、执行顺序、断言、mark的使用(作用、标记方式、注册标签名、skip跳过标记)、参数化和fixture测试夹具(作用、定义及使用、范围)。通过学习,你可以熟练掌握Pytest进行单元测试的各种技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 详解

一文5000字详解Pytest单元测试,看完不会来打我【保姆级教程】

1.1 命名规则:

 🔸 模块名: test_*.py或者是 *_test.py(即以test_开头或_test结尾的py文件)
​ 🔸类名:Test开头,且类里没有__init__函数(否则容易报错)
​ 🔸方法名:test_开头

1.2 自定义查找规则:

我们还可以自定义查找的规则,但自定义的规则配置文件要放在你要运行的项目的根目录下(见上图),且配置文件要严格以pytest.ini命名,pytest.ini文件内容举例如下:

[pytest]	# 只能修改=右边的值
python_files = demo_*.py	# 模块名以demo_开头
python_functions = demo_*	# 方法名以demo_开头
python_classes = Demo*	# 类名名以Demo开头

1.3 3种运行方式

【pytest】一、pytest的3种运行方式,运行指定测试用例,跳过测试用例

1.4 执行顺序

pytest有自己内置的执行顺序规则,一般是从上往下,即同一个py文件中,从上往下执行测试用例。

2. 断言

参考文章:pytest篇3-断言详解

2.1 定义

断言就是在测试代码中添加的一些判断逻辑,用于判断被测程序的实际输出是否符合预期结果。如果实际输出结果与预期不符,则断言抛出异常,测试失败;否则测试通过。(添加断言在对应的方法里面,做判断测试用例结果是否满足预期)

2.2 断言的规则

pytest断言的规则如下:

  1. 如果表达式为False,则断言失败,抛出AssertionError异常;
  2. 如果表达式为True,则断言成功,测试通过;
  3. 如果使用assert not表达式,则当表达式为True时,断言失败,测试失败;
  4. 如果使用assert == 表达式,则当两个表达式的值相等时,断言成功,否则断言失败。
    在这里插入图片描述

3. mark

【pytest】使用 mark 标记及运行测试用例,注册、管理 mark 标记

3.1 mark的作用

在实际工作中,我们要写的自动化用例会比较多,也不会都放在一个py文件中,如果有几十个py文件,上百个方法,而我们只想运行当中部分的用例时怎么办?
pytest提供了一个非常好用的mark功能,可以给测试用例打上各种各样的标签,运行用例时可以指定运行某个标签。mark功能作用就是灵活的管理和运行测试用例。

pytest的mark功能允许我们通过自定义标记来对测试用例进行分组、选择和过滤

3.2 mark的标记方式

​ 标签既可以打到方法上,也可以打到类上,标记的两种方式:
🍊 直接标记类或方法或函数:@pytest.mark.标签名
🍊 类属性:pytestmark = [pytest.mark.标签名, pytest.mark.标签名],需要注意的是属性名称是固定的

使用mark标记测试用例非常简单,只需要在测试函数或类上方添加注解即可。例如,我们可以使用@pytest.mark.feature来标记一个测试函数属于某个特定的功能模块:

3.3 注册标签名

我们要想运行已经打好标记的函数,还需要对标签名进行注册,告诉pytest有哪些标签,如果不进行注册运行时(pytest的高级版本)可能会报警告让你进行注册。

​ 我们只需要在项目根目录下创建一个pytest.ini文件,注意文件名是不可修改的,否则pytest会找不到。内容格式如下

 - 首先在项目根目录创建一个文件 pytest.ini ,这个是 pytest 的配置文件; 然后在 pytest.ini 文件的
 - markers 中写入你的 mark 标记, 冒号 “:” 前面是标记名称,后面是 mark 标记的说明,可以是空字符串;
 - 注意:pytest.ini 文件中只能使用纯英文字符,绝对不能使用中文的字符(尤其是冒号和空格)!
# pytest.ini
# 只能修改=右边的值
[pytest]	
python_files = demo_*.py	# 模块名以demo_开头
python_functions = demo_*	# 方法名以demo_开头
python_classes = Demo*	# 类名名以Demo开头

# 注册标签
markers = 
    login   : 'marks tests as login'
    logout  : 'marks tests as logout'
    success : 'marks tests as success'
    failed  : 'marks tests as failed'

规范使用 mark 标记:
注册完 mark 标记之后 pytest 便不会再告警,但是有时手残容易写错 mark 名,导致 pytest 找不到用例,一时想不开很难debug,尤其是团队协作时很容易出现类似问题,所以我们需要 “addopts = --strict” 参数来严格规范 mark 标记的使用!

  • 在 pytest.ini 文件中添加参数 “addopts = --strict”;
  • 注意要另起一行,不要在 markers 中添加;
  • 添加该参数后,当使用未注册的 mark 标记时,pytest会直接报错:“ ‘xxx’ not found in markersconfiguration option ”,不执行测试任务; 注意:pytest.ini
  • 配置文件不支持注释,不支持注释,不支持注释…
# pytest.ini
 
[pytest]
markers = 
    login   : 'marks tests as login'
    logout  : 'marks tests as logout'
    success : 'marks tests as success'
    failed  : 'marks tests as failed'
 
addopts = --strict

3.4 skip跳过标记

在维护测试用例的过程中,可能在一个阶段某些用例已经不需要了,或者在指定条件下是不需要运行的,那么我们就可以通过mark.skip跳过这些函数或者类,两种跳过方式:

  • 🍑直接跳过: @pytest.mark.skip(reason = “原因”),这里原因是可选参数
  • 🍑条件跳过,即满足某个条件才跳过:@pytest.mark.skipif(a == 1, reason = “原因”)
db_host = 'localhost'

@pytest.mark.skip("和现在的需求不符合")	# 不满足当下了,或别人编写的暂时不能删的
def test_yuz(self
### Pytest 自动化测试框架使用指南 #### 什么是 pytestPytest 是一种功能强大且易于使用的 Python 测试框架,它能够帮助开发者更高效地编写和执行测试脚本[^1]。其核心优势在于简化了测试过程中的复杂操作,并提供了丰富的插件生态系统来扩展功能。 --- #### 安装 pytest 要开始使用 pytest,首先需要安装该库。可以通过 pip 工具完成安装: ```bash pip install pytest ``` --- #### 基础概念 - **测试文件命名规则**:pytest 默认识别以 `test_` 开头或 `_test` 结尾的文件作为测试文件[^2]。 - **测试函数/方法命名规则**:测试函数应以 `test_` 开始;类名则需以 `Test` 开头,且不应包含父类继承(除非必要)。 --- #### 示例代码 以下是一个完整的 pytest 测试案例演示如何定义并运行多个测试用例: ##### 文件结构 假设有一个名为 `calculator.py` 的模块用于实现加法运算逻辑: ```python # calculator.py def add(a, b): return a + b ``` 对应的测试文件如下所示: ```python # test_calculator.py import pytest from calculator import add class TestCalculator: def test_add_positive_numbers(self): result = add(1, 2) assert result == 3, f"Incorrect addition result: {result}" # 断言验证结果是否正确[^4] def test_add_negative_numbers(self): result = add(-1, -2) assert result == -3, f"Incorrect addition result: {result}" if __name__ == "__main__": pytest.main() ``` 运行此测试文件的方式有两种: 1. 执行整个目录下的所有测试文件: ```bash pytest ``` 2. 针对单个文件运行测试: ```bash pytest test_calculator.py ``` --- #### 参数化测试 为了减少冗余代码量,pytest 提供了参数化的机制,允许一次性定义多种输入条件及其预期输出值。以下是基于前面例子改进后的版本: ```python @pytest.mark.parametrize( "a,b,expected", [ (1, 2, 3), (-1, -2, -3), (0, 0, 0), ], ) def test_add_parametrized(a, b, expected): result = add(a, b) assert result == expected, f"Expected {expected}, but got {result}" ``` 这样可以显著提升测试效率与可维护性。 --- #### 固定装置(Fixtures) 固定装置是 pytest 中非常重要的特性之一,主要用于提供共享资源给不同测试用例使用。例如登录状态、数据库连接等情境都可通过 fixtures 实现复用。 下面展示了一个简单示例说明如何创建 fixture 并将其应用于多个测试用例之中: ```python @pytest.fixture(scope="module") def setup(): print("\nSetup called before any tests.") yield {"username": "admin", "password": "secret"} print("\nTeardown after all tests.") class TestLoginFixtureUsage: def test_login_with_fixture(self, setup): user_info = setup assert user_info["username"] == "admin" def test_another_test_case_using_same_setup(self, setup): pass # 可继续添加更多依赖于同一setup数据的测试逻辑 ``` 此处的关键点在于通过 `@pytest.fixture()` 装饰器声明一个 fixture 函数,在需要的地方传入即可调用对应的数据准备流程[^3]。 --- #### 总结 Pytest 不仅能极大地方便日常开发过程中单元测试工作的开展,而且还能促进团队协作时保持高质量交付成果的能力。掌握好它的基本语法以及高级特性的运用技巧将会成为每位工程师不可或缺的一项技能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值