summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Szakmeister <john@szakmeister.net>2014-02-20 05:02:01 -0500
committerJohn Szakmeister <john@szakmeister.net>2014-02-20 05:02:01 -0500
commit023124f42b9e49c105a077dbb2416c64eb0e9f32 (patch)
tree0dfc64116ed49b08c24837c053d72dea9fed1ab9
parent129bd91e222a0ef973ea962eb539763748b54a84 (diff)
parentb65c42fd4e8ade68a5db00d8f089cf3285bd127e (diff)
downloadnose-023124f42b9e49c105a077dbb2416c64eb0e9f32.tar.gz
Merge pull request #772 from jszakmeister/fix-771
Fix #771: attr plugin is broken when parent overrides child method
-rw-r--r--CHANGELOG3
-rw-r--r--functional_tests/support/issue771/test.py16
-rw-r--r--functional_tests/test_attribute_plugin.py14
-rw-r--r--functional_tests/test_program.py12
-rw-r--r--nose/loader.py8
5 files changed, 38 insertions, 15 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 6a77471..33acaa7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -64,6 +64,9 @@ In Development
- Display the report summary and stack traces even if Ctrl-C was pressed
during the test run.
Patch by Kevin Qiu.
+- Fix #771: attr plugin is broken when parent and child share same method
+ name with different attributes
+ Patch by John Szakmeister. Test case provided by Thomas Grainger.
1.3.0
diff --git a/functional_tests/support/issue771/test.py b/functional_tests/support/issue771/test.py
new file mode 100644
index 0000000..a81eaa1
--- /dev/null
+++ b/functional_tests/support/issue771/test.py
@@ -0,0 +1,16 @@
+from nose.plugins.attrib import attr
+
+from unittest import TestCase
+
+@attr("b")
+def test_b():
+ assert 1 == 1
+
+class TestBase(TestCase):
+ def test_a(self):
+ assert 1 == 1
+
+class TestDerived(TestBase):
+ @attr("a")
+ def test_a(self):
+ assert 1 == 1
diff --git a/functional_tests/test_attribute_plugin.py b/functional_tests/test_attribute_plugin.py
index a093cd5..249bec5 100644
--- a/functional_tests/test_attribute_plugin.py
+++ b/functional_tests/test_attribute_plugin.py
@@ -156,6 +156,20 @@ class TestClassAndMethodAttrs(AttributePluginTester):
assert 'test_case_three' not in self.output
+# Issue #771
+class TestTopLevelNotSelected(AttributePluginTester):
+ suitepath = os.path.join(support, 'issue771')
+ args = ["-a", "!a"]
+
+ def verify(self):
+ # Note: a failure here may mean that the test case selection is broken
+ # rather than the attribute plugin, but the issue more easily manifests
+ # itself when using attributes.
+ assert 'test.test_b ... ok' in self.output
+ assert 'test_a (test.TestBase) ... ok' in self.output
+ assert 'TestDerived' not in self.output
+
+
if compat_24:
class TestAttributeEval(AttributePluginTester):
args = ["-A", "c>20"]
diff --git a/functional_tests/test_program.py b/functional_tests/test_program.py
index b42b371..6ff600d 100644
--- a/functional_tests/test_program.py
+++ b/functional_tests/test_program.py
@@ -113,16 +113,8 @@ class TestTestProgram(unittest.TestCase):
print "-----"
print repr(res)
- # some versions of twisted.trial.unittest.TestCase have
- # runTest in the base class -- this is wrong! But we have
- # to deal with it
- if hasattr(TestCase, 'runTest'):
- expect = 5
- else:
- expect = 4
- self.assertEqual(res.testsRun, expect,
- "Expected to run %s tests, ran %s" %
- (expect, res.testsRun))
+ self.assertEqual(res.testsRun, 4,
+ "Expected to run 4 tests, ran %s" % (res.testsRun,))
assert not res.wasSuccessful()
assert len(res.errors) == 1
diff --git a/nose/loader.py b/nose/loader.py
index 480c898..4152a12 100644
--- a/nose/loader.py
+++ b/nose/loader.py
@@ -104,7 +104,7 @@ class TestLoader(unittest.TestLoader):
"""
if self.config.getTestCaseNamesCompat:
return unittest.TestLoader.getTestCaseNames(self, testCaseClass)
-
+
def wanted(attr, cls=testCaseClass, sel=self.selector):
item = getattr(cls, attr, None)
if isfunction(item):
@@ -112,11 +112,9 @@ class TestLoader(unittest.TestLoader):
elif not ismethod(item):
return False
return sel.wantMethod(item)
+
cases = filter(wanted, dir(testCaseClass))
- for base in testCaseClass.__bases__:
- for case in self.getTestCaseNames(base):
- if case not in cases:
- cases.append(case)
+
# add runTest if nothing else picked
if not cases and hasattr(testCaseClass, 'runTest'):
cases = ['runTest']