pytest如何使用@pytest.mark.parametrize()实现参数化

发布时间:2022-10-12 14:55:28 作者:iii
来源:亿速云 阅读:209

pytest如何使用@pytest.mark.parametrize()实现参数化

在编写测试用例时,经常会遇到需要测试多个输入参数的情况。手动为每个参数组合编写单独的测试函数不仅繁琐,而且容易出错。为了解决这个问题,pytest 提供了一个强大的装饰器 @pytest.mark.parametrize(),它允许我们通过参数化的方式轻松地为测试函数提供多组输入数据。

本文将详细介绍如何使用 @pytest.mark.parametrize() 实现参数化测试,并通过示例代码展示其用法。

1. 什么是参数化测试?

参数化测试是一种测试方法,它允许我们使用不同的输入参数多次运行同一个测试函数。通过参数化测试,我们可以避免重复编写相似的测试代码,从而提高测试代码的可维护性和可读性。

2. @pytest.mark.parametrize() 的基本用法

@pytest.mark.parametrize() 是 pytest 提供的一个装饰器,用于实现参数化测试。它的基本语法如下:

@pytest.mark.parametrize(argnames, argvalues)

2.1 单个参数的参数化

假设我们有一个简单的函数 add(),用于计算两个数的和:

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

我们希望测试 add() 函数在不同输入下的行为。可以使用 @pytest.mark.parametrize() 来实现:

import pytest

@pytest.mark.parametrize("a, b, expected", [
    (1, 2, 3),
    (4, 5, 9),
    (-1, 1, 0),
])
def test_add(a, b, expected):
    assert add(a, b) == expected

在这个例子中,argnames"a, b, expected",表示测试函数 test_add() 的三个参数。argvalues 是一个包含多个元组的列表,每个元组表示一组参数值。

运行这个测试时,pytest 会为每组参数值生成一个独立的测试用例,并分别运行 test_add() 函数。

2.2 多个参数的参数化

@pytest.mark.parametrize() 也支持多个参数的参数化。例如,我们可以为 add() 函数分别测试不同的 ab 值:

import pytest

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

在这个例子中,我们使用了两个 @pytest.mark.parametrize() 装饰器,分别对 ab 进行参数化。pytest 会为 ab 的所有组合生成测试用例,并分别运行 test_add_multiple() 函数。

3. 参数化测试的高级用法

3.1 使用 indirect 参数

有时我们希望将参数传递给测试函数的依赖项,而不是直接传递给测试函数本身。这时可以使用 indirect 参数来实现。

假设我们有一个函数 get_user(),它依赖于一个数据库连接:

def get_user(db, user_id):
    return db.query("SELECT * FROM users WHERE id = ?", user_id)

我们希望测试 get_user() 函数在不同 user_id 下的行为。可以使用 indirect 参数将 db 参数传递给测试函数的依赖项:

import pytest

@pytest.fixture
def db():
    return DatabaseConnection()

@pytest.mark.parametrize("user_id, expected", [
    (1, {"id": 1, "name": "Alice"}),
    (2, {"id": 2, "name": "Bob"}),
], indirect=["db"])
def test_get_user(db, user_id, expected):
    assert get_user(db, user_id) == expected

在这个例子中,indirect=["db"] 表示 db 参数将被传递给测试函数的依赖项,而不是直接传递给测试函数本身。

3.2 使用 ids 参数自定义测试用例名称

默认情况下,pytest 会为每个参数化测试用例生成一个唯一的名称。我们可以使用 ids 参数来自定义测试用例的名称。

例如:

import pytest

@pytest.mark.parametrize("a, b, expected", [
    (1, 2, 3),
    (4, 5, 9),
    (-1, 1, 0),
], ids=["positive", "positive_large", "negative"])
def test_add(a, b, expected):
    assert add(a, b) == expected

在这个例子中,ids 参数指定了每个测试用例的名称。运行测试时,pytest 会使用这些名称来标识每个测试用例。

3.3 使用 pytest.param() 指定参数化测试的元数据

pytest.param() 函数允许我们为参数化测试指定额外的元数据,如 marksid

例如:

import pytest

@pytest.mark.parametrize("a, b, expected", [
    pytest.param(1, 2, 3, marks=pytest.mark.skip("Skipping this test")),
    pytest.param(4, 5, 9, id="large_numbers"),
    pytest.param(-1, 1, 0, marks=pytest.mark.xfail),
])
def test_add(a, b, expected):
    assert add(a, b) == expected

在这个例子中,pytest.param() 函数用于指定每个参数化测试的元数据。第一个测试用例被标记为跳过,第二个测试用例使用了自定义的 id,第三个测试用例被标记为预期失败。

4. 总结

@pytest.mark.parametrize() 是 pytest 中一个非常强大的工具,它允许我们通过参数化的方式轻松地为测试函数提供多组输入数据。通过参数化测试,我们可以避免重复编写相似的测试代码,从而提高测试代码的可维护性和可读性。

本文介绍了 @pytest.mark.parametrize() 的基本用法和一些高级用法,包括单个参数的参数化、多个参数的参数化、使用 indirect 参数、自定义测试用例名称以及使用 pytest.param() 指定元数据。希望这些内容能帮助你更好地理解和使用 pytest 的参数化测试功能。

推荐阅读:
  1. Pytest如何快速入门
  2. Pytest安装的详细教程

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

pytest @pytest.mark.parametrize()

上一篇:Python多线程是什么及怎么用

下一篇:Python变量和字符串的知识点有哪些

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》