diff --git a/changelog/3843.bugfix.rst b/changelog/3843.bugfix.rst new file mode 100644 index 000000000..3186c3fc5 --- /dev/null +++ b/changelog/3843.bugfix.rst @@ -0,0 +1 @@ +Fix collection error when specifying test functions directly in the command line using ``test.py::test`` syntax together with ``--doctest-module``. diff --git a/src/_pytest/main.py b/src/_pytest/main.py index eae0bb255..947c6aa4b 100644 --- a/src/_pytest/main.py +++ b/src/_pytest/main.py @@ -625,11 +625,12 @@ class Session(nodes.FSCollector): resultnodes.append(node) continue assert isinstance(node, nodes.Collector) - if node.nodeid in self._node_cache: - rep = self._node_cache[node.nodeid] + key = (type(node), node.nodeid) + if key in self._node_cache: + rep = self._node_cache[key] else: rep = collect_one_node(node) - self._node_cache[node.nodeid] = rep + self._node_cache[key] = rep if rep.passed: has_matched = False for x in rep.result: diff --git a/testing/acceptance_test.py b/testing/acceptance_test.py index bc4e3bed8..5d6baf121 100644 --- a/testing/acceptance_test.py +++ b/testing/acceptance_test.py @@ -660,6 +660,16 @@ class TestInvocationVariants(object): ["*test_world.py::test_other*PASSED*", "*1 passed*"] ) + def test_invoke_test_and_doctestmodules(self, testdir): + p = testdir.makepyfile( + """ + def test(): + pass + """ + ) + result = testdir.runpytest(str(p) + "::test", "--doctest-modules") + result.stdout.fnmatch_lines(["*1 passed*"]) + @pytest.mark.skipif(not hasattr(os, "symlink"), reason="requires symlinks") def test_cmdline_python_package_symlink(self, testdir, monkeypatch): """