红桃KKHT75:从传奇到新生,一场华丽的蜕变

核心内容摘要

视界无界,感官觉醒:深度解析丝瓜在线视频5app与香蕉视频的影音魅力
突破平庸的底层逻辑:揭秘“66m-66”成长模式,重塑你的核心竞争力

告别单身,从“xxxwww泡妞”开始:解锁魅力密码,遇见那个TA

pytest是Python中最流行的测试框架之一。

它提供了丰富的功能可以帮助我们编写高效、可靠的测试用例。

其中一个重要的功能就是参数化它可以让我们用不同的数据组合来运行同一个测试用例从而 提高测试覆盖率和效率。

本文将介绍pytest参数化的基本用法和一些高级技巧帮助读者更好地使用这个功能。

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

例如我们有一个测试函数test_add用来测试两个数相加的结果是否正确def test_add(): assert add(2,

5 assert add(-1,

0现在我们想用多组数据来运行这个测试函数可以这样做import pytest a, b, expected (2, 3,

, (-1, 1,

, (0, 0,

, (100, -100,

, ]) 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, s

: assert concat(s1, s

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)

: if n % i 0: return False return True pytest.mark.parametrize(n, range(

) 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(scopemodule) 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,

, (pytest, is awesome,

, ], ids[

,

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

) expected这里我们使用了ids参数将每个参数值对应的参数名称指定为了一个字符串分别 是

这样pytest就会在测试结果中显示这些参数名称方便我们查看和分析测试结果。

参数化的组合例如我们有一个函数用来测试两个整数相乘的结果是否正确可以这样写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(scopemodule) def config(): with open(test_config.yaml) as f: return yaml.safe_load(f) pytest.fixture(scopemodule) 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参数化的原理和用法从而编写更高效、可靠的测试用例。

感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走这些资料对于【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴上万个测试工程师们走过最艰难的路程希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

大地资源-大地资源应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123