#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 ignores the external pytest-cache
""" """
from __future__ import absolute_import, division, print_function from __future__ import absolute_import, division, print_function
from collections import OrderedDict
import py import py
from _pytest.python import Function import six
import pytest import pytest
import json import json
@ -176,33 +179,31 @@ class NFPlugin(object):
def __init__(self, config): def __init__(self, config):
self.config = config self.config = config
self.active = config.option.newfirst 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): def pytest_collection_modifyitems(self, session, config, items):
if self.active: if self.active:
new_items = [] new_items = OrderedDict()
other_items = [] other_items = OrderedDict()
for item in items: for item in items:
mod_timestamp = os.path.getmtime(str(item.fspath)) if item.nodeid not in self.cached_nodeids:
if self.all_items and item.nodeid not in self.all_items: new_items[item.nodeid] = item
new_items.append((item, mod_timestamp))
else: else:
other_items.append((item, mod_timestamp)) other_items[item.nodeid] = item
items[:] = self._get_increasing_order(new_items) + \ items[:] = self._get_increasing_order(six.itervalues(new_items)) + \
self._get_increasing_order(other_items) self._get_increasing_order(six.itervalues(other_items))
self.all_items = items self.cached_nodeids = [x.nodeid for x in items if isinstance(x, pytest.Item)]
def _get_increasing_order(self, test_list): def _get_increasing_order(self, items):
test_list = sorted(test_list, key=lambda x: x[1], reverse=True) return sorted(items, key=lambda item: item.fspath.mtime(), reverse=True)
return [test[0] for test in test_list]
def pytest_sessionfinish(self, session): def pytest_sessionfinish(self, session):
config = self.config config = self.config
if config.getoption("cacheshow") or hasattr(config, "slaveinput"): if config.getoption("cacheshow") or hasattr(config, "slaveinput"):
return 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): def pytest_addoption(parser):
@ -218,8 +219,8 @@ def pytest_addoption(parser):
"repeated fixture setup/teardown") "repeated fixture setup/teardown")
group.addoption( group.addoption(
'--nf', '--new-first', action='store_true', dest="newfirst", '--nf', '--new-first', action='store_true', dest="newfirst",
help="run all tests but run new tests first, then tests from " help="run tests from new files first, then the rest of the tests "
"last modified files, then other tests") "sorted by file mtime")
group.addoption( group.addoption(
'--cache-show', action='store_true', dest="cacheshow", '--cache-show', action='store_true', dest="cacheshow",
help="show cache contents, don't perform collection or tests") 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`: .. _`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 The new config.cache object
-------------------------------- --------------------------------
@ -266,13 +270,3 @@ dumps/loads API of the json stdlib module
.. automethod:: Cache.get .. automethod:: Cache.get
.. automethod:: Cache.set .. automethod:: Cache.set
.. automethod:: Cache.makedir .. 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): class TestNewFirst(object):
def test_newfirst_usecase(self, testdir): def test_newfirst_usecase(self, testdir):
t1 = testdir.mkdir("test_1") testdir.makepyfile(**{
t2 = testdir.mkdir("test_2") '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( testdir.tmpdir.join('test_1/test_1.py').setmtime(1)
"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))
result = testdir.runpytest("-v") result = testdir.runpytest("-v")
result.stdout.fnmatch_lines([ result.stdout.fnmatch_lines([
@ -645,13 +643,13 @@ class TestNewFirst(object):
"*test_1/test_1.py::test_3 PASSED*", "*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_1(): assert 1\n"
"def test_2(): assert 1\n" "def test_2(): assert 1\n"
"def test_3(): assert 1\n" "def test_3(): assert 1\n"
"def test_4(): 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") result = testdir.runpytest("-v", "--nf")
@ -666,22 +664,20 @@ class TestNewFirst(object):
]) ])
def test_newfirst_parametrize(self, testdir): def test_newfirst_parametrize(self, testdir):
t1 = testdir.mkdir("test_1") testdir.makepyfile(**{
t2 = testdir.mkdir("test_2") '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( testdir.tmpdir.join('test_1/test_1.py').setmtime(1)
"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))
result = testdir.runpytest("-v") result = testdir.runpytest("-v")
result.stdout.fnmatch_lines([ result.stdout.fnmatch_lines([
@ -700,12 +696,12 @@ class TestNewFirst(object):
"*test_1/test_1.py::test_1[2*", "*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" "import pytest\n"
"@pytest.mark.parametrize('num', [1, 2, 3])\n" "@pytest.mark.parametrize('num', [1, 2, 3])\n"
"def test_1(num): assert num\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") result = testdir.runpytest("-v", "--nf")