pytest 的简单介绍

官方文档:pytest 文档

1. pytest 概述

pytest 是一个功能强大的 Python 测试框架,旨在简化单元测试和功能测试的编写与执行。它不仅支持简单的单元测试,还能进行更复杂的测试,如数据驱动的测试、并发测试等。pytest 支持自动化发现测试、丰富的断言和灵活的插件机制,深受开发者和测试人员的喜爱。

2. 安装 pytest

要使用 pytest,你首先需要安装它,可以通过 pip 安装:

复制代码
pip install pytest

3. 测试函数与测试类

在 pytest 中,测试函数通常以 test_ 开头,而测试类则是以 Test 开头。这是 pytest 的约定俗成规则。

  • 测试函数 :测试用例应该是普通的 Python 函数,且函数名以 test_ 开头。

    复制代码
    def test_addition():
        assert 1 + 1 == 2
  • 测试类 :如果需要组织多个相关的测试函数,可以使用测试类。测试类中的每个方法也需要以 test_ 开头。

    复制代码
    class TestMath:
        def test_addition(self):
            assert 1 + 1 == 2
    
        def test_subtraction(self):
            assert 2 - 1 == 1

4. 断言 (Assertion)

pytest 使用 Python 的内建 assert 语句来进行断言,而不是像其他测试框架那样使用专门的断言函数。pytest 会在断言失败时提供详细的错误信息,使调试更加容易。

复制代码
def test_addition():
    assert 1 + 1 == 2

当断言失败时,pytest 会显示断言的表达式、实际结果和期望结果,帮助开发者快速定位问题。

5. 测试执行与输出

你可以使用 pytest 命令运行测试。假设你有一个测试文件 test_example.py,可以通过以下命令执行测试:

复制代码
pytest test_example.py

pytest 会自动发现以 test_ 开头的函数并运行它们。默认情况下,pytest 会显示测试的简要输出,显示每个测试是否通过(.)、失败(F)或被跳过(s)。

如果想要更详细的输出,可以使用 -v(verbose)选项:

复制代码
pytest -v test_example.py

6. 测试夹具 (Fixtures)

测试夹具是 pytest 的一大亮点。它们提供了一种在测试执行前准备资源、在测试执行后清理资源的机制。通过 @pytest.fixture 装饰器来定义夹具。

例如,创建一个数据库连接的夹具:

复制代码
import pytest

@pytest.fixture
def db_connection():
    # 假设这是连接数据库的代码
    db = create_database_connection()
    yield db
    db.close()  # 测试结束后关闭数据库连接

在测试函数中,pytest 会自动识别并提供 db_connection 作为参数:

复制代码
def test_query(db_connection):
    result = db_connection.execute("SELECT * FROM users")
    assert len(result) > 0

7. 参数化 (Parametrize)

pytest 支持测试函数的参数化。使用 @pytest.mark.parametrize 装饰器可以自动生成多组测试数据,避免编写重复的测试代码。

例如,测试加法函数:

复制代码
import pytest

@pytest.mark.parametrize("a, b, expected", [
    (1, 1, 2),
    (2, 2, 4),
    (3, 3, 6),
])
def test_add(a, b, expected):
    assert a + b == expected

这样可以一次性运行多组测试,避免重复编写相似的测试代码。

8. 测试跳过与期望失败

  • 跳过测试 :有时你可能需要跳过某个测试,例如在某些条件下(如操作系统版本不符合要求)。可以使用 @pytest.mark.skip@pytest.mark.skipif 来跳过测试。

    复制代码
    @pytest.mark.skip(reason="Test is not relevant for this version")
    def test_old_feature():
        pass
  • 期望失败 :如果你知道某个测试会失败,并且希望 pytest 将其标记为失败而不是引发错误,可以使用 @pytest.mark.xfail

    复制代码
    @pytest.mark.xfail
    def test_buggy_feature():
        assert 1 + 1 == 3

9. 测试插件与扩展

pytest 拥有丰富的插件生态系统,可以扩展框架的功能。例如,pytest-cov 插件可以用来测量测试覆盖率,pytest-django 用于测试 Django 应用,pytest-mock 用于提供更强大的 mock 功能。

安装插件的例子:

复制代码
pip install pytest-cov

使用插件:

复制代码
pytest --cov=my_module test_my_module.py

10. 并行测试

pytest 支持并行执行测试,可以通过插件如 pytest-xdist 来实现。这样能够加快测试执行速度,尤其是在测试用例很多时非常有用。

安装并行插件:

复制代码
pip install pytest-xdist

执行并行测试:

复制代码
pytest -n 4  # 使用4个进程并行执行测试

11. 总结

pytest 是一个非常强大的测试框架,它不仅能够简化单元测试的编写,还支持许多高级功能,如夹具、参数化测试、并行测试等。通过灵活的插件机制,pytest 还能满足各种测试需求。希望这次的讲解能让你更好地理解 pytest,并能在项目中高效地使用它进行自动化测试。

相关推荐
用户27784491049932 小时前
借助DeepSeek智能生成测试用例:从提示词到Excel表格的全流程实践
人工智能·python
JavaEdge在掘金4 小时前
ssl.SSLCertVerificationError报错解决方案
python
我不会编程5554 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
老歌老听老掉牙5 小时前
平面旋转与交线投影夹角计算
python·线性代数·平面·sympy
满怀10155 小时前
Python入门(7):模块
python
无名之逆5 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
你觉得2055 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义下载方法
大数据·人工智能·python·gpt·学习·机器学习·aigc
啊喜拔牙5 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
__lost6 小时前
Pysides6 Python3.10 Qt 画一个时钟
python·qt