[py-svn] r57771 - py/trunk/contrib/py_unittest

hpk at codespeak.net hpk at codespeak.net
Tue Sep 2 21:08:48 CEST 2008


Author: hpk
Date: Tue Sep  2 21:08:45 2008
New Revision: 57771

Added:
   py/trunk/contrib/py_unittest/
   py/trunk/contrib/py_unittest/conftest.py   (contents, props changed)
   py/trunk/contrib/py_unittest/readme.txt   (contents, props changed)
   py/trunk/contrib/py_unittest/test_conftest.py   (contents, props changed)
Log:
adding Guido's py_unittest unittest TestCase collector, adapting to py/trunk API and simplifing it a bit. 



Added: py/trunk/contrib/py_unittest/conftest.py
==============================================================================
--- (empty file)
+++ py/trunk/contrib/py_unittest/conftest.py	Tue Sep  2 21:08:45 2008
@@ -0,0 +1,71 @@
+import py
+import unittest
+import sys
+from py.__.test.collect import configproperty as _configproperty
+unittest.failureException = AssertionError
+
+def configproperty(name):
+    def fget(self):
+        ret = self._config.getvalue(name, self.fspath)
+        return ret
+    return property(fget)
+
+class Module(py.test.collect.Module):
+    UnitTestCase = configproperty('UnitTestCase')
+    def makeitem(self, name, obj, usefilters=True):
+        # XXX add test_suite() support(?)
+        if py.std.inspect.isclass(obj) and issubclass(obj, unittest.TestCase):
+            return self.UnitTestCase(name, parent=self)
+        elif callable(obj) and getattr(obj, 'func_name', '') == 'test_suite':
+            return None
+        return super(Module, self).makeitem(name, obj, usefilters)
+
+class UnitTestCase(py.test.collect.Class):
+    TestCaseInstance = configproperty('TestCaseInstance')
+    def collect(self):
+        return [self.TestCaseInstance("()", self)]
+
+    def setup(self):
+        pass
+
+    def teardown(self):
+        pass
+
+_dummy = object()
+class TestCaseInstance(py.test.collect.Instance):
+    UnitTestFunction = configproperty('UnitTestFunction')
+    def collect(self):
+        loader = unittest.TestLoader()
+        names = loader.getTestCaseNames(self.obj.__class__)
+        l = []
+        for name in names:
+            callobj = getattr(self.obj, name)
+            if callable(callobj):
+                l.append(self.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()
+

Added: py/trunk/contrib/py_unittest/readme.txt
==============================================================================
--- (empty file)
+++ py/trunk/contrib/py_unittest/readme.txt	Tue Sep  2 21:08:45 2008
@@ -0,0 +1,6 @@
+code for collecting traditional unit tests based on
+
+    http://johnnydebris.net/svn/projects/py_unittest
+
+from Guido Wesdorp. 
+

Added: py/trunk/contrib/py_unittest/test_conftest.py
==============================================================================
--- (empty file)
+++ py/trunk/contrib/py_unittest/test_conftest.py	Tue Sep  2 21:08:45 2008
@@ -0,0 +1,64 @@
+import py
+from py.__.test.outcome import Failed
+from py.__.test.testing import suptest
+conftestpath = py.magic.autopath().dirpath("conftest.py")
+
+class TestTestCaseInstance(suptest.InlineSession):
+    def setup_method(self, method):
+        super(TestTestCaseInstance, self).setup_method(method)
+        self.tmpdir.ensure("__init__.py")
+        conftestpath.copy(self.tmpdir.join(conftestpath.basename))
+         
+    def test_simple_unittest(self):
+        test_one = self.makepyfile(test_one="""
+            import unittest
+            class MyTestCase(unittest.TestCase):
+                def test_passing(self):
+                    self.assertEquals('foo', 'foo')
+        """)
+        sorter = self.parse_and_run(test_one)
+        rep = sorter.getreport("test_passing")
+        assert rep.passed
+
+    def test_simple_failing(self):
+        test_one = self.makepyfile(test_one="""
+            import unittest
+            class MyTestCase(unittest.TestCase):
+                def test_failing(self):
+                    self.assertEquals('foo', 'bar')
+        """)
+        sorter = self.parse_and_run(test_one)
+        rep = sorter.getreport("test_failing")
+        assert rep.failed
+
+    def test_setup(self):
+        test_one = self.makepyfile(test_one="""
+            import unittest
+            class MyTestCase(unittest.TestCase):
+                def setUp(self):
+                    self.foo = 1
+                def test_setUp(self):
+                    self.assertEquals(1, self.foo)
+        """)
+        sorter = self.parse_and_run(test_one)
+        rep = sorter.getreport("test_setUp")
+        assert rep.passed
+
+    def test_teardown(self):
+        test_one = self.makepyfile(test_one="""
+            import unittest
+            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])
+        """)
+        sorter = self.parse_and_run(test_one)
+        passed, skipped, failed = sorter.countoutcomes()
+        assert passed + skipped + failed == 2
+        assert failed == 0, failed
+        assert passed == 2



More information about the pytest-commit mailing list