首页 > 编程语言 >python pytest 参数化的几种方式

python pytest 参数化的几种方式

时间:2023-07-03 15:35:17浏览次数:64  
标签:parametrize num 示例 python 几种 pytest 参数 data

在pytest框架中,可以使用多种方式进行参数化测试。以下是一些常见的参数化方式及其示例:

  1. 使用@pytest.mark.parametrize装饰器:可以使用pytest提供的@pytest.mark.parametrize装饰器来指定参数化测试的参数。下面是一个示例:
    import pytest
    
    @pytest.mark.parametrize("num, expected", [
        (1, 1),
        (2, 4),
        (3, 9)
    ])
    def test_square(num, expected):
        assert num ** 2 == expected

    在上面的示例中,通过给@pytest.mark.parametrize装饰器传递参数列表,每个参数列表都是一个参数化测试的参数组合。每个参数组合都会作为单独的测试用例执行。

  2. 使用pytest.fixture装饰器:可以使用pytest.fixture装饰器创建一个可以在测试函数中使用的参数化fixture。下面是一个示例:
    import pytest
    
    @pytest.fixture(params=[1, 2, 3])
    def num(request):
        return request.param
    
    def test_square(num):
        assert num ** 2 == num * num

    在上面的示例中,使用@pytest.fixture装饰器创建了一个名为num的参数化fixture。通过在测试函数的参数中引用该fixture,每个参数组合都会作为单独的测试用例执行。

  3. 使用pytest_generate_tests钩子函数:可以使用pytest的钩子函数pytest_generate_tests来自定义参数化测试的生成方式。下面是一个示例:
    import pytest
    
    def pytest_generate_tests(metafunc):
        if 'num' in metafunc.fixturenames:
            metafunc.parametrize('num', [1, 2, 3])
    
    def test_square(num):
        assert num ** 2 == num * num

    在上面的示例中,定义了一个pytest_generate_tests钩子函数,通过判断测试函数的参数是否存在来进行参数化。每个参数组合都会作为单独的测试用例执行。

  4. 使用pytest-data库:pytest-data是一个用于参数化测试的扩展库,可以通过加载外部数据文件来提供参数化测试的数据。以下是一个示例:

    import pytest
    from pytest_data import data
    
    @pytest.mark.datafiles('test_data.csv')
    def test_addition(datafiles):
        data_file = datafiles / 'test_data.csv'
        for row in data(data_file):
            num1 = row['num1']
            num2 = row['num2']
            expected = row['expected']
            assert num1 + num2 == expected

    在上面的示例中,使用pytest-data库的data装饰器加载了一个CSV文件作为测试数据,并在测试函数中使用了这些数据进行参数化测试。

  5. 使用CSV或Excel文件:如果希望使用CSV或Excel文件作为测试数据进行参数化,可以使用Python的csv或openpyxl库来读取文件并生成参数组合。以下是一个示例:
    import pytest
    import csv
    
    def read_csv(file_path):
        with open(file_path, 'r') as csv_file:
            csv_reader = csv.DictReader(csv_file)
            for row in csv_reader:
                yield row
    
    @pytest.mark.parametrize("data", read_csv("test_data.csv"))
    def test_multiply(data):
        num1 = int(data['num1'])
        num2 = int(data['num2'])
        expected = int(data['expected'])
        assert num1 * num2 == expected

    在上面的示例中,通过read_csv函数读取CSV文件的每一行作为参数组合,并使用@pytest.mark.parametrize装饰器进行参数化测试。

  6. 使用pytest.mark.parametrize装饰器嵌套:可以使用pytest.mark.parametrize装饰器嵌套来进行多个参数的组合。示例如下:
    import pytest
    
    @pytest.mark.parametrize("num", [1, 2])
    @pytest.mark.parametrize("operation", ["add", "subtract"])
    def test_calculator(num, operation):
        if operation == "add":
            result = num + num
            assert result == 2 * num
        elif operation == "subtract":
            result = num - num
            assert result == 0

    在上面的示例中,使用了两个参数化装饰器,分别对num和operation进行参数化。每个参数化装饰器中的参数都会进行组合,生成不同的测试用例。

  7. 使用自定义参数化装饰器:除了pytest提供的装饰器,还可以自定义参数化装饰器来实现特定的参数化方式。示例如下
    import pytest
    
    def custom_parametrize(*args):
        def decorator(func):
            for arg in args:
                func = pytest.mark.parametrize(*arg)(func)
            return func
        return decorator
    
    @custom_parametrize(
        ("num", [1, 2, 3]),
        ("operation", ["add", "subtract"])
    )
    def test_calculator(num, operation):
        if operation == "add":
            result = num + num
            assert result == 2 * num
        elif operation == "subtract":
            result = num - num
            assert result == 0

    在上面的示例中,定义了一个自定义的参数化装饰器custom_parametrize,接受一系列参数化参数,并将其应用于测试函数。使用自定义装饰器可以实现更复杂的参数化逻辑。

标签:parametrize,num,示例,python,几种,pytest,参数,data
From: https://www.cnblogs.com/yund/p/17522998.html

相关文章

  • Python 转 Byte
    Python转Byte:详细介绍Python是流行的编程语言之一,拥有广泛的用途。在Python中,我们经常需要将数据从一种格式转换为另一种格式。其中一个转换的方式是将Python对象转换为字节数据,或者反过来。这篇文章将深入介绍Python转换为字节数据。什么是Byte?在计算机科学中,字......
  • python pytest框架文件结构
    pytest框架的文件结构相对灵活,没有强制要求特定的文件结构。然而,以下是一种常见的pytest框架文件结构示例:测试文件:测试文件是编写测试用例的主要部分,通常以test_开头,并以.py为扩展名。例如,test_example.py。测试函数:在测试文件中,测试用例通常以函数的形式存在。测试函数的命......
  • 关于python 跨域处理方式详解
    关于Python跨域处理方式详解跨域是指在浏览器中,一个网页的脚本试图访问另一个网页的脚本时,由于浏览器的同源策略,会出现跨域问题。Python作为一种常用的后端语言,也需要处理跨域问题。本文将详细讲解Python跨域处理的方式。什么是跨域在浏览器中,同源策略是一种安全机制,它限制了一......
  • Python错误:selenium自带click方法点击不到元素
    问题描述:selenium自带click方法,有的时候不好用,元素定位到了,但是就是点不上。 解决办法:原因分析:点击不到元素!解决办法:(1).selenium自带的click()方法:fromseleniumimportwebdriverel=driver.find_element(By.ID,ID)#找到元素el.click()#执行点击缺陷:不稳定......
  • python 实现 ctrl + 左键 单击刷新网页
    importsysfrompywinauto.applicationimportApplicationimportmouseimportkeyboardimporttimeclassApp(object):def__init__(self,pid):app=Application(backend='uia').connect(process=int(pid))self.win=app.top_w......
  • 避坑:.NET内存泄露的几种情况
    内存“泄露”是开发中常见的问题之一,它会导致应用程序占用越来越多的内存资源,最终可能导致系统性能下降甚至崩溃。软件开发者需要了解在程序中出现内存泄露的情况,以避免软件出现该的问题。什么是内存“泄露”?内存泄露是申请了内存空间的变量一直在占用,无法释放。比如申请了一块......
  • [oeasy]python0070_动态类型_静态类型_编译_运行_匈牙利命名法
     动态类型_静态类型回忆上次内容 上次了解了帮助文档的生成开头的三引号注释可以生成帮助文档文档可以写成网页 python3本身也有在线的帮助手册 目前的程序提高了可读性   ​ 添加图片注释,不超......
  • [oeasy]python0070_动态类型_静态类型_编译_运行_匈牙利命名法
    动态类型_静态类型回忆上次内容上次了解了帮助文档的生成开头的三引号注释可以生成帮助文档文档可以写成网页python3本身也有在线的帮助手册目前的程序提高了可读性还有什么方法可以让程序更可读么?......
  • 【转】python踩坑(FileNotFoundError: Could not find module '此处省略了一些路径win_
    1、报错(FileNotFoundError:Couldnotfindmodule'此处省略了一些路径\site-packages\scipy\.libs\libbanded5x.GL5FZ7Y77HIKQFNMZKUOMV5GID6YMX2V.gfortran-win_amd64.dll'(oroneofitsdependencies).Tryusingthefullpathwithconstructorsyntax.) 2、分析&a......
  • C# RichTextBox实现(复制, 剪切,粘贴,全选)的几种方法
    实现该菜单功能主要有两种方法:第一种:通过发送击键到应用程序来实现。先焦点定位到当前活动的RichTextBox,然后再通过发送击键命令来实现操作功能:richTextBox1.Focus();SendKeys.Send("^a");//全选SendKeys.Send("^c");//复制SendKeys.Send("^x");//剪切SendKeys.Send("^v"......