# 【1】PYTHON中测试函数 assert
# 【2】pytest 测试库
# ============================= test session starts =============================
# collecting ... collected 2 items
#
# A_1.py::test_1 PASSED                                                    [ 50%]
# A_1.py::test_2 PASSED                                                    [100%]
#
# ============================== 2 passed in 0.01s ==============================
# 【3】pytest.fixture装饰器
def my_adder(a, b):
    return a + b


def test_1():
    assert my_adder(1, 2) == 3


def test_2():
    assert my_adder(-1, 2) == 1


# 【3】测试类
class Employee:
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

    def give_raise(self, amount=5000):
        self.salary = self.salary + amount


def test_employee():
    emp = Employee("John", 20000)
    emp.give_raise()
    assert emp.salary == 25000


def test_employee_self():
    emp = Employee("John", 20000)
    emp.give_raise(10000)
    assert emp.salary == 30000

在软件开发过程中,测试是确保代码质量的关键环节。Python提供了多种测试工具和方法,本文将重点介绍三种核心测试技术:assert语句、pytest测试框架以及pytest.fixture装饰器。通过本文,你将掌握如何为Python代码编写有效的测试用例。

一、Python中的assert语句

assert是Python内置的断言语句,用于测试一个条件是否为真。如果条件为假,assert会引发AssertionError异常。

基本语法:

python

复制

下载

assert condition, message

其中condition是要测试的条件表达式,message是当断言失败时显示的可选错误消息。

示例代码分析

python

复制

下载

def my_adder(a, b):
    return a + b

def test_1():
    assert my_adder(1, 2) == 3

def test_2():
    assert my_adder(-1, 2) == 1

在这个例子中:

  1. my_adder是一个简单的加法函数

  2. test_1test_2是两个测试函数,使用assert验证my_adder的输出是否符合预期

assert的优点

  • 简单直接,无需额外导入

  • 可以快速验证代码行为

  • 在开发和调试阶段非常有用

assert的局限性

  • 错误信息不够详细

  • 不适合复杂的测试场景

  • 需要手动组织测试用例

二、pytest测试框架

pytest是Python中最流行的测试框架之一,它提供了更强大的测试功能和更友好的测试报告。

安装pytest

bash

复制

下载

pip install pytest

pytest的特点

  1. 自动发现测试文件(以test_开头或_test结尾的文件)和测试函数(以test_开头的函数)

  2. 丰富的断言 introspection,失败时提供详细信息

  3. 支持fixture和参数化测试

  4. 丰富的插件生态系统

pytest测试示例

运行测试时,只需在命令行执行:

bash

复制

下载

pytest

输出示例:

text

复制

下载

============================= test session starts =============================
collecting ... collected 2 items

A_1.py::test_1 PASSED                                                    [ 50%]
A_1.py::test_2 PASSED                                                    [100%]

============================== 2 passed in 0.01s ==============================

pytest会自动:

  1. 发现所有测试用例

  2. 执行它们

  3. 生成清晰的测试报告

三、测试类的编写

在实际项目中,我们经常需要对类进行测试。下面是一个测试类的示例:

python

复制

下载

class Employee:
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

    def give_raise(self, amount=5000):
        self.salary = self.salary + amount

def test_employee():
    emp = Employee("John", 20000)
    emp.give_raise()
    assert emp.salary == 25000

def test_employee_self():
    emp = Employee("John", 20000)
    emp.give_raise(10000)
    assert emp.salary == 30000

测试要点:

  1. 创建类的实例

  2. 调用方法

  3. 验证状态变化是否符合预期

四、pytest.fixture装饰器

fixture是pytest的一个强大功能,它提供了测试所需的固定环境,可以避免重复代码并提高测试的可维护性。

fixture的基本用法

python

复制

下载

import pytest

@pytest.fixture
def employee():
    return Employee("John", 20000)

def test_give_default_raise(employee):
    employee.give_raise()
    assert employee.salary == 25000

def test_give_custom_raise(employee):
    employee.give_raise(10000)
    assert employee.salary == 30000

fixture的优势:

  1. 复用测试数据

  2. 减少重复代码

  3. 使测试更清晰

  4. 支持复杂的setup/teardown操作

fixture的作用范围

可以通过scope参数控制fixture的作用范围:

  • function (默认):每个测试函数运行一次

  • class:每个测试类运行一次

  • module:每个模块运行一次

  • session:整个测试会话运行一次

python

复制

下载

@pytest.fixture(scope="module")
def shared_resource():
    # 初始化代码
    yield resource
    # 清理代码

五、最佳实践

  1. 命名规范

    • 测试文件:test_.py或_test.py

    • 测试函数/方法:test_*

    • fixture函数:不以test_开头

  2. 测试组织

    • 将测试与源代码分离

    • 为每个模块创建对应的测试模块

    • 使用类组织相关测试

  3. 断言消息

    • 为重要的assert添加描述性消息

    python

    复制

    下载

    assert result == expected, f"Expected {expected}, got {result}"
  4. 测试独立性

    • 每个测试应该独立运行

    • 避免测试之间的依赖关系

六、总结

本文介绍了Python测试的三个关键方面:

  1. 使用assert进行简单验证

  2. 利用pytest框架组织和管理测试

  3. 通过fixture优化测试代码结构

良好的测试实践可以显著提高代码质量和开发效率。pytest提供了丰富的功能来满足各种测试需求,是Python项目中不可或缺的工具。

希望本文能帮助你更好地理解和应用Python测试技术。在实践中,建议从小规模测试开始,逐步建立完整的测试套件,为项目的稳定性和可维护性打下坚实基础。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐