我的编程空间,编程开发者的网络收藏夹
学习永远不晚

pytest fixtures函数及测试函数的参数化实例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

pytest fixtures函数及测试函数的参数化实例分析

这篇文章主要介绍“pytest fixtures函数及测试函数的参数化实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“pytest fixtures函数及测试函数的参数化实例分析”文章能帮助大家解决问题。

    pytest fixtures测试函数参数化

    Pytest会在以下几个级别启用测试参数化:

    • pytest.fixture(),可以对fixture函数进行参数化。

    • @pytest.mark.parametrize,可以在测试函数或类中定义多组参数和fixture。

    • pytest_generate_tests,可以自定义参数化方案或扩展。

    一、@pytest.mark.parametrize:参数化测试函数

    1. 常规用法

    对测试函数的参数进行参数化,直接使用内置的装饰器pytest.mark.parameterized即可。

    import pytest@pytest.mark.parametrize("test_input,expected", [("3+5", 8), ("2+4", 6), ("6*9", 42)])def test_eval(test_input, expected):    assert eval(test_input) == expected

    从代码里可以看出,在装饰器里定义了三个不同的元组。我们把("test_input,expected", [("3+5", 8), ("2+4", 6), ("6*9", 42)])
    拆开看:

    • "test_input,expected":这个字符串里定义了2个参数,test_input和expected。

    • ("3+5", 8), ("2+4", 6), ("6*9", 42):这里3个元组,没个元组里有2个元素,依次序分别对应test_input和expected。

    • 3个元组外层的[]:列表里就是参数化具体的传参了,因为里面传了3个不同的元组,所以测试函数test_eval会分别执行3次。

    ============================= test session starts =============================platform win32 -- Python 3.9.4, pytest-6.2.3, py-1.10.0, pluggy-0.13.1rootdir: D:\PycharmProjects\wms-api\interface, configfile: pytest.inicollected 3 itemstest_module1.py ..Fdemo\test_module1.py:3 (test_eval[6*9-42])54 != 42Expected :42Actual   :54 <Click to see difference>test_input = '6*9', expected = 42    @pytest.mark.parametrize("test_input,expected", [("3+5", 8), ("2+4", 6), ("6*9", 42)])    def test_eval(test_input, expected):>       assert eval(test_input) == expectedE       AssertionError: assert 54 == 42E        +  where 54 = eval('6*9')test_module1.py:6: AssertionError

    运行结果可以看到最后一次失败了,因为第三次运行测试函数取的参数是 ("6*9", 42),54不等于42,所以断言失败。

    2. 在参数化中标记单个测试实例

    在参数化中标记单个测试实例,比如之前提到过的mark.xfail,这个可以标记测试函数为失败。那么在参数化中,如果想让其中的某个参数运行
    的时候测试失败,就可以这样用:

    import pytest@pytest.mark.parametrize(    "test_input,expected",    [("3+5", 8), ("2+4", 6), pytest.param("6*9", 42, marks=pytest.mark.xfail)],)def test_eval(test_input, expected):    assert eval(test_input) == expected

    运行一下:

    test_module1.py                                                       [100%]======================== 2 passed, 1 xfailed in 0.05s =========================..x
    3. 多个参数化组合,笛卡尔积

    如果在测试函数上加了多个参数化装饰器,那么得到的参数组合是一个笛卡尔积:

    import pytest@pytest.mark.parametrize("x", [0, 1])@pytest.mark.parametrize("y", [2, 3])def test_foo(x, y):    print("\nx:", x)    print("y:", y)

    应该会组合成4组数据x=0/y=2, x=1/y=2, x=0/y=3, 和x=1/y=3,测试函数执行4次:

    test_module1.py .x: 0y: 2.x: 1y: 2.x: 0y: 3.x: 1y: 3                                                     [100%]============================== 4 passed in 0.01s ==============================

    二、用钩子函数pytest_generate_tests example拓展

    如果有些场景需要动态的确定参数或者fixture的使用范围,那么可以使用pytest_generate_tests这个钩子函数,该函数会在收集测试函数时候被调用。

    通过传入的metafunc对象,可以检查请求测试函数的上下文,还可以进一步的调用metafunc.parameterize()来实现参数化。

    举例,有个测试函数需要接受输入的字符串作为参数,而且通过pytest命令行获取到,那么就要编写一个获取参数的fixture函数来给测试函数调用。

    # content of test_strings.pydef test_valid_string(stringinput):    assert stringinput.isalpha()

    新建conftest.py文件,fixture函数写在这里:

    # content of conftest.pydef pytest_addoption(parser):    parser.addoption(        "--stringinput",        action="append",        default=[],        help="list of stringinputs to pass to test functions",    )def pytest_generate_tests(metafunc):    if "stringinput" in metafunc.fixturenames:        metafunc.parametrize("stringinput", metafunc.config.getoption("stringinput"))

    现在用命令行方式来运行这个测试函数:

    pytest -q --stringinput="hello" --stringinput="world" test_strings.py

    会运行2次。

    D:\PycharmProjects\wms-api\interface\demo>pytest -q --stringinput="hello" --stringinput="world" test_strings.py..                                                                                                                                                                     [100%]2 passed in 0.01s

    再换个输入参数,让测试函数失败:

    pytest -q --stringinput="!" test_strings.py

    FAILED test_strings.py::test_valid_string[!] - AssertionError: assert False1 failed in 0.04s

    如果没有字符串输入,那么测试函数它将被跳过。因为metafunc.parameterize()被调用时&#xff0c;传过去的是一个列表:

    pytest -q -rs test_strings.py

    SKIPPED [1] test_strings.py: got empty parameter set ['stringinput'], function test_valid_string at $REGENDOC_TMPDIR/test_strings.py:21 skipped in 0.12s

    注意,在调用metafunc时, 如果使用不同的参数集进行多次参数化,这些参数集上的所有参数名称都不能重复,否则将会报错。

    关于“pytest fixtures函数及测试函数的参数化实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    pytest fixtures函数及测试函数的参数化实例分析

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    pytest fixtures函数及测试函数的参数化实例分析

    这篇文章主要介绍“pytest fixtures函数及测试函数的参数化实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“pytest fixtures函数及测试函数的参数化实例分析”文章能帮助大
    2023-06-30

    Python的pytest参数化实例分析

    今天小编给大家分享一下Python的pytest参数化实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。源代码分析def
    2023-06-26

    pytest如何实现测试用例参数化

    小编给大家分享一下pytest如何实现测试用例参数化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!说明软件测试中,输入相应值,检查期望值,是常见测试方法。在自动化
    2023-06-14

    Python函数参数实例分析

    本文小编为大家详细介绍“Python函数参数实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python函数参数实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.函数参数# 1.位置参数:调用函数
    2023-06-28

    C++函数参数实例分析

    这篇文章主要介绍了C++函数参数实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++函数参数实例分析文章都会有所收获,下面我们一起来看看吧。一、函数参数的默认值C++ 中可以在函数声明时为参数提供一个默
    2023-06-30

    函数参数的示例分析

    这篇文章将为大家详细讲解有关函数参数的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。函数的参数(实参和形参):形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,
    2023-06-15

    Python中函数的参数类型实例分析

    今天小编给大家分享一下Python中函数的参数类型实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、Python的函
    2023-07-02

    C语言函数加里化和偏函数应用实例分析

    今天小编给大家分享一下C语言函数加里化和偏函数应用实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。【名词解释】Curr
    2023-06-17

    C++ 函数调试详解:如何分析函数的输入和输出参数?

    函数调试时,分析输入参数包括:类型匹配、范围、值和边值检查。输出参数分析包含:返回类型验证、指针有效性、引用有效性、值验证等。实战案例演示了如何测试输入和输出参数的有效性,帮助理解代码错误的定位和解决。C++ 函数调试详解:如何分析函数的输
    C++ 函数调试详解:如何分析函数的输入和输出参数?
    2024-05-03

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录