[Checkins] SVN: z3c.testsetup/branches/new_markers/src/z3c/testsetup/doctesting.py Add a new setup type, that supports new markers.
Uli Fouquet
uli at gnufix.de
Wed Sep 3 07:30:48 EDT 2008
Log message for revision 90740:
Add a new setup type, that supports new markers.
Changed:
U z3c.testsetup/branches/new_markers/src/z3c/testsetup/doctesting.py
-=-
Modified: z3c.testsetup/branches/new_markers/src/z3c/testsetup/doctesting.py
===================================================================
--- z3c.testsetup/branches/new_markers/src/z3c/testsetup/doctesting.py 2008-09-03 11:29:04 UTC (rev 90739)
+++ z3c.testsetup/branches/new_markers/src/z3c/testsetup/doctesting.py 2008-09-03 11:30:47 UTC (rev 90740)
@@ -15,9 +15,10 @@
"""
import unittest
import os.path
+from os import listdir
from zope.testing import doctest, cleanup
from z3c.testsetup.base import BasicTestSetup
-from z3c.testsetup.util import get_package, get_marker_from_file
+from z3c.testsetup.util import get_package, get_marker_from_file, warn
class DocTestSetup(BasicTestSetup):
"""A test setup for doctests."""
@@ -40,8 +41,99 @@
self.globs = globs
if optionflags is not None:
self.optionflags = optionflags
-
+
+class SimpleDocTestSetup(DocTestSetup):
+ """A unified doctest setup for packages.
+ """
+ def getTestSuite(self):
+ docfiles = self.getDocTestFiles(package=self.package)
+ suite = unittest.TestSuite()
+ for name in docfiles:
+ layerdef = get_marker_from_file('layer', name)
+ zcml_layer = self.getZCMLLayer(name, 'zcml-layer')
+ if zcml_layer is not None:
+ layerdef = zcml_layer
+ functional_zcml_layer = self.getZCMLLayer(
+ name, 'functional-zcml-layer')
+ if functional_zcml_layer is not None:
+ layerdef = functional_zcml_layer
+ if os.path.isabs(name):
+ # We get absolute pathnames, but we need relative ones...
+ common_prefix = os.path.commonprefix([self.package.__file__,
+ name])
+ name = name[len(common_prefix):]
+ suite_creator = doctest.DocFileSuite
+ if functional_zcml_layer is not None:
+ from zope.app.testing.functional import FunctionalDocFileSuite
+ suite_creator = FunctionalDocFileSuite
+ test = suite_creator(
+ name,
+ package=self.package,
+ setUp=self.setUp,
+ tearDown=self.tearDown,
+ globs=self.globs,
+ optionflags=self.optionflags,
+ **self.additional_options
+ )
+ if layerdef is not None:
+ test.layer = layerdef
+ suite.addTest(test)
+ return suite
+
+ def getZCMLLayer(self, filepath, marker):
+ """Create a ZCML layer out of a test marker.
+ """
+ zcml_file = get_marker_from_file(marker, filepath)
+ if zcml_file is None:
+ return
+ try:
+ # Late import. Some environments don't have
+ # ``zope.app.testing`` available.
+ from z3c.testsetup.functional.layer import DefaultZCMLLayer
+ except ImportError:
+ warn("""You specified `%s` in
+ %s
+but there seems to be no `zope.app.testing` package available.
+Please include `zope.app.testing` in your project setup to run this testfile.
+""" % (marker, name))
+ layer = DefaultZCMLLayer(
+ os.path.join(os.path.dirname(filepath), zcml_file),
+ DefaultZCMLLayer.__module__,
+ '%s [%s]' % (DefaultZCMLLayer.__name__, zcml_file))
+ return layer
+
+
+ def isTestFile(self, filepath):
+ """Return ``True`` if a file matches our expectations for a
+ doctest file.
+ """
+ if os.path.splitext(filepath)[1].lower() not in self.extensions:
+ return False
+ if get_marker_from_file('doctest', filepath) is None:
+ return False
+ return True
+
+ def getDocTestFiles(self, dirpath=None, **kw):
+ """Find all doctest files filtered by filter_func.
+ """
+ if dirpath is None:
+ dirpath = os.path.dirname(self.package.__file__)
+ dirlist = []
+ for filename in listdir(dirpath):
+ abs_path = os.path.join(dirpath, filename)
+ if not os.path.isdir(abs_path):
+ if self.filter_func(abs_path):
+ dirlist.append(abs_path)
+ continue
+ # Search subdirectories...
+ if not self.isTestDirectory(abs_path):
+ continue
+ subdir_files = self.getDocTestFiles(dirpath=abs_path, **kw)
+ dirlist.extend(subdir_files)
+ return dirlist
+
+
class UnitDocTestSetup(DocTestSetup):
"""A unit test setup for packages.
More information about the Checkins
mailing list