🚀多任务
aomaker
提供了多线程和多进程两种方式来加速用例运行速度,提供了三种粒度来合理控制线程/进程worker,此外,多线程模式下,对allure
报告也做了优化,不会像pytest-parallel
可能会出现无法正常生成测试报告的问题。
aomaker的运行流程如下:
启动后,
- 读取
config.yaml
配置文件 - 加载配置文件
- 运行
hooks.py
中的自定义cli和hook(如果有) - 开始根据cli指定的多任务方式和分配模式开启多线程/进程(如果在
aomaker.yaml
中指定了worker分配策略,将会以该策略进行分配) - 在子进程/线程内启动
pytest
进行用例运行 - 所有子任务执行完成后,进行报告收集、聚合和环境清理,结束
多线程(推荐)
启动方式
aomaker
提供了两种启动多线程:CLI和run.py
- cli
multi-run:
--mp, --multi-process
specifies a multi-process running mode.
--mt, --multi-thread specifies a multi-thread running mode.
--dist-suite DIST_SUITE
specifies a dist mode for per worker.
--dist-file DIST_FILE
specifies a dist mode for per worker.
--dist-mark DIST_MARK [DIST_MARK ...]
specifies a dist mode for per worker.
命令行输入:arun --mt --dist-xxx xxx
或者aomaker run --mt --dist-xxx
- run.py
run.py
from login import Login
from aomaker.runner import threads_run
if __name__ == '__main__':
threads_run(['-m ehpc','-m hpc'], login=Login())
分配模式
为了更加精细和合理的去分配任务给子线程,aomaker
提供了三种分配模式,颗粒度由细到粗分别是:
- 按标记分配
即按照pytest
提供的mark
功能来分配任务给子线程,比如说你希望将标记为demo1
、demo2
、demo3
的三组case分配给三个不同子线程去跑,那么你需要做的就是:提前给用例打上对应mark
,然后:
- cli:
arun --mt --dist-mark demo1 demo2 demo3
- run.py:
run.py
from login import Login
from aomaker.runner import threads_run
if __name__ == '__main__':
# 注意第一个参数传入的是列表
threads_run(['-m demo1','-m demo2','-m demo3'], login=Login())
这样启动后,会开启三个子线程,去分别执行三组case。
注意:
1.每组mark下的case,一定要保证是独立的!
2.提供多少个mark,就开启多少个线程
- 按测试模块分配
即按照测试文件来分配任务给子线程,比如在testcases\test_api
目录下有test_demo1.py
、test_demo2.py
、test_demo3.py
三个测试模块,你希望这三个模块下的测试case分别由三个子线程接管执行,那么只需要:
- cli:
arun --mt --dist-file testcases\test_api
,即告诉aomaker
测试文件所在目录既可 - run.py:
run.py
from login import Login
from aomaker.runner import threads_run
if __name__ == '__main__':
# 注意第一个参数传入的是key名为path的字典
threads_run({"path":"testcases/test_api"}, login=Login())
注意:
1.每个测试模块下的case,一定要保证是独立的!
2.指定目录下有多少个测试模块,就开启多少个线程
- 按测试套件分配
即按照测试目录来分配任务给子线程,比如在testcases\test_scenario
目录下,有test_scenario1
、test_scenario2
、test_scenario3
等三个测试目录,每个目录下还有若干测试模块,你希望这三个目录下的所有测试case分别由三个子线程接管执行,那么只需要:
- cli:
arun --mt --dist-suite testcases\test_scenario
,即告诉aomaker
测试套件所在目录既可 - run.py:
run.py
from login import Login
from aomaker.runner import threads_run
if __name__ == '__main__':
# 注意第一个参数传入的是字符串
threads_run("testcases/test_scenario", login=Login())
注意:
1.每个测试模块下的case,一定要保证是独立的!
2.指定目录下有多少个测试套件,就开启多少个线程
多进程
aomaker
目前暂时不支持在windows上创建多进程,linux、mac是完美支持的。
启动方式
aomaker
同样提供了两种启动多进程:CLI和run.py
- cli
multi-run:
--mp, --multi-process
specifies a multi-process running mode.
--mt, --multi-thread specifies a multi-thread running mode.
--dist-suite DIST_SUITE
specifies a dist mode for per worker.
--dist-file DIST_FILE
specifies a dist mode for per worker.
--dist-mark DIST_MARK [DIST_MARK ...]
specifies a dist mode for per worker.
命令行输入:arun --mp --dist-xxx xxx
或者aomaker run --mp --dist-xxx
**注意📢:使用mark分配模式时,需要加引号,如arun –mp –dist-mark “m1 m2 m3” **
- run.py
run.py
from login import Login
from aomaker.runner import processes_run
if __name__ == '__main__':
processes_run(['-m ehpc','-m hpc'], login=Login())
分配模式
分配模式和多线程是一样的,区别是任务是分配给子进程,而不是子线程,具体分配模式请参考多线程。
worker策略分配配置
当我们的用例工程比较庞大时,需要同时并行很多不同的mark用例,如arun --mp --dist-mark "m1 m2 m3 ...m30"
,在cli里指定会导致命令很长。
因此,aomaker在v2.3.0推出了多任务worker策略配置,目的是支持更多标签并行执行,可以更灵活、更方便的去配置多任务分配策略,从而提升执行效率。
在conf
目录下有一个策略配置文件:aomaker.yaml
。
conf/aomaker.yaml
target: ['iaas','hpc']
marks:
iaas:
- iaas_image
- iaas_volume
hpc:
- hpc_sw
- hpc_fs
参数说明:
- target:list,代表下方具体策略目标
- marks:dict[dict],代表标签分类,每个分类下是一个列表,其中每个元素代表一个测试标签。
上述策略配置,最终会生产4个标签:iaas_image,iaas_volume,hpc_sw,hpc_fs,分配给4个worker同时执行。
注意📢:这里配置的每一个标签,一定是独立、不互为依赖的!
有时候,我们可能有不同的测试场景,需要跑不同的用例,即不同的标签,又不想每次重新配置。所以在此基础上,还支持多策略配置,具体用法如下:
conf/aomaker.yaml
target: ['iaas.smoke','hpc']
marks:
iaas:
smoke:
- iaas_image
- iaas_volume
p2:
- iaas_image_p2
- iaas_volume_p2
- iaas_network_p2
hpc:
- hpc_sw
- hpc_fs
比如iaas分类下,想增加两组多任务策略:一组用来跑冒烟-smoke,一组用来跑p2级用例-p2。
当要跑iaas冒烟时,修改配置文件中的target为iaas.smoke;
当要跑iaas p2时,修改配置文件中的target为iaas.p2;
假如target为[‘iaas.p2’,’hpc’],最终会生产5个标签:iaas_image_p2,iaas_volume_p2,iaas_network_p2,hpc_sw,hpc_fs,分配给5个worker同时执行。
原有的三种分配模式依然支持,即--dist-mark,--dist-file,--dist-suite。
现在,当你想使用策略配置时,只需在命令行输入:
- 多进程:
aurn --mp
- 多线程:
arun --mt
即,当不输入分配模式参数时,会根据策略配置文件去获取任务分配给worker;
当输入分配模式参数时,会按照输入的参数去分配给woker。