122 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
| """
 | |
| automatically discover and run traditional "unittest.py" style tests. 
 | |
| 
 | |
| Usage
 | |
| ----------------
 | |
| 
 | |
| This plugin collects and runs Python `unittest.py style`_ tests. 
 | |
| It will automatically collect ``unittest.TestCase`` subclasses 
 | |
| and their ``test`` methods from the test modules of a project
 | |
| (usually following the ``test_*.py`` pattern). 
 | |
| 
 | |
| This plugin is enabled by default. 
 | |
| 
 | |
| .. _`unittest.py style`: http://docs.python.org/library/unittest.html
 | |
| """
 | |
| import py
 | |
| import sys
 | |
| 
 | |
| def pytest_pycollect_makeitem(collector, name, obj):
 | |
|     if 'unittest' not in sys.modules:
 | |
|         return # nobody could have possibly derived a subclass 
 | |
|     if py.std.inspect.isclass(obj) and issubclass(obj, py.std.unittest.TestCase):
 | |
|         return UnitTestCase(name, parent=collector)
 | |
| 
 | |
| class UnitTestCase(py.test.collect.Class):
 | |
|     def collect(self):
 | |
|         return [UnitTestCaseInstance("()", self)]
 | |
| 
 | |
|     def setup(self):
 | |
|         pass
 | |
| 
 | |
|     def teardown(self):
 | |
|         pass
 | |
| 
 | |
| _dummy = object()
 | |
| class UnitTestCaseInstance(py.test.collect.Instance):
 | |
|     def collect(self):
 | |
|         loader = py.std.unittest.TestLoader()
 | |
|         names = loader.getTestCaseNames(self.obj.__class__)
 | |
|         l = []
 | |
|         for name in names:
 | |
|             callobj = getattr(self.obj, name)
 | |
|             if callable(callobj):
 | |
|                 l.append(UnitTestFunction(name, parent=self))
 | |
|         return l
 | |
| 
 | |
|     def _getobj(self):
 | |
|         x = self.parent.obj
 | |
|         return self.parent.obj(methodName='run')
 | |
|         
 | |
| class UnitTestFunction(py.test.collect.Function):
 | |
|     def __init__(self, name, parent, args=(), obj=_dummy, sort_value=None):
 | |
|         super(UnitTestFunction, self).__init__(name, parent)
 | |
|         self._args = args
 | |
|         if obj is not _dummy:
 | |
|             self._obj = obj
 | |
|         self._sort_value = sort_value
 | |
| 
 | |
|     def runtest(self):
 | |
|         target = self.obj
 | |
|         args = self._args
 | |
|         target(*args)
 | |
| 
 | |
|     def setup(self):
 | |
|         instance = self.obj.im_self
 | |
|         instance.setUp()
 | |
| 
 | |
|     def teardown(self):
 | |
|         instance = self.obj.im_self
 | |
|         instance.tearDown()
 | |
| 
 | |
| 
 | |
| def test_simple_unittest(testdir):
 | |
|     testpath = testdir.makepyfile("""
 | |
|         import unittest
 | |
|         pytest_plugins = "pytest_unittest"
 | |
|         class MyTestCase(unittest.TestCase):
 | |
|             def testpassing(self):
 | |
|                 self.assertEquals('foo', 'foo')
 | |
|             def test_failing(self):
 | |
|                 self.assertEquals('foo', 'bar')
 | |
|     """)
 | |
|     reprec = testdir.inline_run(testpath)
 | |
|     assert reprec.matchreport("testpassing").passed
 | |
|     assert reprec.matchreport("test_failing").failed 
 | |
| 
 | |
| def test_setup(testdir):
 | |
|     testpath = testdir.makepyfile(test_two="""
 | |
|         import unittest
 | |
|         pytest_plugins = "pytest_unittest" # XXX 
 | |
|         class MyTestCase(unittest.TestCase):
 | |
|             def setUp(self):
 | |
|                 self.foo = 1
 | |
|             def test_setUp(self):
 | |
|                 self.assertEquals(1, self.foo)
 | |
|     """)
 | |
|     reprec = testdir.inline_run(testpath)
 | |
|     rep = reprec.matchreport("test_setUp")
 | |
|     assert rep.passed
 | |
| 
 | |
| def test_teardown(testdir):
 | |
|     testpath = testdir.makepyfile(test_three="""
 | |
|         import unittest
 | |
|         pytest_plugins = "pytest_unittest" # XXX 
 | |
|         class MyTestCase(unittest.TestCase):
 | |
|             l = []
 | |
|             def test_one(self):
 | |
|                 pass
 | |
|             def tearDown(self):
 | |
|                 self.l.append(None)
 | |
|         class Second(unittest.TestCase):
 | |
|             def test_check(self):
 | |
|                 self.assertEquals(MyTestCase.l, [None])
 | |
|     """)
 | |
|     reprec = testdir.inline_run(testpath)
 | |
|     passed, skipped, failed = reprec.countoutcomes()
 | |
|     print "COUNTS", passed, skipped, failed
 | |
|     assert failed == 0, failed
 | |
|     assert passed == 2
 | |
|     assert passed + skipped + failed == 2
 | |
| 
 |