• Pytest教程:Pytest参数化测试


    Pytest参数化测试是指使用Pytest框架中的参数化功能来多次运行同一个测试函数,但使用不同的输入数据。这使得可以轻松地测试同一个函数在多组输入下的行为,并生成清晰的测试报告。

    通过参数化测试,可以避免编写大量重复的测试代码,同时覆盖更多的测试场景,包括边界值测试、错误处理测试等。参数化测试的基本思想是将测试数据与测试逻辑分离,使得测试用例更加灵活、易于维护。

    在Pytest中,参数化测试通常使用@pytest.mark.parametrize装饰器来实现。该装饰器允许你为测试函数提供多组参数,每组参数都会作为独立的测试用例来执行。这样,你就可以在一次测试运行中覆盖多种情况,而不需要编写大量的重复代码。

    除了直接在装饰器中提供参数化的数据外,还可以从列表、元组、字典或外部数据文件中获取参数化的数据。这使得参数化测试非常灵活,并适用于各种测试场景。

    1. 参数化测试的基本用法

    1.1 使用 @pytest.mark.parametrize 装饰器

    Pytest 提供了 @pytest.mark.parametrize 装饰器来实现参数化测试。你可以将测试函数标记为参数化,并为每组参数提供一个列表或元组。

    1. import pytest
    2. @pytest.mark.parametrize("input1, input2, expected", [
    3. (2, 3, 5),
    4. (4, 5, 9),
    5. (10, 20, 30)
    6. ])
    7. def test_addition(input1, input2, expected):
    8. result = input1 + input2
    9. assert result == expected

     

    在上面的示例中,test_addition 函数被 @pytest.mark.parametrize 装饰器标记为参数化测试,参数化的数据以元组的形式传递给装饰器。每个元组表示一组参数,其中 input1input2 是输入参数,expected 是期望的输出结果。

    1.2 运行参数化测试

    当你运行上述的参数化测试时,Pytest 会为每组参数生成一个独立的测试用例,并执行测试函数。测试结果将在测试报告中显示。

    2. 多种参数数据来源示例

    除了直接在装饰器中提供参数化的数据,还可以从多种数据来源中获取参数化的数据。下面是几个常见的示例:

    2.1 从列表或元组中获取参数化数据

    你可以从列表或元组中获取参数化的数据。例如,下面的示例从一个列表中获取参数化的数据:

    1. import pytest
    2. data = [
    3. (2, 3, 5),
    4. (4, 5, 9),
    5. (10, 20, 30)
    6. ]
    7. @pytest.mark.parametrize("input1, input2, expected", data)
    8. def test_addition(input1, input2, expected):
    9. result = input1 + input2
    10. assert result == expected
    2.2 从字典中获取参数化数据

    你还可以从字典中获取参数化的数据。例如,下面的示例从一个字典中获取参数化的数据:

    1. import pytest
    2. data = [
    3. {"input1": 2, "input2": 3, "expected": 5},
    4. {"input1": 4, "input2": 5, "expected": 9},
    5. {"input1": 10, "input2": 20, "expected": 30}
    6. ]
    7. @pytest.mark.parametrize("input1, input2, expected", [pytest.param(**params) for params in data])
    8. def test_addition(input1, input2, expected):
    9. result = input1 + input2
    10. assert result == expected
    2.3 从外部数据文件中获取参数化数据

    如果参数化的数据量较大,可以将数据存储在外部文件中,然后在测试函数中读取并使用。例如,下面的示例从一个 CSV 文件中获取参数化的数据:

    1. import csv
    2. import pytest
    3. def read_csv_data(file_path):
    4. with open(file_path, 'r') as file:
    5. csv_reader = csv.reader(file)
    6. next(csv_reader) # 跳过标题行
    7. data = [(int(row[0]), int(row[1]), int(row[2])) for row in csv_reader]
    8. return data
    9. data = read_csv_data('data.csv')
    10. @pytest.mark.parametrize("input1, input2, expected", data)
    11. def test_addition(input1, input2, expected):
    12. result = input1 + input2
    13. assert result == expected

    在上述示例中,我们定义了一个 read_csv_data 函数来读取 CSV 文件中的数据,并返回一个包含参数化数据的列表。

    3. 参数化测试的深度分析

    参数化测试在自动化测试中非常有用,因为它可以用较少的代码覆盖更多的测试场景。以下是一些你可能会遇到的用例场景以及如何使用参数化测试解决它们的示例:

    3.1 边界值测试

    边界值测试是一种测试方法,用于测试一个函数或系统在输入参数接近最小或最大边界时的行为。通过使用参数化测试,你可以方便地测试各种边界值情况。

    1. import pytest
    2. @pytest.mark.parametrize("value", [
    3. 0,
    4. 1,
    5. 9999,
    6. 10000
    7. ])
    8. def test_boundary(value):
    9. assert value >= 0 and value <= 10000
    3.2 错误处理测试

    你可以使用参数化测试来测试函数或系统在不同错误处理情况下的行为。例如,下面的示例测试一个除法函数在除数为零时的行为。

    1. import pytest
    2. @pytest.mark.parametrize("numerator, denominator", [
    3. (10, 2),
    4. (100, 5),
    5. (50, 0)
    6. ])
    7. def test_division(numerator, denominator):
    8. if denominator == 0:
    9. with pytest.raises(ZeroDivisionError):
    10. result = numerator / denominator
    11. else:
    12. result = numerator / denominator
    13. assert result == numerator / denominator

    在上述示例中,我们使用 pytest.raises 上下文管理器来捕获除数为零时引发的异常。


    通过参数化测试,你可以用不同的参数运行同一个测试函数,并生成清晰的测试报告。你可以从列表、元组、字典或外部数据文件中获取参数化的数据。此外,你还可以使用参数化测试来解决边界值测试和错误处理测试等各种用例场景,希望本文能对你有所帮助,欢迎关注、私信交流。

  • 相关阅读:
    第8章 如何启动和推广 Micro SaaS 应用程序
    【ARKUI】HarmonyOS 如何设置桌面壁纸
    MQTT服务采用nginx 代理TLS配置
    面试官:什么是JIT、逃逸分析、锁消除、栈上分配和标量替换?
    2022下半年教资已经开始注册,1分钟看懂证件照审核要求
    docker Desktop开启远程访问端口
    如何在opensuse build service (obs)打包deb包用于分发各个发行版
    02-1解析xpath
    docker容器技术实战-4
    《RO 仙境传说》 Game Jam 获奖名单公布!
  • 原文地址:https://blog.csdn.net/weixin_40025666/article/details/136503148