若是你还想从头学起Pytest,能够看看这个系列的文章哦!html
https://www.cnblogs.com/poloyy/category/1690628.html安全
pytest-xdist分布式测试的原理
前言
- xdist的分布式相似于一主多从的结构,master机负责下发命令,控制slave机;slave机根据master机的命令执行特定测试任务
- 在xdist中,主是master,从是workers
大体原理
- xdist会产生一个或多个workers,workers都经过master来控制
- 每一个worker负责执行完整的测试用例集,而后按照master的要求运行测试,而master机不执行测试任务
pytest-xdist分布式测试的流程
第一步:建立worker
- master会在总测试会话(test session)开始前产生一个或多个worker
- master和worker之间是经过execnet和网关来通讯的
- 实际编译执行测试代码的worker多是本地机器也多是远程机器
第二步:收集测试项用例
- 每一个worker相似一个迷你型的pytest执行器
- worker会执行一个完整的test collection过程【收集全部测试用例的过程】
- 而后把测试用例的ids返回给master
- master是不会执行任何测试用例集的
注意
因此为何上面经过分布式测试的结果截图是没有输出用例的print内容,由于主机并不执行测试用例,pycharm至关于一个mastersession
第三步:master检车workers收集到的测试用例集
- master接收到全部worker收集的测试用例集以后,master会进行一些完整性检查,以确保全部worker都收集到同样的测试用例集(包括顺序)
- 若是检查经过,会将测试用例的ids列表转换成简单的索引列表,每一个索引对应一个测试用例的在原来测试集中的位置
- 这个方案可行的缘由是:全部的节点都保存着相同的测试用例集
- 而且使用这种方式能够节省带宽,由于master只须要告知workers须要执行的测试用例对应的索引,而不用告知完整的测试用例信息
第四步:测试用例分发
--dist-mode选项分布式
each:master将完整的测试索引列表分发到每一个workeroop
load:master将大约25%的测试用例以轮询的方式分发到各个worker,剩余的测试用例则会等待workers执行完测试用例之后再分发测试
注意
可使用 pytest_xdist_make_scheduler 这个hook来实现自定义测试分发逻辑。spa
第五步:测试用例的执行
- workers 重写了 pytest_runtestloop :pytest的默认实现是循环执行全部在test session这个对象里面收集到的测试用例
- 可是在xdist里, workers其实是等待master为其发送须要执行的测试用例
- 当worker收到测试任务, 就顺序执行 pytest_runtest_protocol
- 值得注意的一个细节是:workers 必须始终保持至少一个测试用例在的任务队列里, 以兼容 pytest_runtest_protocol(item, nextitem) hook的参数要求,为了将 nextitem传给hook
- worker会在执行最后一个测试项前等待master的更多指令
- 若是它收到了更多测试项, 那么就能够安全的执行 pytest_runtest_protocol , 由于这时nextitem参数已经能够肯定
- 若是它收到一个 "shutdown"信号, 那么就将 nextitem 参数设为 None, 而后执行 pytest_runtest_protocol
第六步:测试用例再分发(--dist-mode=load)
- 当workers开始/结束执行时,会把测试结果返回给master,这样其余pytest hook好比: pytest_runtest_protocol 和 pytest_runtest_protocol 就能够正常执行
- master在worker执行完一个测试后,基于测试执行时长以及每一个work剩余测试用例综合决定是否向这个worker发送更多的测试用例
第七步:测试结束
- 当master没有更多执行测试任务时,它会发送一个“shutdown”信号给全部worker
- 当worker将剩余测试用例执行完后退出进程
- master等待全部worker所有退出
- 然此时仍须要处理诸如 pytest_runtest_logreport 等事件
本文分享 CNBlog - 阿菠萝阿瑶。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。.net