Simply show the node ID for verbose output
This strips the line number, /@\d/, from the verbose output so it is directly the node ID of the test. This in turn means no special logic for accepting the line number as part of the node ID is needed when parsing the command line.
This commit is contained in:
parent
bcdc3d0154
commit
4e8438afc8
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
import py
|
import py
|
||||||
# DON't import pytest here because it causes import cycle troubles
|
# DON't import pytest here because it causes import cycle troubles
|
||||||
import re
|
|
||||||
import sys, os
|
import sys, os
|
||||||
from _pytest import hookspec # the extension point definitions
|
from _pytest import hookspec # the extension point definitions
|
||||||
from _pytest.core import PluginManager
|
from _pytest.core import PluginManager
|
||||||
|
@ -181,8 +180,7 @@ class Parser:
|
||||||
a = option.attrs()
|
a = option.attrs()
|
||||||
arggroup.add_argument(*n, **a)
|
arggroup.add_argument(*n, **a)
|
||||||
# bash like autocompletion for dirs (appending '/')
|
# bash like autocompletion for dirs (appending '/')
|
||||||
optparser.add_argument(FILE_OR_DIR, nargs='*', type=node_with_line_number,
|
optparser.add_argument(FILE_OR_DIR, nargs='*').completer=filescompleter
|
||||||
).completer=filescompleter
|
|
||||||
return optparser
|
return optparser
|
||||||
|
|
||||||
def parse_setoption(self, args, option):
|
def parse_setoption(self, args, option):
|
||||||
|
@ -862,13 +860,6 @@ def getcfg(args, inibasenames):
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
|
||||||
rex_pyat = re.compile(r'(.*\.py)@\d+$')
|
|
||||||
|
|
||||||
def node_with_line_number(string):
|
|
||||||
return "::".join(rex_pyat.sub(lambda m: m.group(1), part)
|
|
||||||
for part in string.split("::"))
|
|
||||||
|
|
||||||
|
|
||||||
def setns(obj, dic):
|
def setns(obj, dic):
|
||||||
import pytest
|
import pytest
|
||||||
for name, value in dic.items():
|
for name, value in dic.items():
|
||||||
|
|
|
@ -380,9 +380,6 @@ class TerminalReporter:
|
||||||
fspath = "%s <- %s" % (collect_fspath, fspath)
|
fspath = "%s <- %s" % (collect_fspath, fspath)
|
||||||
if fspath:
|
if fspath:
|
||||||
line = str(fspath)
|
line = str(fspath)
|
||||||
if lineno is not None:
|
|
||||||
lineno += 1
|
|
||||||
line += "@" + str(lineno)
|
|
||||||
if domain:
|
if domain:
|
||||||
split = str(domain).split('[')
|
split = str(domain).split('[')
|
||||||
split[0] = split[0].replace('.', '::') # don't replace '.' in params
|
split[0] = split[0].replace('.', '::') # don't replace '.' in params
|
||||||
|
|
|
@ -1692,22 +1692,22 @@ class TestFixtureMarker:
|
||||||
""")
|
""")
|
||||||
result = testdir.runpytest("-v")
|
result = testdir.runpytest("-v")
|
||||||
result.stdout.fnmatch_lines("""
|
result.stdout.fnmatch_lines("""
|
||||||
test_mod1.py@1::test_func[s1] PASSED
|
test_mod1.py::test_func[s1] PASSED
|
||||||
test_mod2.py@1::test_func2[s1] PASSED
|
test_mod2.py::test_func2[s1] PASSED
|
||||||
test_mod2.py@3::test_func3[s1-m1] PASSED
|
test_mod2.py::test_func3[s1-m1] PASSED
|
||||||
test_mod2.py@5::test_func3b[s1-m1] PASSED
|
test_mod2.py::test_func3b[s1-m1] PASSED
|
||||||
test_mod2.py@3::test_func3[s1-m2] PASSED
|
test_mod2.py::test_func3[s1-m2] PASSED
|
||||||
test_mod2.py@5::test_func3b[s1-m2] PASSED
|
test_mod2.py::test_func3b[s1-m2] PASSED
|
||||||
test_mod1.py@1::test_func[s2] PASSED
|
test_mod1.py::test_func[s2] PASSED
|
||||||
test_mod2.py@1::test_func2[s2] PASSED
|
test_mod2.py::test_func2[s2] PASSED
|
||||||
test_mod2.py@3::test_func3[s2-m1] PASSED
|
test_mod2.py::test_func3[s2-m1] PASSED
|
||||||
test_mod2.py@5::test_func3b[s2-m1] PASSED
|
test_mod2.py::test_func3b[s2-m1] PASSED
|
||||||
test_mod2.py@7::test_func4[m1] PASSED
|
test_mod2.py::test_func4[m1] PASSED
|
||||||
test_mod2.py@3::test_func3[s2-m2] PASSED
|
test_mod2.py::test_func3[s2-m2] PASSED
|
||||||
test_mod2.py@5::test_func3b[s2-m2] PASSED
|
test_mod2.py::test_func3b[s2-m2] PASSED
|
||||||
test_mod2.py@7::test_func4[m2] PASSED
|
test_mod2.py::test_func4[m2] PASSED
|
||||||
test_mod1.py@3::test_func1[m1] PASSED
|
test_mod1.py::test_func1[m1] PASSED
|
||||||
test_mod1.py@3::test_func1[m2] PASSED
|
test_mod1.py::test_func1[m2] PASSED
|
||||||
""")
|
""")
|
||||||
|
|
||||||
def test_class_ordering(self, testdir):
|
def test_class_ordering(self, testdir):
|
||||||
|
@ -1744,18 +1744,18 @@ class TestFixtureMarker:
|
||||||
""")
|
""")
|
||||||
result = testdir.runpytest("-vs")
|
result = testdir.runpytest("-vs")
|
||||||
result.stdout.fnmatch_lines("""
|
result.stdout.fnmatch_lines("""
|
||||||
test_class_ordering.py@4::TestClass2::test_1[1-a] PASSED
|
test_class_ordering.py::TestClass2::test_1[1-a] PASSED
|
||||||
test_class_ordering.py@4::TestClass2::test_1[2-a] PASSED
|
test_class_ordering.py::TestClass2::test_1[2-a] PASSED
|
||||||
test_class_ordering.py@6::TestClass2::test_2[1-a] PASSED
|
test_class_ordering.py::TestClass2::test_2[1-a] PASSED
|
||||||
test_class_ordering.py@6::TestClass2::test_2[2-a] PASSED
|
test_class_ordering.py::TestClass2::test_2[2-a] PASSED
|
||||||
test_class_ordering.py@4::TestClass2::test_1[1-b] PASSED
|
test_class_ordering.py::TestClass2::test_1[1-b] PASSED
|
||||||
test_class_ordering.py@4::TestClass2::test_1[2-b] PASSED
|
test_class_ordering.py::TestClass2::test_1[2-b] PASSED
|
||||||
test_class_ordering.py@6::TestClass2::test_2[1-b] PASSED
|
test_class_ordering.py::TestClass2::test_2[1-b] PASSED
|
||||||
test_class_ordering.py@6::TestClass2::test_2[2-b] PASSED
|
test_class_ordering.py::TestClass2::test_2[2-b] PASSED
|
||||||
test_class_ordering.py@9::TestClass::test_3[1-a] PASSED
|
test_class_ordering.py::TestClass::test_3[1-a] PASSED
|
||||||
test_class_ordering.py@9::TestClass::test_3[2-a] PASSED
|
test_class_ordering.py::TestClass::test_3[2-a] PASSED
|
||||||
test_class_ordering.py@9::TestClass::test_3[1-b] PASSED
|
test_class_ordering.py::TestClass::test_3[1-b] PASSED
|
||||||
test_class_ordering.py@9::TestClass::test_3[2-b] PASSED
|
test_class_ordering.py::TestClass::test_3[2-b] PASSED
|
||||||
""")
|
""")
|
||||||
|
|
||||||
def test_parametrize_separated_order_higher_scope_first(self, testdir):
|
def test_parametrize_separated_order_higher_scope_first(self, testdir):
|
||||||
|
|
|
@ -251,7 +251,7 @@ def test_conftest_found_with_double_dash(testdir):
|
||||||
def test_hello(found):
|
def test_hello(found):
|
||||||
assert found == 1
|
assert found == 1
|
||||||
"""))
|
"""))
|
||||||
result = testdir.runpytest(str(p) + "@2::test_hello", "-h")
|
result = testdir.runpytest(str(p) + "::test_hello", "-h")
|
||||||
result.stdout.fnmatch_lines("""
|
result.stdout.fnmatch_lines("""
|
||||||
*--hello-world*
|
*--hello-world*
|
||||||
""")
|
""")
|
||||||
|
|
|
@ -145,21 +145,6 @@ class TestParser:
|
||||||
assert args.R == True
|
assert args.R == True
|
||||||
assert args.S == False
|
assert args.S == False
|
||||||
|
|
||||||
def test_parse_removes_line_number_from_positional_arguments(self, parser):
|
|
||||||
args = parser.parse(['path.txt@2::item',
|
|
||||||
'path2.py::func2[param with .py@123]',
|
|
||||||
'path.py@123',
|
|
||||||
'hello/path.py@123',
|
|
||||||
])
|
|
||||||
# we only remove "@NUM" syntax for .py files which are currently
|
|
||||||
# the only ones which can produce it.
|
|
||||||
assert getattr(args, parseopt.FILE_OR_DIR) == [
|
|
||||||
'path.txt@2::item',
|
|
||||||
'path2.py::func2[param with .py@123]',
|
|
||||||
'path.py',
|
|
||||||
'hello/path.py',
|
|
||||||
]
|
|
||||||
|
|
||||||
def test_parse_defaultgetter(self):
|
def test_parse_defaultgetter(self):
|
||||||
def defaultget(option):
|
def defaultget(option):
|
||||||
if not hasattr(option, 'type'):
|
if not hasattr(option, 'type'):
|
||||||
|
|
|
@ -51,9 +51,9 @@ class TestTerminal:
|
||||||
result = testdir.runpytest(*option.args)
|
result = testdir.runpytest(*option.args)
|
||||||
if option.verbose:
|
if option.verbose:
|
||||||
result.stdout.fnmatch_lines([
|
result.stdout.fnmatch_lines([
|
||||||
"*test_pass_skip_fail.py@2::test_ok PASS*",
|
"*test_pass_skip_fail.py::test_ok PASS*",
|
||||||
"*test_pass_skip_fail.py@4::test_skip SKIP*",
|
"*test_pass_skip_fail.py::test_skip SKIP*",
|
||||||
"*test_pass_skip_fail.py@6::test_func FAIL*",
|
"*test_pass_skip_fail.py::test_func FAIL*",
|
||||||
])
|
])
|
||||||
else:
|
else:
|
||||||
result.stdout.fnmatch_lines([
|
result.stdout.fnmatch_lines([
|
||||||
|
@ -126,7 +126,7 @@ class TestTerminal:
|
||||||
])
|
])
|
||||||
result = testdir.runpytest("-v", p2)
|
result = testdir.runpytest("-v", p2)
|
||||||
result.stdout.fnmatch_lines([
|
result.stdout.fnmatch_lines([
|
||||||
"*test_p2.py <- *test_p1.py@2::TestMore::test_p1*",
|
"*test_p2.py <- *test_p1.py::TestMore::test_p1*",
|
||||||
])
|
])
|
||||||
|
|
||||||
def test_itemreport_directclasses_not_shown_as_subclasses(self, testdir):
|
def test_itemreport_directclasses_not_shown_as_subclasses(self, testdir):
|
||||||
|
@ -450,17 +450,17 @@ class TestTerminalFunctional:
|
||||||
""")
|
""")
|
||||||
result = testdir.runpytest(p1, '-v')
|
result = testdir.runpytest(p1, '-v')
|
||||||
result.stdout.fnmatch_lines([
|
result.stdout.fnmatch_lines([
|
||||||
"*test_verbose_reporting.py@2::test_fail *FAIL*",
|
"*test_verbose_reporting.py::test_fail *FAIL*",
|
||||||
"*test_verbose_reporting.py@4::test_pass *PASS*",
|
"*test_verbose_reporting.py::test_pass *PASS*",
|
||||||
"*test_verbose_reporting.py@7::TestClass::test_skip *SKIP*",
|
"*test_verbose_reporting.py::TestClass::test_skip *SKIP*",
|
||||||
"*test_verbose_reporting.py@10::test_gen*0* *FAIL*",
|
"*test_verbose_reporting.py::test_gen*0* *FAIL*",
|
||||||
])
|
])
|
||||||
assert result.ret == 1
|
assert result.ret == 1
|
||||||
|
|
||||||
pytestconfig.pluginmanager.skipifmissing("xdist")
|
pytestconfig.pluginmanager.skipifmissing("xdist")
|
||||||
result = testdir.runpytest(p1, '-v', '-n 1')
|
result = testdir.runpytest(p1, '-v', '-n 1')
|
||||||
result.stdout.fnmatch_lines([
|
result.stdout.fnmatch_lines([
|
||||||
"*FAIL*test_verbose_reporting.py@2::test_fail*",
|
"*FAIL*test_verbose_reporting.py::test_fail*",
|
||||||
])
|
])
|
||||||
assert result.ret == 1
|
assert result.ret == 1
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue