首页 > 其他分享 >pytest实战技巧之参数化应用

pytest实战技巧之参数化应用

时间:2024-07-23 20:55:45浏览次数:16  
标签:实战 技巧 列表 pytest 参数 测试函数 参数值 def

pytest是Python中最流行的测试框架之一。它提供了丰富的功能,可以帮助我们编写高效、可靠的测试用例。其中一个重要的功能就是参数化,

它可以让我们用不同的数据组合来运行同一个测试用例,从而 提高测试覆盖率和效率。本文将介绍pytest参数化的基本用法和一些高级技巧,帮助

读者更好地使用这个功能。

 

 

01 基本用法


pytest参数化的基本用法非常简单,只需要在测试函数上添加一个装饰器@pytest.mark.parametrize, 然后指定参数名称和参数值列表即可。例如,

我们有一个测试函数test_add,用来测试两个数相加的结果是否正确:

def test_add():
assert add(2, 3) == 5
assert add(-1, 1) == 0

现在我们想用多组数据来运行这个测试函数,可以这样做:

import pytest

a, b, expected
   (2, 3, 5),
   (-1, 1, 0),
   (0, 0, 0),
   (100, -100, 0),

])

def test_add(a, b, expected):
    assert add(a, b) == expected

 

这里我们定义了一个参数化装饰器,指定了三个参数名称a、b和expected,以及一个参数值列表,其中每个元素都是一个包含三个值的元组,分别

代表两个数和它们的和。这样,pytest就会根据这个参数值列表,自动运行测试函数四次,每次用一个元组中的数据来替换a、b和expected参数,

然后执行断言操作,最后输出测试结果。

 

 

02 参数化的多种方式


除了上面的方式,pytest还支持多种参数化的方式,可以根据实际情况选择最合适的一种。

  • 参数值列表

我们已经看到了最简单的参数化方式,就是将多组参数值放在一个列表中,然后传给装饰器。这种方式适用于参数比较少、每个参数值都比较独立的情况

如果参数值之间有一定的关联性,或者参数比较 多,就不太适合使用这种方式了。

 

 

  • 参数名称列表

有时我们希望将参数值列表和参数名称列表分开定义,这样可以更清晰地表达参数之间的关系。例如, 我们有一个函数用来测试字符串是否包含某个子串,

可以这样写:

@pytest.mark.parametrize("s, sub, expected", [
   ("hello world", "hello", True),
   ("hello world", "world", True),
   ("hello world", "python", False),

])

def test_contains(s, sub, expected):
    assert (sub in s) == expected

这里我们将参数名称s、sub和expected分别和参数值列表中的元组对应起来,这样就可以更直观地理解 每个参数的含义。

注意:参数名称列表也可以是一个字符串,多个参数名称之间用逗号隔开,例如:"a, b, expected"。

 

 

  • 参数化装饰器嵌套

有时我们需要对多个参数进行组合,这时可以使用参数化装饰器的嵌套。例如,我们有一个函数用来测试两个字符串连接后的结果是否正确,可以这样写:

 

@pytest.mark.parametrize("s1", ["hello", "world"])
@pytest.mark.parametrize("s2", ["python", "pytest"])

def test_concat(s1, s2):
    assert concat(s1, s2) == s1 + s2

这里我们先用一个参数化装饰器指定s1参数的取值范围,然后在这个装饰器内部再嵌套一个参数化装饰器,指定s2参数的取值范围。这样,pytest就会自动

运行测试函数四次,每次用一个s1和一个s2的组合 来测试函数的正确性。

 

  • 参数化函数

有时我们需要动态生成参数值列表,这时可以使用参数化函数。例如,我们有一个函数用来测试一个整数是否为质数,可以这样写:

def is_prime(n):
    if n < 2:
       return False

    for i in range(2, int(n ** 0.5) + 1):
       if n % i == 0:
          return False
    return True



@pytest.mark.parametrize("n", range(10))
def test_is_prime(n):
    assert is_prime(n) == (n in [2, 3, 5, 7])

 

这里我们使用了Python内置的range函数来生成一个整数序列,然后将这个序列作为参数值列表传给了参数化装饰器。这样,pytest就会自动运行测试函数

十次,每次用一个整数来测试函数的正确性。

 

  • 从文件读取参数

有时我们需要从外部文件中读取参数值列表,这时可以使用pytest的fixture机制。例如,我们有一个CSV文件,包含了多组数据,每组数据都是一个整数和一个

字符串,用逗号隔开。我们希望用这些数据 来测试一个函数,可以这样写:

import csv

import pytest


@pytest.fixture(scope="module")
def data():
    with open("test_data.csv") as f:
       reader = csv.reader(f)
       return list(reader)


@pytest.mark.parametrize("n, s", data())
    assert func(n, s) == ...

 

这里我们定义了一个fixture函数data,用来读取CSV文件中的数据,并返回一个列表,每个元素都是一 个包含两个值的元组。然后在测试函数的参数化装饰器中,

使用data()来获取这个列表,并将其中的元 组分别赋值给n和s两个参数。这样,pytest就会自动运行测试函数多次,每次用一个元组中的数据来测 试函数的正确性。

 

 

03 参数化的高级技巧
除了上面介绍的基本用法和多种方式,pytest参数化还有一些高级技巧,可以帮助我们更灵活地使用这个功能。

  • 动态生成参数名称

有时我们需要动态生成参数名称,例如根据参数值来生成一个唯一的标识符。这时可以使用pytest的ids 参数,它可以指定每个参数值对应的参数名称。例如,我们

有一个函数用来测试两个字符串连接后的长度是否正确,可以这样写:

@pytest.mark.parametrize("s1, s2, expected", [
    ("hello", "world", 10),
    ("pytest", "is awesome", 15),
], ids=["case1", "case2"])

def test_len(s1, s2, expected):
    assert len(concat(s1, s2)) == expected

这里我们使用了ids参数,将每个参数值对应的参数名称指定为了一个字符串,分别 是"case1"和"case2"。这样,pytest就会在测试结果中显示这些参数名称,方便

我们查看和分析测试结果。

 

  • 参数化的组合

有时我们需要对多个参数进行组合,例如测试一个函数在不同参数组合下的正确性。这时可以使用pytest的product参数化,它可以将多个参数值列表进行组合,生成

所有可能的参数组合。

例如,我们有一个函数用来测试两个整数相乘的结果是否正确,可以这样写:

@pytest.mark.parametrize("a", [1, 2, 3]) @pytest.mark.parametrize("b", [4, 5, 6])
def test_mul(a, b):
    assert mul(a, b) == a * b

@pytest.mark.parametrize("a, b", product([1, 2, 3], [4, 5, 6]))
def test_mul2(a, b):

这里我们先用两个参数化装饰器分别指定a和b的取值范围,然后在测试函数中用a和b的乘积来进行断 言。这样,pytest就会自动运行测试函数九次,每次用一个a和

一个b的组合来测试函数的正确性。另 外,我们还可以使用product函数来完成同样的功能,它可以将多个参数值列表进行组合,并返回所有可能的参数组合。

 

  • 动态生成参数化装饰器

有时我们需要根据某些条件动态生成参数化装饰器,例如根据某个配置文件中的参数来决定测试函数的参数取值范围。这时可以使用pytest的fixture机制,动态生成

参数化装饰器。

例如,我们有一个配置文件,包含了两个参数s和n,分别表示一个字符串和一个整数,我们希望用这些参数来测试一个函数,可 以这样写:

import yaml
import pytest


@pytest.fixture(scope="module")
def config():
    with open("test_config.yaml") as f:
         return yaml.safe_load(f)

@pytest.fixture(scope="module")
    def params(config):
        return [(s, n) for s in config["strings"] for n in config["numbers"]]

def test_func(params):
    for s, n in params:
        assert funcs, n...

这里我们定义了两个fixture函数,config和params。

  • config用来读取配置文件中的参数
  • params用来根据这些参数动态生成参数值列表

然后在测试函数中,使用params来获取参数值列表,并将其中的元 组分别赋值给s和n两个参数。这样,pytest就会自动运行测试函数多次,每次用一个元组中的数据

来测试函数的正确性。

 

 

04 总结
本文介绍了pytest参数化的基本用法和多种方式,帮助读者更好地使用这个功能。同时,还介绍了一些高级技巧,如动态生成参数名称、参数化的组合和动态生成参数化

装饰器,帮助读者更灵活地使用参数 化。通过学习本文,读者可以更好地理解pytest参数化的原理和用法,从而编写更高效、可靠的测试用例。

 

标签:实战,技巧,列表,pytest,参数,测试函数,参数值,def
From: https://www.cnblogs.com/zhuuque23/p/18319627

相关文章

  • 计算机编程—IT实战课堂 Springboot 电竞兴趣论坛系统
    计算机编程—IT实战课堂:Springboot电竞兴趣论坛系统随着电子竞技行业的迅猛发展,电竞爱好者对于交流平台的需求日益增长。结合IT实战课堂的教学实践,我们利用SpringBoot框架开发了一款集讨论、资源共享、赛事追踪于一体的电竞兴趣论坛系统。本文将深入探讨该项目的构思背景、......
  • 计算机作业—IT实战营 核酸检测管理系统
    计算机作业—IT实战营:核酸检测管理系统设计与实现在疫情防控常态化的今天,高效、准确的核酸检测管理系统成为了保障公共卫生安全的重要一环。本篇博客将详细介绍一个基于IT实战营项目的核酸检测管理系统,涵盖系统的设计思路、关键技术选型、核心功能模块,以及实战训练中的教育意......
  • 计算机项目设计—IT实战课堂 个人医疗健康管理平台小程序
    计算机项目设计—IT实战课堂:个人医疗健康管理平台小程序在数字化时代背景下,个人健康管理成为公众日益关注的焦点。结合IT实战课程,我们设计并实现了一款基于微信小程序的个人医疗健康管理平台,旨在为用户提供便捷的健康数据记录、医疗咨询、预约挂号及日常健康提醒服务。本文将......
  • [solon]Solon开发实战之权限认证
    本项目采用权限认证框架sa-token(sa-token-solon-plugin)pom.xml<!--鉴权--><dependency><groupId>org.noear</groupId><artifactId>sa-token-solon-plugin</artifactId></dependency>配置#sa-token配置sa-token:#to......
  • SpringBoot实战:Spring Boot接入Security权限认证服务
    引言SpringSecurity 是一个功能强大且高度可定制的身份验证和访问控制的框架,提供了完善的认证机制和方法级的授权功能,是一个非常优秀的权限管理框架。其核心是一组过滤器链,不同的功能经由不同的过滤器。本文将通过一个案例将 SpringSecurity 整合到 SpringBoot中,要实......
  • 直播预约丨《袋鼠云大数据实操指南》No.4:数据服务API实战解读,助力企业数字化跃迁
    近年来,新质生产力、数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮,持续冲击并革新着企业数字化转型的观念视野,昭示着一个以数据为核心驱动力的新时代正稳步启幕。面对这些引领经济转型的新兴概念,为了更好地服务于客户并提供切实可行的实践指导,自3月20日起,袋鼠云将推出全新......
  • IT实战课堂计算机毕业设计源码精品基于springboot的线上辅导班系统的开发与设计
    项目功能简介:《[含文档+PPT+源码等]精品基于springboot的线上辅导班系统的开发与设计[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功以及课程答疑与微信售后交流群、送查重系统不限次数免费查重等福利!软件开发环境及开......
  • 大模型实战—你的个人AI数字大脑Khoj
    Khoj是你的开源个人AI伴侣,提供即时答案。Khoj轻松地深入知识,简化复杂信息,整合你的个人背景,并根据你的独特需求量身定制响应。在线问题:如果你有一个问题需要从互联网获取最新的信息,Khoj可以进行在线搜索,找到相关答案。例如,查询当前的天气情况或某个新闻事件的最新动态。......
  • Golang异步编程方式和技巧
    Golang异步编程方式和技巧原创 腾讯程序员 腾讯技术工程  2024年04月23日18:00 广东 12人听过Golang基于多线程、协程实现,与生俱来适合异步编程,当我们遇到那种需要批量处理且耗时的操作时,传统的线性执行就显得吃力,这时就会想到异步并行处理。下面介绍一些异步......
  • 【前端】JavaScript入门及实战91-95
    文章目录91DOM92事件93文档的加载94DOM查询(1)95图片切换的练习91DOM<!DOCTYPEhtml><html><head><title></title><metacharset="utf-8"><style></style></head><body> <buttonid="btn&quo......