merged ronny's nose-compatibility hacks, i.e. nosestyle
setup_module() and setup() functions are supported. added a few notes to changelog and documentation about it --HG-- branch : trunk
This commit is contained in:
		
						commit
						cc3404b832
					
				|  | @ -1,7 +1,7 @@ | |||
| """nose-compatibility plugin: allow to run nose test suites natively.  | ||||
| 
 | ||||
| This is an experimental plugin for allowing to run tests written  | ||||
| in 'nosetests' style with py.test.   | ||||
| in 'nosetests style with py.test.    | ||||
| 
 | ||||
| Usage | ||||
| ------------- | ||||
|  | @ -10,26 +10,32 @@ type:: | |||
| 
 | ||||
|     py.test  # instead of 'nosetests' | ||||
| 
 | ||||
| and you should be able to run nose style tests.  You will of course  | ||||
| get py.test style reporting and its feature set.  | ||||
| and you should be able to run nose style tests and at the same | ||||
| time can make full use of py.test's capabilities.   | ||||
| 
 | ||||
| Issues?  | ||||
| ---------------- | ||||
| Supported nose Idioms | ||||
| ---------------------- | ||||
| 
 | ||||
| If you find issues or have suggestions please run::  | ||||
| * setup and teardown at module/class/method level | ||||
| * SkipTest exceptions and markers  | ||||
| * setup/teardown decorators | ||||
| * yield-based tests and their setup  | ||||
| * general usage of nose utilities  | ||||
| 
 | ||||
|     py.test --pastebin=all  | ||||
| 
 | ||||
| and send the resulting URL to a some contact channel.  | ||||
| 
 | ||||
| Known issues  | ||||
| ------------------ | ||||
| Unsupported idioms / issues | ||||
| ---------------------------------- | ||||
| 
 | ||||
| - nose-style doctests are not collected and executed correctly, | ||||
|   also fixtures don't work.  | ||||
| 
 | ||||
| - no nose-configuration is recognized  | ||||
| 
 | ||||
| If you find other issues or have suggestions please run::  | ||||
| 
 | ||||
|     py.test --pastebin=all  | ||||
| 
 | ||||
| and send the resulting URL to a py.test contact channel, | ||||
| at best to the mailing list.  | ||||
| """ | ||||
| import py | ||||
| import inspect | ||||
|  | @ -66,11 +72,14 @@ def pytest_runtest_setup(item): | |||
|                 if isinstance(gen.parent, py.test.collect.Instance): | ||||
|                     call_optional(gen.parent.obj, 'setup') | ||||
|                 gen._nosegensetup = True | ||||
|         call_optional(item.obj, 'setup') | ||||
|         if not call_optional(item.obj, 'setup'): | ||||
|             # call module level setup if there is no object level one | ||||
|             call_optional(item.parent.obj, 'setup') | ||||
| 
 | ||||
| def pytest_runtest_teardown(item): | ||||
|     if isinstance(item, py.test.collect.Function): | ||||
|         call_optional(item.obj, 'teardown') | ||||
|         if not call_optional(item.obj, 'teardown'): | ||||
|             call_optional(item.parent.obj, 'teardown') | ||||
|         #if hasattr(item.parent, '_nosegensetup'): | ||||
|         #    #call_optional(item._nosegensetup, 'teardown') | ||||
|         #    del item.parent._nosegensetup | ||||
|  | @ -82,4 +91,9 @@ def pytest_make_collect_report(collector): | |||
| def call_optional(obj, name): | ||||
|     method = getattr(obj, name, None) | ||||
|     if method: | ||||
|         argspec = inspect.getargspec(method) | ||||
|         if argspec[0] == ['self']: | ||||
|             argspec = argspec[1:] | ||||
|         if not any(argspec): | ||||
|             method() | ||||
|             return True | ||||
|  |  | |||
|  | @ -161,13 +161,24 @@ class Module(py.test.collect.File, PyCollectorMixin): | |||
|     def setup(self):  | ||||
|         if getattr(self.obj, 'disabled', 0): | ||||
|             py.test.skip("%r is disabled" %(self.obj,)) | ||||
|         mod = self.obj | ||||
|         if hasattr(mod, 'setup_module'):  | ||||
|             self.obj.setup_module(mod) | ||||
|         if hasattr(self.obj, 'setup_module'):  | ||||
|             #XXX: nose compat hack, move to nose plugin | ||||
|             # if it takes a positional arg, its probably a py.test style one | ||||
|             # so we pass the current module object | ||||
|             if inspect.getargspec(self.obj.setup_module)[0]: | ||||
|                 self.obj.setup_module(self.obj) | ||||
|             else: | ||||
|                 self.obj.setup_module() | ||||
| 
 | ||||
|     def teardown(self):  | ||||
|         if hasattr(self.obj, 'teardown_module'):  | ||||
|             #XXX: nose compat hack, move to nose plugin | ||||
|             # if it takes a positional arg, its probably a py.test style one | ||||
|             # so we pass the current module object | ||||
|             if inspect.getargspec(self.obj.teardown_module)[0]: | ||||
|                 self.obj.teardown_module(self.obj) | ||||
|             else: | ||||
|                 self.obj.teardown_module() | ||||
| 
 | ||||
| class Class(PyCollectorMixin, py.test.collect.Collector):  | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,6 +1,5 @@ | |||
| 
 | ||||
| import py | ||||
| import sys | ||||
| import os, sys | ||||
| WIDTH = 75 | ||||
| 
 | ||||
| plugins = [ | ||||
|  | @ -269,6 +268,9 @@ class PluginDoc(RestWriter): | |||
|             self.Print(opt.help, indent=4) | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     if os.path.exists("py"): | ||||
|         sys.path.insert(0, os.getcwd()) | ||||
|     import py | ||||
|     _config = py.test.config | ||||
|     _config.parse([]) | ||||
|     _config.pluginmanager.do_configure(_config) | ||||
|  |  | |||
|  | @ -1,6 +1,10 @@ | |||
| Changes between 1.0.2 and '1.1.0b1' | ||||
| ===================================== | ||||
| 
 | ||||
| * merged Ronny's nose-compatibility hacks: now | ||||
|   nose-style setup_module() and setup() functions are  | ||||
|   supported | ||||
| 
 | ||||
| * introduce generalized py.test.mark function marking | ||||
| 
 | ||||
| * reshuffle / refine command line grouping | ||||
|  |  | |||
|  | @ -8,7 +8,7 @@ nose-compatibility plugin: allow to run nose test suites natively. | |||
|   :local: | ||||
| 
 | ||||
| This is an experimental plugin for allowing to run tests written  | ||||
| in 'nosetests' style with py.test.   | ||||
| in 'nosetests style with py.test.    | ||||
| 
 | ||||
| Usage | ||||
| ------------- | ||||
|  | @ -17,26 +17,33 @@ type:: | |||
| 
 | ||||
|     py.test  # instead of 'nosetests' | ||||
| 
 | ||||
| and you should be able to run nose style tests.  You will of course  | ||||
| get py.test style reporting and its feature set.  | ||||
| and you should be able to run nose style tests and at the same | ||||
| time can make full use of py.test's capabilities.   | ||||
| 
 | ||||
| Issues?  | ||||
| ---------------- | ||||
| Supported nose Idioms | ||||
| ---------------------- | ||||
| 
 | ||||
| If you find issues or have suggestions please run::  | ||||
| * setup and teardown at module/class/method level | ||||
| * SkipTest exceptions and markers  | ||||
| * setup/teardown decorators | ||||
| * yield-based tests and their setup  | ||||
| * general usage of nose utilities  | ||||
| 
 | ||||
|     py.test --pastebin=all  | ||||
| 
 | ||||
| and send the resulting URL to a some contact channel.  | ||||
| 
 | ||||
| Known issues  | ||||
| ------------------ | ||||
| Unsupported idioms / issues | ||||
| ---------------------------------- | ||||
| 
 | ||||
| - nose-style doctests are not collected and executed correctly, | ||||
|   also fixtures don't work.  | ||||
| 
 | ||||
| - no nose-configuration is recognized  | ||||
| 
 | ||||
| If you find other issues or have suggestions please run::  | ||||
| 
 | ||||
|     py.test --pastebin=all  | ||||
| 
 | ||||
| and send the resulting URL to a py.test contact channel, | ||||
| at best to the mailing list. | ||||
| 
 | ||||
| Start improving this plugin in 30 seconds | ||||
| ========================================= | ||||
| 
 | ||||
|  |  | |||
|  | @ -85,3 +85,54 @@ def test_nose_test_generator_fixtures(testdir): | |||
|     ]) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| def test_module_level_setup(testdir): | ||||
|     testdir.makepyfile(""" | ||||
|         from nose.tools import with_setup | ||||
|         items = {} | ||||
|         def setup(): | ||||
|             items[1]=1 | ||||
| 
 | ||||
|         def teardown(): | ||||
|             del items[1] | ||||
| 
 | ||||
|         def setup2(): | ||||
|             items[2] = 2 | ||||
| 
 | ||||
|         def teardown2(): | ||||
|             del items[2] | ||||
| 
 | ||||
|         def test_setup_module_setup(): | ||||
|             assert items[1] == 1 | ||||
| 
 | ||||
|         @with_setup(setup2, teardown2) | ||||
|         def test_local_setup(): | ||||
|             assert items[2] == 2 | ||||
|             assert 1 not in items | ||||
| 
 | ||||
|     """) | ||||
|     result = testdir.runpytest('-p', 'nose') | ||||
|     result.stdout.fnmatch_lines([ | ||||
|         "*2 passed*", | ||||
|     ]) | ||||
| 
 | ||||
| def test_nose_style_setup_teardown(testdir): | ||||
|     testdir.makepyfile(""" | ||||
|         l = [] | ||||
|         def setup_module(): | ||||
|             l.append(1) | ||||
| 
 | ||||
|         def teardown_module(): | ||||
|             del l[0] | ||||
| 
 | ||||
|         def test_hello(): | ||||
|             assert l == [1] | ||||
| 
 | ||||
|         def test_world(): | ||||
|             assert l == [1] | ||||
|         """) | ||||
|     result = testdir.runpytest('-p', 'nose') | ||||
|     result.stdout.fnmatch_lines([ | ||||
|         "*2 passed*", | ||||
|     ]) | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue