写点什么

Pytest 编写自动化测试用例规则

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

    阅读完需:约 7 分钟

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

在自动化测试中,Pytest 是一种强大而灵活的工具,它提供了直观的语法和丰富的功能,可以快速高效地编写测试用例。本文将详细介绍使用 Pytest 编写自动化测试用例的规则和最佳实践,帮助你构建可靠的测试体系。


一、Pytest 测试用例命名规则

Pytest 遵循一定的文件和函数命名规则,以便能够自动识别和运行测试用例。

1. 测试文件命名

测试文件必须以 test_ 开头或 _test.py 结尾。例如:

  • ✅ test_example.py

  • ✅ example_test.py

  • ❌ example.py(不会被识别为测试文件)

2. 测试函数命名

测试函数必须以 test_ 开头。例如:

# test_sample.pydef test_addition():    assert 1 + 1 == 2
def test_subtraction(): assert 5 - 3 == 2
复制代码

二、Pytest 自动化测试的编写规则

1. 每个用例独立

  • 确保每个测试用例可以独立运行,避免测试用例之间的依赖。

  • 共享资源可以通过 Fixture 提供。

示例:

import pytest
@pytest.fixturedef sample_data(): return {"name": "Pytest", "type": "Framework"}
def test_sample_data_name(sample_data): assert sample_data["name"] == "Pytest"
def test_sample_data_type(sample_data): assert sample_data["type"] == "Framework"
复制代码

2. 避免硬编码数据

使用参数化功能提高代码的灵活性和覆盖率:

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

3. 使用断言验证结果

Pytest 支持 Python 原生的 assert 语句,并提供了详细的错误信息。示例:

def test_string_operations():    assert "pytest".upper() == "PYTEST"    assert "PYTEST".lower() == "pytest"
复制代码

对于复杂逻辑,可以使用带提示信息的断言:

def test_list_operations():    result = [1, 2, 3]    assert len(result) == 3, "The list length should be 3"
复制代码

4. 使用 Fixture 提供共享资源

Fixture 是 Pytest 的核心功能之一,用于管理测试的前置条件和共享数据。示例如下:

基本用法

import pytest
@pytest.fixturedef db_connection(): print("Setting up database connection") return {"host": "localhost", "port": 3306}
def test_db_connection(db_connection): assert db_connection["host"] == "localhost"
复制代码

作用范围

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

  • module:模块范围内共享。

  • session:会话范围内共享,适合耗时操作。

@pytest.fixture(scope="module")def expensive_setup():    print("Expensive setup")    return "resource"
复制代码

5. 分组与标记

  • 测试分组:使用 pytest.mark 对测试用例进行标记。例如:

import pytest
@pytest.mark.smokedef test_quick_check(): assert 1 + 1 == 2
@pytest.mark.regressiondef test_full_check(): assert 2 * 3 == 6
复制代码

运行指定分组的测试用例:

pytest -m smoke
复制代码

跳过测试:通过 @pytest.mark.skip 跳过某些测试:

import pytest
@pytest.mark.skip(reason="Feature not implemented")def test_not_ready(): pass
复制代码

条件跳过:通过 @pytest.mark.skipif 基于条件跳过测试:

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

6. 自定义测试数据管理

对于较复杂的测试数据,可以将数据集中存储在 JSON、CSV 等文件中,并在测试中动态加载:

读取 JSON 文件数据

import pytestimport json
@pytest.fixturedef load_test_data(): with open("test_data.json", "r") as file: return json.load(file)
def test_json_data(load_test_data): assert load_test_data["key"] == "value"
复制代码

参数化读取 CSV 文件

import pytestimport csv
def read_csv(file): with open(file) as f: return [row for row in csv.reader(f)]
@pytest.mark.parametrize("input,expected", read_csv("test_data.csv"))def test_csv_data(input, expected): assert int(input) * 2 == int(expected)
复制代码

7. 报告与日志

  • HTML 报告:安装 pytest-html 生成测试报告:

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

覆盖率报告:安装 pytest-cov 生成代码覆盖率

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

8. 配置文件优化测试流程

Pytest 支持通过 pytest.inipyproject.toml 或 setup.cfg 配置文件自定义测试行为。例如:

# pytest.ini[pytest]addopts = -v --html=report.htmlmarkers =    smoke: Quick tests    regression: Comprehensive tests
复制代码

三、最佳实践总结

  1. 命名规范:保持统一的文件、函数命名。

  2. 代码独立性:避免用例之间互相依赖。

  3. 数据驱动:优先使用参数化替代硬编码。

  4. 使用 Fixture:管理测试前置条件,减少重复代码。

  5. 测试分组:通过标记清晰划分测试类型。

  6. 配置优化:利用配置文件统一测试流程。


四、总结 Pytest 的灵活性和强大功能使其成为编写自动化测试的最佳选择之一。通过遵循本文介绍的规则和最佳实践,你可以高效构建自动化测试用例,提升项目的测试质量和效率。希望这篇文章能帮助你更好地使用 Pytest。如果有更多关于 Pytest 的问题,欢迎交流讨论!



用户头像

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

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

评论

发布
暂无评论
Pytest 编写自动化测试用例规则_测试_测吧(北京)科技有限公司_InfoQ写作社区