写点什么

Pytest 框架与常用操作

  • 2024-11-26
    北京
  • 本文字数:1906 字

    阅读完需:约 6 分钟

全面解析软件测试开发:人工智能测试、自动化测试、性能测试、测试左移、测试右移到DevOps如何驱动持续交付 

Pytest 是 Python 生态中广泛使用的测试框架,以其简洁灵活、功能强大而著称。无论是编写单元测试、集成测试,还是复杂的测试场景,Pytest 都能轻松应对。本文将带你熟悉 Pytest 的框架结构、核心功能以及一些常用操作,帮助你快速上手并高效编写测试用例。

一、Pytest 简介

Pytest 的主要特点包括:

  • 简单易用:只需按照规则命名文件和函数即可快速运行测试。

  • 功能强大:支持参数化、钩子函数、插件扩展等功能。

  • 丰富的社区支持:拥有大量的插件(如 pytest-django、pytest-cov)和活跃的开发者社区

安装 Pytest

pip install pytest
复制代码

安装完成后,通过以下命令验证安装:

pytest --version
复制代码

二、Pytest 的核心概念


  1. 文件和函数命名规范测试文件以 test_ 开头或以 test.py 结尾。测试函数以 test 开头。示例:


# test_example.pydef test_addition():    assert 1 + 1 == 2
复制代码

运行测试:

pytest
复制代码

2. 断言

Pytest 使用 Python 原生的 assert 语句,语法直观,错误信息详细:

def test_subtraction():    assert 5 - 3 == 2    assert 2 - 3 == -1
复制代码

三、Pytest 的常用操作

1. 参数化测试

通过参数化功能,可以用多组数据运行同一个测试函数,提高测试覆盖率:

import pytest
@pytest.mark.parametrize("input,expected", [ (1 + 1, 2), (2 * 3, 6), (5 - 1, 4),])def test_operations(input, expected): assert input == expected
复制代码

运行结果中,每组参数都会生成一个单独的测试用例。

2. 组装和拆解:setup 和 teardown

Pytest 提供 setup_function 和 teardown_function,用于在测试前后执行准备和清理工作:

def setup_function():    print("\nSetup: Before each test case")
def teardown_function(): print("Teardown: After each test case")
def test_example(): assert 1 + 1 == 2
复制代码

如果需要在整个模块的测试前后执行,使用 setup_module 和 teardown_module

def setup_module():    print("\nSetup: Before the module")
def teardown_module(): print("Teardown: After the module")
复制代码

3. 使用 Fixtures

Fixture 是 Pytest 中非常强大的功能,用于共享测试数据或资源,支持灵活的作用域和依赖注入

import pytest
@pytest.fixturedef sample_data(): return {"key": "value"}
def test_fixture_usage(sample_data): assert sample_data["key"] == "value"
复制代码

Fixture 的作用范围:

  • function(默认):每个测试函数都会调用一次。

  • module:模块范围内共享。

  • session:会话范围内共享,适合耗时初始化的资源。

示例:

@pytest.fixture(scope="module")def database_connection():    print("Setting up database connection")    yield "connection"    print("Tearing down database connection")
复制代码

4. 跳过测试与标记

  • 跳过测试:使用 pytest.mark.skip 或 pytest.mark.skipif

import sys
@pytest.mark.skip(reason="Not implemented yet")def test_not_implemented(): pass
@pytest.mark.skipif(sys.version_info < (3, 8), reason="Requires Python 3.8+")def test_python_version(): assert 1 == 1
复制代码

标记测试:对测试用例进行分组:

@pytest.mark.slowdef test_long_running_task():    assert 1 == 1
复制代码

运行指定标记的测试用例:

pytest -m slow
复制代码

5. 生成测试报告

  • 使用插件 pytest-html 生成 HTML 报告:

pip install pytest-htmlpytest --html=report.html
复制代码

使用插件 pytest-cov 生成覆盖率报告:

pip install pytest-covpytest --cov=my_project
复制代码

6. 失败重试

安装 pytest-rerunfailures 插件,在失败时自动重试:

pip install pytest-rerunfailurespytest --reruns 3
复制代码

四、高级技巧与实践

1. 参数化 Fixture

Fixture 可以结合参数化使用,生成多种测试数据:

@pytest.fixture(params=[1, 2, 3])def param_fixture(request):    return request.param
def test_param_fixture(param_fixture): assert param_fixture in [1, 2, 3]
复制代码

2. 测试钩子

Pytest 提供许多钩子函数,可用于自定义测试行为,例如:

# conftest.pydef pytest_runtest_setup(item):    print(f"Running test: {item.name}")
复制代码

五、总结

Pytest 是一个轻量级但功能强大的测试框架,支持从简单的单元测试到复杂的集成测试场景。它的丰富功能,如参数化测试、Fixture、插件扩展等,可以极大提高测试的效率和覆盖率。通过熟悉 Pytest 的常用操作,你可以更高效地构建可靠的测试体系。

希望本文能帮助你快速上手 Pytest!如果你有更多问题或想了解更深入的功能,可以随时交流!


用户头像

社区:ceshiren.com 微信:ceshiren2023 2022-08-29 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料、实事更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬

评论

发布
暂无评论
Pytest 框架与常用操作_测试_测吧(北京)科技有限公司_InfoQ写作社区