From 0a3b1a065257109295f9322f5a7e199d157acfe6 Mon Sep 17 00:00:00 2001 From: Jannis Pohlmann Date: Fri, 27 Sep 2013 18:35:15 +0100 Subject: Fix importing submodules with the same basenames This patch fixes a bug in CoverageTestRunner.py, where submodules with the same basenames were not loaded into separate module objects. Because the module names passed to imp.load_module() were the same, previously loaded modules would be reloaded in place, causing different problems: 1. Imports of the affected modules in the test and tested code would sometimes import a different module and cause AttributeError exceptions when expected symbols were not present in the imported module. 2. Sometimes, all but one of the imported modules would incorrectly be considered to have zero test coverage. --- CoverageTestRunner.py | 2 +- subdir/__init__.py | 2 ++ subdir/foo_tests.py | 4 +++- .../modules_with_same_names_but_different_symbols/__init__.py | 2 ++ .../module1/__init__.py | 1 + .../module1/duplicate.py | 4 ++++ .../module1/duplicate_tests.py | 11 +++++++++++ .../module2/__init__.py | 1 + .../module2/duplicate.py | 4 ++++ .../module2/duplicate_tests.py | 11 +++++++++++ test-excluded | 5 ++++- 11 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 subdir/__init__.py create mode 100644 subdir/modules_with_same_names_but_different_symbols/__init__.py create mode 100644 subdir/modules_with_same_names_but_different_symbols/module1/__init__.py create mode 100644 subdir/modules_with_same_names_but_different_symbols/module1/duplicate.py create mode 100644 subdir/modules_with_same_names_but_different_symbols/module1/duplicate_tests.py create mode 100644 subdir/modules_with_same_names_but_different_symbols/module2/__init__.py create mode 100644 subdir/modules_with_same_names_but_different_symbols/module2/duplicate.py create mode 100644 subdir/modules_with_same_names_but_different_symbols/module2/duplicate_tests.py diff --git a/CoverageTestRunner.py b/CoverageTestRunner.py index 88987a1..6500041 100644 --- a/CoverageTestRunner.py +++ b/CoverageTestRunner.py @@ -158,7 +158,7 @@ class CoverageTestRunner: for tuple in imp.get_suffixes(): suffix, mode, type = tuple if pathname.endswith(suffix): - name = os.path.basename(pathname[:-len(suffix)]) + name = pathname[:-len(suffix)] f = file(pathname, mode) return imp.load_module(name, f, pathname, tuple) raise Exception("Unknown module: %s" % pathname) diff --git a/subdir/__init__.py b/subdir/__init__.py new file mode 100644 index 0000000..cd02b72 --- /dev/null +++ b/subdir/__init__.py @@ -0,0 +1,2 @@ +import foo +import modules_with_same_names_but_different_symbols diff --git a/subdir/foo_tests.py b/subdir/foo_tests.py index a8a9740..ce10d5c 100644 --- a/subdir/foo_tests.py +++ b/subdir/foo_tests.py @@ -1,4 +1,6 @@ -import unittest, foo +import unittest + +from subdir import foo class FooTests(unittest.TestCase): diff --git a/subdir/modules_with_same_names_but_different_symbols/__init__.py b/subdir/modules_with_same_names_but_different_symbols/__init__.py new file mode 100644 index 0000000..909cf90 --- /dev/null +++ b/subdir/modules_with_same_names_but_different_symbols/__init__.py @@ -0,0 +1,2 @@ +import module1 +import module2 diff --git a/subdir/modules_with_same_names_but_different_symbols/module1/__init__.py b/subdir/modules_with_same_names_but_different_symbols/module1/__init__.py new file mode 100644 index 0000000..e1dd07e --- /dev/null +++ b/subdir/modules_with_same_names_but_different_symbols/module1/__init__.py @@ -0,0 +1 @@ +import duplicate diff --git a/subdir/modules_with_same_names_but_different_symbols/module1/duplicate.py b/subdir/modules_with_same_names_but_different_symbols/module1/duplicate.py new file mode 100644 index 0000000..02aa6a1 --- /dev/null +++ b/subdir/modules_with_same_names_but_different_symbols/module1/duplicate.py @@ -0,0 +1,4 @@ +class DuplicateClass(object): + + def a_function(self): + return True diff --git a/subdir/modules_with_same_names_but_different_symbols/module1/duplicate_tests.py b/subdir/modules_with_same_names_but_different_symbols/module1/duplicate_tests.py new file mode 100644 index 0000000..232c510 --- /dev/null +++ b/subdir/modules_with_same_names_but_different_symbols/module1/duplicate_tests.py @@ -0,0 +1,11 @@ +import unittest + +from subdir.modules_with_same_names_but_different_symbols.module1 \ + import duplicate + + +class DuplicateClassTests(unittest.TestCase): + + def test_a_function_works(self): + o = duplicate.DuplicateClass() + self.assertEqual(o.a_function(), True) diff --git a/subdir/modules_with_same_names_but_different_symbols/module2/__init__.py b/subdir/modules_with_same_names_but_different_symbols/module2/__init__.py new file mode 100644 index 0000000..e1dd07e --- /dev/null +++ b/subdir/modules_with_same_names_but_different_symbols/module2/__init__.py @@ -0,0 +1 @@ +import duplicate diff --git a/subdir/modules_with_same_names_but_different_symbols/module2/duplicate.py b/subdir/modules_with_same_names_but_different_symbols/module2/duplicate.py new file mode 100644 index 0000000..75ea503 --- /dev/null +++ b/subdir/modules_with_same_names_but_different_symbols/module2/duplicate.py @@ -0,0 +1,4 @@ +class DifferentClass(object): + + def a_function(self): + return True diff --git a/subdir/modules_with_same_names_but_different_symbols/module2/duplicate_tests.py b/subdir/modules_with_same_names_but_different_symbols/module2/duplicate_tests.py new file mode 100644 index 0000000..dd3abf4 --- /dev/null +++ b/subdir/modules_with_same_names_but_different_symbols/module2/duplicate_tests.py @@ -0,0 +1,11 @@ +import unittest + +from subdir.modules_with_same_names_but_different_symbols.module2 \ + import duplicate + + +class DifferentClassTests(unittest.TestCase): + + def test_a_function_works(self): + o = duplicate.DifferentClass() + self.assertEqual(o.a_function(), True) diff --git a/test-excluded b/test-excluded index 2835413..6314bf9 100644 --- a/test-excluded +++ b/test-excluded @@ -1,2 +1,5 @@ +subdir/__init__.py subdir/bar.py - +subdir/modules_with_same_names_but_different_symbols/module1/__init__.py +subdir/modules_with_same_names_but_different_symbols/module2/__init__.py +subdir/modules_with_same_names_but_different_symbols/__init__.py -- cgit v1.2.1