Skip to content

关于pytest框架里的分布式运行xdist,无法获取总用例数量

问题

使用 pytest 钩子函数获取用例总数 sum 时,当不使用分布式执行时 sum 不为 0,使用分布式时为 0

def pytest_terminal_summary(terminalreporter, exitstatus, config):
    total_case = terminalreporter._numcollected

原因

  • xdist 分布式类似于一主多从的结构,master 机负责下发命令,控制 slave 机,slave 机根据 master 机的命令执行特定测试任务
  • 在 xdist 中,主是 master,从是 workers
  • xdist 会产生一个或多个 workers,workers 都通过 master 来控制
  • 每个 worker 负责执行完整的测试用例集,然后按照 master 的要求运行测试,而 master 机不执行测试任务

作为主机的 master 是不会收集任何用例,都是交由 worker 进行收集,然后 master 只获取用例 id 列表。所以主进程中使用钩子函数中的属性_numcollected 收集到的用例为 0

def pytest_terminal_summary(terminalreporter, exitstatus, config):
    total_case = terminalreporter._numcollected

解决

如果通过线程函数将多个子进程获取的用例数量返回,则有些麻烦,可以使用terminalreporter.stats里的各项数据进行人工统计,便能更方便获取用例总数

原文链接