Merged in hpk42/pytest-hpk/nose_test_attr (pull request #154)

support nose-style __test__ attribute to disable collection of test modules/classes/functions
This commit is contained in:
Anatoly Bubenkov 2014-04-10 22:38:53 +02:00
commit 080a9d2f12
5 changed files with 68 additions and 7 deletions

View File

@ -64,6 +64,10 @@ NEXT (2.6)
- fix issue443: fix skip examples to use proper comparison. Thanks Alex
Groenholm.
- support nose-style ``__test__`` attribute on modules, classes and
functions, including unittest-style Classes. If set to False, the
test will not be collected.
2.5.2
-----------------------------------

View File

@ -229,10 +229,11 @@ def pytest_pycollect_makeitem(__multicall__, collector, name, obj):
"cannot collect %r because it is not a function."
% name, )
return
if is_generator(obj):
return Generator(name, parent=collector)
else:
return list(collector._genfunctions(name, obj))
if getattr(obj, "__test__", True):
if is_generator(obj):
return Generator(name, parent=collector)
else:
return list(collector._genfunctions(name, obj))
def is_generator(func):
try:
@ -314,6 +315,9 @@ class PyCollector(PyobjMixin, pytest.Collector):
return True
def collect(self):
if not getattr(self.obj, "__test__", True):
return []
# NB. we avoid random getattrs and peek in the __dict__ instead
# (XXX originally introduced from a PyPy need, still true?)
dicts = [getattr(self.obj, '__dict__', {})]

View File

@ -41,10 +41,12 @@ class UnitTestCase(pytest.Class):
super(UnitTestCase, self).setup()
def collect(self):
cls = self.obj
if not getattr(cls, "__test__", True):
return
self.session._fixturemanager.parsefactories(self, unittest=True)
loader = py.std.unittest.TestLoader()
module = self.getparent(pytest.Module).obj
cls = self.obj
foundsomething = False
for name in loader.getTestCaseNames(self.obj):
x = getattr(self.obj, name)

View File

@ -25,6 +25,7 @@ Supported nose Idioms
* SkipTest exceptions and markers
* setup/teardown decorators
* yield-based tests and their setup
* ``__test__`` attribute on modules/classes/functions
* general usage of nose utilities
Unsupported idioms / known issues

View File

@ -165,6 +165,7 @@ class TestMockDecoration:
assert names == ["test_one", "test_two", "test_three"]
def test_mock_double_patch_issue473(self, testdir):
pytest.importorskip("mock", "1.0.1")
testdir.makepyfile("""
from mock import patch
from pytest import mark
@ -176,8 +177,8 @@ class TestMockDecoration:
def test_simple_thing(self, mock_path, mock_getcwd):
pass
""")
res = testdir.inline_run()
res.assertoutcome(passed=1)
reprec = testdir.inline_run()
reprec.assertoutcome(passed=1)
class TestReRunTests:
@ -214,3 +215,52 @@ class TestReRunTests:
def test_pytestconfig_is_session_scoped():
from _pytest.python import pytestconfig
assert pytestconfig._pytestfixturefunction.scope == "session"
class TestNoselikeTestAttribute:
def test_module(self, testdir):
testdir.makepyfile("""
__test__ = False
def test_hello():
pass
""")
reprec = testdir.inline_run()
assert not reprec.getfailedcollections()
calls = reprec.getreports("pytest_runtest_logreport")
assert not calls
def test_class_and_method(self, testdir):
testdir.makepyfile("""
__test__ = True
def test_func():
pass
test_func.__test__ = False
class TestSome:
__test__ = False
def test_method(self):
pass
""")
reprec = testdir.inline_run()
assert not reprec.getfailedcollections()
calls = reprec.getreports("pytest_runtest_logreport")
assert not calls
def test_unittest_class(self, testdir):
testdir.makepyfile("""
import unittest
class TC(unittest.TestCase):
def test_1(self):
pass
class TC2(unittest.TestCase):
__test__ = False
def test_2(self):
pass
""")
reprec = testdir.inline_run()
assert not reprec.getfailedcollections()
call = reprec.getcalls("pytest_collection_modifyitems")[0]
assert len(call.items) == 1
assert call.items[0].cls.__name__ == "TC"