sup*_*tor 29 python pytest xdist
我有以下目录布局:
runner.py
lib/
tests/
testsuite1/
testsuite1.py
testsuite2/
testsuite2.py
testsuite3/
testsuite3.py
testsuite4/
testsuite4.py
Run Code Online (Sandbox Code Playgroud)
testsuite*.py模块的格式如下:
import pytest
class testsomething:
def setup_class(self):
''' do some setup '''
# Do some setup stuff here
def teardown_class(self):
'''' do some teardown'''
# Do some teardown stuff here
def test1(self):
# Do some test1 related stuff
def test2(self):
# Do some test2 related stuff
....
....
....
def test40(self):
# Do some test40 related stuff
if __name__=='__main()__'
pytest.main(args=[os.path.abspath(__file__)])
我遇到的问题是我想并行执行'testsuites',即我希望testsuite1,testsuite2,testsuite3和testsuite4并行开始执行,但是测试套件中的单个测试需要连续执行.
当我使用py.test中的'xdist'插件并使用'py.test -n 4'启动测试时,py.test正在收集所有测试并随机地在4个工作者之间平衡测试.这导致在'testsuitex.py'模块中每次测试时都会执行'setup_class'方法(这违背了我的目的.我希望每个类只执行一次setup_class,然后在那里连续执行测试).
基本上我想要的执行看起来像是:
worker1: executes all tests in testsuite1.py serially worker2: executes all tests in testsuite2.py serially worker3: executes all tests in testsuite3.py serially worker4: executes all tests in testsuite4.py serially
而 worker1, worker2, worker3 and worker4 在所有并联执行.
有没有办法在'pytest-xidst'框架中实现这一目标?
我能想到的唯一选择是启动不同的进程来在runner.py中单独执行每个测试套件:
def test_execute_func(testsuite_path):
subprocess.process('py.test %s' % testsuite_path)
if __name__=='__main__':
#Gather all the testsuite names
for each testsuite:
multiprocessing.Process(test_execute_func,(testsuite_path,))
hpk*_*k42 13
使用pytest-xdist,目前没有"per-file"或"per-test-suite"发行版.实际上,如果每个文件的分发(例如,文件中的测试一次只能由一个工作人员执行)已经有助于您的用例,我建议您通过https:/ pytest问题跟踪器提交功能问题: /bitbucket.org/hpk42/pytest/issues?status=new&status=open并在此处链接回您的好解释.
欢呼声,霍尔格
您可以用来--dist=loadscope将所有测试归为同一测试类。这是来自pypi上pytest-xdist的文档
缺省情况下,-n选项会将挂起的测试发送到任何可用的工作程序,而没有任何保证的顺序,但是您可以使用以下选项来控制它:
--dist=loadscope:测试将按模块分类以进行测试功能,并按类别分类以进行测试方法,然后将每个组发送给可用的工作程序,以确保同一组中的所有测试都在同一过程中运行。如果您有昂贵的模块级或类级灯具,这将很有用。目前无法自定义分组,按类别分组优先于按模块分组。此功能已在1.19版中添加。
--dist=loadfile:测试将按文件名分组,然后发送到可用的工作程序,以确保组中的所有测试都在同一工作程序中运行。此功能是在1.21版中添加的。
是的,有这样的方法,每个xdist版本的可用选项1.28.0如下:
--dist=each:将所有测试发送到所有节点,因此每个测试都在每个节点上运行。--dist=load:将收集的测试分布在所有节点上,因此每个测试仅运行一次。所有节点都收集并提交测试套件,并且在收到(测试套件的)所有集合时,将验证它们是相同的集合。然后,将集合分成大块,然后将大块提交给节点以执行。--dist=loadscope将收集的测试分布在所有节点上,因此每个测试仅运行一次。所有节点都收集并提交测试列表,并且在收到所有集合后,将验证它们是相同的集合。然后,将集合按工作范围划分,并按测试范围分组,然后将这些工作单元提交给节点。--dist=loadfile将收集的测试分布在所有节点上,因此每个测试仅运行一次。所有节点都收集并提交测试列表,并且在收到所有集合后,将验证它们是相同的集合。然后,将集合按工作单元划分,并按测试文件分组,然后将这些工作单元提交给节点。如果您需要任何其他信息,建议您直接进入调度程序的实际实现,并检查分发的完成方式。
| 归档时间: |
|
| 查看次数: |
7253 次 |
| 最近记录: |