80 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.2 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 derived unittest.TestCase
 | 
						|
    try:
 | 
						|
        isunit = issubclass(obj, py.std.unittest.TestCase)
 | 
						|
    except TypeError:
 | 
						|
        pass
 | 
						|
    else:
 | 
						|
        if isunit:
 | 
						|
            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 py.builtin.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
 | 
						|
        if hasattr(self.parent, 'newinstance'):
 | 
						|
            self.parent.newinstance()
 | 
						|
            self.obj = self._getobj()
 | 
						|
 | 
						|
    def runtest(self):
 | 
						|
        target = self.obj
 | 
						|
        args = self._args
 | 
						|
        target(*args)
 | 
						|
 | 
						|
    def setup(self):
 | 
						|
        instance = py.builtin._getimself(self.obj)
 | 
						|
        instance.setUp()
 | 
						|
 | 
						|
    def teardown(self):
 | 
						|
        instance = py.builtin._getimself(self.obj)
 | 
						|
        instance.tearDown()
 | 
						|
 |