Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
95b309e980 | ||
|
|
3fe877bc6d | ||
|
|
f36ea25cb5 | ||
|
|
d81f57508d | ||
|
|
1d2616418c | ||
|
|
5f43575b42 |
6
.github/workflows/deploy.yml
vendored
6
.github/workflows/deploy.yml
vendored
@@ -47,3 +47,9 @@ jobs:
|
||||
git config user.email "pytestbot@gmail.com"
|
||||
git tag --annotate --message=v${{ github.event.inputs.version }} v${{ github.event.inputs.version }} ${{ github.sha }}
|
||||
git push origin v${{ github.event.inputs.version }}
|
||||
|
||||
- name: GitHub Release
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
files: dist/*
|
||||
tag_name: v${{ github.event.inputs.version }}
|
||||
|
||||
@@ -5,7 +5,7 @@ repos:
|
||||
- id: autoflake
|
||||
args: ["--in-place", "--remove-unused-variables", "--remove-all-unused-imports"]
|
||||
- repo: https://github.com/psf/black
|
||||
rev: 23.10.1
|
||||
rev: 23.11.0
|
||||
hooks:
|
||||
- id: black
|
||||
args: [--safe, --quiet, --target-version, py35]
|
||||
@@ -39,7 +39,7 @@ repos:
|
||||
language: python
|
||||
additional_dependencies: [pygments, restructuredtext_lint]
|
||||
- repo: https://github.com/pre-commit/mirrors-mypy
|
||||
rev: v1.6.1
|
||||
rev: v1.7.0
|
||||
hooks:
|
||||
- id: mypy
|
||||
files: ^(src/|testing/)
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
pytest-xdist 3.5.0 (2023-11-21)
|
||||
===============================
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
- `#632 <https://github.com/pytest-dev/pytest-xdist/issues/632>`_: ``--dist=loadscope`` now sorts scopes by number of tests to assign largest scopes early -- in many cases this should improve overall test session running time, as there is less chance of a large scope being left to be processed near the end of the session, leaving other workers idle.
|
||||
|
||||
|
||||
pytest-xdist 3.4.0 (2023-11-11)
|
||||
===============================
|
||||
|
||||
|
||||
@@ -350,11 +350,18 @@ class LoadScopeScheduling:
|
||||
return
|
||||
|
||||
# Determine chunks of work (scopes)
|
||||
unsorted_workqueue = OrderedDict()
|
||||
for nodeid in self.collection:
|
||||
scope = self._split_scope(nodeid)
|
||||
work_unit = self.workqueue.setdefault(scope, default=OrderedDict())
|
||||
work_unit = unsorted_workqueue.setdefault(scope, default=OrderedDict())
|
||||
work_unit[nodeid] = False
|
||||
|
||||
# Insert tests scopes into work queue ordered by number of tests.
|
||||
for scope, nodeids in sorted(
|
||||
unsorted_workqueue.items(), key=lambda item: -len(item[1])
|
||||
):
|
||||
self.workqueue[scope] = nodeids
|
||||
|
||||
# Avoid having more workers than work
|
||||
extra_nodes = len(self.nodes) - len(self.workqueue)
|
||||
|
||||
|
||||
@@ -1232,6 +1232,22 @@ class TestLoadScope:
|
||||
"test_a.py::TestB", result.outlines
|
||||
) in ({"gw0": 10}, {"gw1": 10})
|
||||
|
||||
def test_workqueue_ordered_by_size(self, pytester: pytest.Pytester) -> None:
|
||||
test_file = """
|
||||
import pytest
|
||||
@pytest.mark.parametrize('i', range({}))
|
||||
def test(i):
|
||||
pass
|
||||
"""
|
||||
pytester.makepyfile(test_a=test_file.format(10), test_b=test_file.format(20))
|
||||
result = pytester.runpytest("-n2", "--dist=loadscope", "-v")
|
||||
assert get_workers_and_test_count_by_prefix(
|
||||
"test_a.py::test", result.outlines
|
||||
) == {"gw1": 10}
|
||||
assert get_workers_and_test_count_by_prefix(
|
||||
"test_b.py::test", result.outlines
|
||||
) == {"gw0": 20}
|
||||
|
||||
def test_module_single_start(self, pytester: pytest.Pytester) -> None:
|
||||
"""Fix test suite never finishing in case all workers start with a single test (#277)."""
|
||||
test_file1 = """
|
||||
|
||||
Reference in New Issue
Block a user