39 lines
1.2 KiB
Python
39 lines
1.2 KiB
Python
|
from __future__ import print_function
|
||
|
|
||
|
import pytest
|
||
|
|
||
|
|
||
|
def pytest_collection_modifyitems(config, items):
|
||
|
"""
|
||
|
This adds a pytest marker that consistently shards all collected tests.
|
||
|
|
||
|
Use it like the following:
|
||
|
$ py.test -m shard_1_of_3
|
||
|
$ py.test -m shard_2_of_3
|
||
|
$ py.test -m shard_3_of_3
|
||
|
|
||
|
This code was originally adopted from the MIT-licensed ansible/molecule@9e7b79b:
|
||
|
Copyright (c) 2015-2018 Cisco Systems, Inc.
|
||
|
Copyright (c) 2018 Red Hat, Inc.
|
||
|
"""
|
||
|
mark_opt = config.getoption('-m')
|
||
|
if not mark_opt.startswith('shard_'):
|
||
|
return
|
||
|
|
||
|
desired_shard, _, total_shards = mark_opt[len('shard_'):].partition('_of_')
|
||
|
if not total_shards or not desired_shard:
|
||
|
return
|
||
|
|
||
|
desired_shard = int(desired_shard)
|
||
|
total_shards = int(total_shards)
|
||
|
|
||
|
if not 0 < desired_shard <= total_shards:
|
||
|
raise ValueError('desired_shard must be greater than 0 and not bigger than total_shards')
|
||
|
|
||
|
for test_counter, item in enumerate(items):
|
||
|
shard = test_counter%total_shards + 1
|
||
|
marker = getattr(pytest.mark, 'shard_{}_of_{}'.format(shard, total_shards))
|
||
|
item.add_marker(marker)
|
||
|
|
||
|
print('Running sharded test group #{} out of {}'.format(desired_shard, total_shards))
|