Python 请教一个 pytest 钩子函数(pytest_generate_tests)问题

🔥🔥🔥 · 2021年03月09日 · 最后由 测试开发体系 回复于 2021年03月10日 · 3683 次阅读

使用并发参数 pytest -n=2 test.py 命令没有任何问题,但是一旦把 a 和 b 值用随机数生成,并发执行用例就会报错,求解?

def pytest_generate_tests(metafunc):
    if metafunc.cls.__name__ == "TestCase":
            datas = metafunc.cls.datas
            func_args = datas[metafunc.function.__name__]
            keys = sorted(func_args[0])
            metafunc.parametrize(keys, [[func_arg[key] for key in keys] for func_arg in func_args])

import random
# a, b = str(random.randint(0, 10000)), str(random.randint(0, 10000))
a, b = 1, 2

class TestCase:
    datas = {
        "test_01": [
            {"cer_name": a, "name": "小明"}
        ],
        "test_02": [
            {"cer_name": b, "name": "小华"}
        ]
    }

    def test_01(self, cer_name, name):
        assert cer_name == 1

    def test_02(self, cer_name, name):
        assert cer_name == 2



共收到 3 条回复 时间 点赞

楼主的实验挺棒,揭示了 pytest 分布式执行用例的一个原理,说下我的理解,有 2 个 worker 会来收集测试,因为你改了生成规则,用随机函数时,会生成 4 个不同 id 的测试,实际上应该是 2 个才对,于是在收集过程中就报错了。pytest 的 each 模式会让每个 worker 执行相同测试,load 模式会根据 worker 负载均衡分配测试,但无论哪种模式,每个 worker 收集到的用例集需要一致。

有办法解决吗?

🔥🔥🔥 回复

让 a, b 的随机函数分别只执行一次,参考下这个:
http://www.zzvips.com/article/137987.html

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册