首页 > 编程问答 >如何在 pytest 的参数化中传递函数名称以及如何在测试用例中使用它?

如何在 pytest 的参数化中传递函数名称以及如何在测试用例中使用它?

时间:2024-07-31 04:36:08浏览次数:13  
标签:python pytest parameterized parameterized-unit-test parametrize

在下面的脚本中,我想参数化函数调用 RegisterClientCabinMovementDetection(x) 和 RegisterClientOccupantInSeatDetection(x) (在脚本中以粗体显示)等等...有没有办法在 pytest 中参数化函数?

@pytest.mark.asyncio @pytest.mark.parametrize('Qf,预期',[(UNDEFINED,"无效"),(INPROGRESS,"进行中"),(未指定,"NotOk"),(DATAOK,"DataOK")]) @pytest.mark.parametrize('检测,expected_Detection',[(UNDEFINED,"未定义"),(NOTDETECTED,"未检测到"),(DETECTED,"检测到")]) @pytest.mark.parametrize('AvailabilityStatus,expected_availablity',[(UNDEFINED,"未定义"),(NOTAVAILABLE,"不可用"),(AVAILABLE,"可用"),(FAULT,"故障"),(POSITIONNOTPRESENT,"位置不存在")]) 异步def test_occupant_presence(snok,Qf,预期,检测,expected_Detection,可用性状态,expected_availability): """在驾驶员可用的情况下测试乘员存在状况的功能""" #设置 ocupant_presence_mock = snok.get_service(“ocupant_presence_hal”) accupant_presence_service = snok.get_service("OccupantPresenceProvider") #行为 等待 occupant_presence_service。 RegisterClientCabinMovementDetection(0) #await occupant_presence_service。 RegisterClientOccupantInSeatDetection(0) snok.async_sleep(1) Seat_sensor_status = driver_not_Detected_in_seat(占用者_存在_模拟,Qf,检测,可用性状态) 等待 occupant_presence.set_DriverSeatCabinMovementDetection(seat_sensor_status) snok.async_sleep(1) 响应=等待 occupant_presence_service.get_DriverSeatCabinMovementDetection() #response = 等待 habitant_presence_service.get_DriverSeatOccupantInSeatDetection() 响应质量因子=str(响应.质量因子) 质量因子值 = 响应质量因子.split('.') 存在检测值= str(response.存在检测).split('.') detector_status_value = str(response. detector_status).split('.') #断言 断言quality_factor_value[1] ==预期 断言存在_检测_值[1] ==预期_检测 断言 detector_status_value[1] == Expected_availability

无法参数化函数调用,因此代码会变得更大。有没有办法在 pytest 中使用参数化函数来减少代码行数?


可以使用 pytest.mark.parametrize 将函数名称作为字符串传递,然后在测试函数中使用 getattr() 函数调用相应的函数。

以下是修改后的代码示例:

import pytest

@pytest.mark.asyncio
@pytest.mark.parametrize('Qf, expected', [(UNDEFINED, "Invalid"), (INPROGRESS, "InProgress"), (UNSPECIFIED, "NotOk"), (DATAOK, "DataOK")])
@pytest.mark.parametrize('Detection, expected_Detection', [(UNDEFINED, "Undefined"), (NOTDETECTED, "NotDetected"), (DETECTED, "Detected")])
@pytest.mark.parametrize('AvailabilityStatus, expected_availability', [(UNDEFINED, "Undefined"), (NOTAVAILABLE, "NotAvailable"), (AVAILABLE, "Available"), (FAULT, "Fault"), (POSITIONNOTPRESENT, "PositionNotPresent")])
@pytest.mark.parametrize('function_name', ['RegisterClientCabinMovementDetection', 'RegisterClientOccupantInSeatDetection'])
async def test_occupant_presence(snok, Qf, expected, Detection, expected_Detection, AvailabilityStatus, expected_availability, function_name):
    """在驾驶员可用的情况下测试乘员存在状况的功能"""
    # 设置
    ocupant_presence_mock = snok.get_service("ocupant_presence_hal")
    occupant_presence_service = snok.get_service("OccupantPresenceProvider")

    # 行为
    await occupant_presence_service

    # 使用 getattr() 函数调用相应的函数
    func = getattr(occupant_presence_service, function_name)
    await func(0)

    snok.async_sleep(1)
    Seat_sensor_status = driver_not_Detected_in_seat(ocupant_presence_mock, Qf, Detection, AvailabilityStatus)
    await occupant_presence_service.set_DriverSeatCabinMovementDetection(seat_sensor_status)
    snok.async_sleep(1)

    if function_name == 'RegisterClientCabinMovementDetection':
        response = await occupant_presence_service.get_DriverSeatCabinMovementDetection()
    else:
        response = await occupant_presence_service.get_DriverSeatOccupantInSeatDetection()

    quality_factor_value = str(response.QualityFactor).split('.')
    presence_detection_value = str(response.PresenceDetection).split('.')
    detector_status_value = str(response.DetectorStatus).split('.')

    # 断言
    assert quality_factor_value[1] == expected
    assert presence_detection_value[1] == expected_Detection
    assert detector_status_value[1] == expected_availability

在这个修改后的代码中:

  1. 我们添加了一个新的 pytest.mark.parametrize 装饰器来传递函数名称字符串列表: ['RegisterClientCabinMovementDetection', 'RegisterClientOccupantInSeatDetection']

  2. 在测试函数中,我们使用 getattr(occupant_presence_service, function_name) 获取要调用的函数对象。

  3. 使用 await func(0) 调用获取的函数对象。

  4. 我们根据 function_name 的值调用不同的获取响应函数。

这样,就可以使用单个测试函数测试不同的函数调用,从而减少代码重复。

标签:python,pytest,parameterized,parameterized-unit-test,parametrize
From: 76182709

相关文章

  • python函数:带星号的参数一个接一个
    我想知道为什么定义以下函数被认为是好的。deffoo(*x,y):pass据我所知,现在有调用此函数的方法,因为它总是缺少y的值。(如果我错了,请纠正我。)这有什么我不知道的用处吗?你说得对,在Python中定义一个像deffoo(*x,y):...这样的函数,在试图以常规方......
  • 基于遗传(GA)、粒子群(PSO)、模拟退火(SA)、禁忌搜索(ST)、蚁群算法(ACO)、自自组织神
        ......
  • 10个append()函数在Python程序开发中的创新应用
    文末赠免费精品编程资料~~在Python编程的世界里,append()函数是列表操作中最常见的方法之一。它允许我们在列表的末尾添加一个元素,这一简单的功能却能激发无限的创造力。今天,我们将探讨append()函数在Python程序开发中的10种创新应用,从基本用法到高级技巧,逐步深入。1.构......
  • 全网最适合入门的面向对象编程教程:28 类和对象的Python实现-Python编程原则、哲学和规
    全网最适合入门的面向对象编程教程:28类和对象的Python实现-Python编程原则、哲学和规范大汇总摘要:本文主要介绍了在使用Python进行面向对象编程时,Python异常处理的原则-“请求谅解,而非许可”,以及软件设计和Python的编程原则,同时介绍了PEP8规范。原文链接:FreakStud......
  • python生成器
    一前言环境:python3.10win10二生成器1关于生成器先看一个例子    定义了一个函数,当我们运行该函数时,并未像普通函数那样执行函数体内的代码    从其中的英文可知,执行函数得到了一个生成器对象,这个生成器对象也叫做generatoriterator(生成器迭代器),generatorit......
  • 生成MySQL-oracle-SQL server数据字典(附Python代码)
    生成数据字典,早年写的,请注意新的版本变化。(1)MySQL元数据SQLUSEinformation_schema;#取出库和表。select  TABLE_SCHEMAAS'数据库名称',  TABLE_NAMEAS'表名',  TABLE_TYPEAS'表类型',  ROW_FORMATAS'行格式',  ENGINEAS'数据库引擎',  TABL......
  • Python - Method Resolution Order (MRO)
    TheorderinwhichPythonsearchesforattributesinbaseclassesiscalledmethodresolutionorder(MRO).Itgivesalinearizedpathforaninheritancestructure.PythoncomputesanMROforeveryclassinthehierarchy;thisMROiscomputedusingthe‘C3......
  • 计算机毕业设计选题推荐-零食批发商仓库管理系统-Java/Python项目实战
    ✨作者主页:IT研究室✨个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。☑文末获取源码☑精彩专栏推荐⬇⬇⬇Java项目Python项目安卓项目微信小程序项目......
  • 【自动化测试必学语言】python:语言基础
    目录Python介绍语言的分类注释单行注释多行注释变量定义变量使用变量变量名的命名规范数据类型数字类型非数字类型type()函数input输入print输出格式化输出快捷键(小操作)运算符算术运算符 比较运算符Python介绍作者:吉多·范罗苏姆(Guidov......
  • Python基础知识笔记——常用函数
    一、range()函数range()函数用于生成一个整数序列。它通常用于循环结构中,例如for循环,以提供循环的迭代次数。range()函数可以有1到3个参数。#range(start,stop,step)range(2,6,2)#生成从2开始,到6结束(不包括6),步长为2的一串数字#参数指定不完全时,默认从0开始,步长......