#3034 Fix comments

This commit is contained in:
feuillemorte 2018-02-23 22:49:17 +03:00
parent dff0500114
commit e865f2a235
4 changed files with 54 additions and 63 deletions

View File

@ -5,8 +5,11 @@ the name cache was not chosen to ensure pluggy automatically
ignores the external pytest-cache
"""
from __future__ import absolute_import, division, print_function
from collections import OrderedDict
import py
from _pytest.python import Function
import six
import pytest
import json
@ -176,33 +179,31 @@ class NFPlugin(object):
def __init__(self, config):
self.config = config
self.active = config.option.newfirst
self.all_items = config.cache.get("cache/allitems", {})
self.cached_nodeids = config.cache.get("cache/nodeids", [])
def pytest_collection_modifyitems(self, session, config, items):
if self.active:
new_items = []
other_items = []
new_items = OrderedDict()
other_items = OrderedDict()
for item in items:
mod_timestamp = os.path.getmtime(str(item.fspath))
if self.all_items and item.nodeid not in self.all_items:
new_items.append((item, mod_timestamp))
if item.nodeid not in self.cached_nodeids:
new_items[item.nodeid] = item
else:
other_items.append((item, mod_timestamp))
other_items[item.nodeid] = item
items[:] = self._get_increasing_order(new_items) + \
self._get_increasing_order(other_items)
self.all_items = items
items[:] = self._get_increasing_order(six.itervalues(new_items)) + \
self._get_increasing_order(six.itervalues(other_items))
self.cached_nodeids = [x.nodeid for x in items if isinstance(x, pytest.Item)]
def _get_increasing_order(self, test_list):
test_list = sorted(test_list, key=lambda x: x[1], reverse=True)
return [test[0] for test in test_list]
def _get_increasing_order(self, items):
return sorted(items, key=lambda item: item.fspath.mtime(), reverse=True)
def pytest_sessionfinish(self, session):
config = self.config
if config.getoption("cacheshow") or hasattr(config, "slaveinput"):
return
config.cache.set("cache/allitems",
[item.nodeid for item in self.all_items if isinstance(item, Function)])
config.cache.set("cache/nodeids", self.cached_nodeids)
def pytest_addoption(parser):
@ -218,8 +219,8 @@ def pytest_addoption(parser):
"repeated fixture setup/teardown")
group.addoption(
'--nf', '--new-first', action='store_true', dest="newfirst",
help="run all tests but run new tests first, then tests from "
"last modified files, then other tests")
help="run tests from new files first, then the rest of the tests "
"sorted by file mtime")
group.addoption(
'--cache-show', action='store_true', dest="cacheshow",
help="show cache contents, don't perform collection or tests")

View File

@ -1 +1 @@
Added new option `--nf`, `--new-first`. This option enables run tests in next order: first new tests, then last modified files with tests in descending order (default order inside file).
New ``--nf``, ``--new-first`` options: run new tests first followed by the rest of the tests, in both cases tests are also sorted by the file modified time, with more recent files coming first.

View File

@ -152,6 +152,10 @@ of ``FF`` and dots)::
.. _`config.cache`:
New ``--nf``, ``--new-first`` options: run new tests first followed by the rest
of the tests, in both cases tests are also sorted by the file modified time,
with more recent files coming first.
The new config.cache object
--------------------------------
@ -266,13 +270,3 @@ dumps/loads API of the json stdlib module
.. automethod:: Cache.get
.. automethod:: Cache.set
.. automethod:: Cache.makedir
New tests first
-----------------
The plugin provides command line options to run tests in another order:
* ``--nf``, ``--new-first`` - to run tests in next order: first new tests, then
last modified files with tests in descending order (default order inside file).

View File

@ -607,22 +607,20 @@ class TestLastFailed(object):
class TestNewFirst(object):
def test_newfirst_usecase(self, testdir):
t1 = testdir.mkdir("test_1")
t2 = testdir.mkdir("test_2")
testdir.makepyfile(**{
'test_1/test_1.py': '''
def test_1(): assert 1
def test_2(): assert 1
def test_3(): assert 1
''',
'test_2/test_2.py': '''
def test_1(): assert 1
def test_2(): assert 1
def test_3(): assert 1
'''
})
t1.join("test_1.py").write(
"def test_1(): assert 1\n"
"def test_2(): assert 1\n"
"def test_3(): assert 1\n"
)
t2.join("test_2.py").write(
"def test_1(): assert 1\n"
"def test_2(): assert 1\n"
"def test_3(): assert 1\n"
)
path_to_test_1 = str('{}/test_1/test_1.py'.format(testdir.tmpdir))
os.utime(path_to_test_1, (1, 1))
testdir.tmpdir.join('test_1/test_1.py').setmtime(1)
result = testdir.runpytest("-v")
result.stdout.fnmatch_lines([
@ -645,13 +643,13 @@ class TestNewFirst(object):
"*test_1/test_1.py::test_3 PASSED*",
])
t1.join("test_1.py").write(
testdir.tmpdir.join("test_1/test_1.py").write(
"def test_1(): assert 1\n"
"def test_2(): assert 1\n"
"def test_3(): assert 1\n"
"def test_4(): assert 1\n"
)
os.utime(path_to_test_1, (1, 1))
testdir.tmpdir.join('test_1/test_1.py').setmtime(1)
result = testdir.runpytest("-v", "--nf")
@ -666,22 +664,20 @@ class TestNewFirst(object):
])
def test_newfirst_parametrize(self, testdir):
t1 = testdir.mkdir("test_1")
t2 = testdir.mkdir("test_2")
testdir.makepyfile(**{
'test_1/test_1.py': '''
import pytest
@pytest.mark.parametrize('num', [1, 2])
def test_1(num): assert num
''',
'test_2/test_2.py': '''
import pytest
@pytest.mark.parametrize('num', [1, 2])
def test_1(num): assert num
'''
})
t1.join("test_1.py").write(
"import pytest\n"
"@pytest.mark.parametrize('num', [1, 2])\n"
"def test_1(num): assert num\n"
)
t2.join("test_2.py").write(
"import pytest\n"
"@pytest.mark.parametrize('num', [1, 2])\n"
"def test_1(num): assert num\n"
)
path_to_test_1 = str('{}/test_1/test_1.py'.format(testdir.tmpdir))
os.utime(path_to_test_1, (1, 1))
testdir.tmpdir.join('test_1/test_1.py').setmtime(1)
result = testdir.runpytest("-v")
result.stdout.fnmatch_lines([
@ -700,12 +696,12 @@ class TestNewFirst(object):
"*test_1/test_1.py::test_1[2*",
])
t1.join("test_1.py").write(
testdir.tmpdir.join("test_1/test_1.py").write(
"import pytest\n"
"@pytest.mark.parametrize('num', [1, 2, 3])\n"
"def test_1(num): assert num\n"
)
os.utime(path_to_test_1, (1, 1))
testdir.tmpdir.join('test_1/test_1.py').setmtime(1)
result = testdir.runpytest("-v", "--nf")