mdwsetup.py: Add a command for running tests.
authorMark Wooding <mdw@distorted.org.uk>
Wed, 9 Oct 2019 18:50:56 +0000 (19:50 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Fri, 8 May 2020 11:30:13 +0000 (12:30 +0100)
mdwsetup.py
pysetup.mk

index 0bce572..55120fb 100644 (file)
@@ -288,6 +288,46 @@ class build (_build, Command):
   sub_commands = [('build_gen', lambda me: me.distribution.genfiles)]
   sub_commands += _build.sub_commands
 
+class test (Command):
+  """
+  Run unit tests, according to the `unittests'.
+
+  The `unittests' keyword argument to `setup' lists module names (or other
+  things acceptable to the `loadTestsFromNames' test-loader method) to be
+  run.  The build library directory is prepended to the load path before
+  running the tests to ensure that the newly built modules are tested.  If
+  `unittest_dir' is set, then this is appended to the load path so that test
+  modules can be found there.
+  """
+  NAME = "test"
+  description = "run the included test suite"
+
+  user_options = \
+    [('build-lib=', 'b', "directory containing compiled moules"),
+     ('tests=', 't', "tests to run"),
+     ('verbose-test', 'V', "run tests verbosely")]
+
+  def initialize_options(me):
+    me.build_lib = None
+    me.verbose_test = False
+    me.tests = None
+  def finalize_options(me):
+    me.set_undefined_options('build', ('build_lib', 'build_lib'))
+  def run(me):
+    import unittest as U
+    d = me.distribution
+    SYS.path = [me.build_lib] + SYS.path
+    if d.unittest_dir is not None: SYS.path.append(d.unittest_dir)
+    if me.tests is not None: tests = me.tests.split(",")
+    else: tests = d.unittests
+    suite = U.defaultTestLoader.loadTestsFromNames(tests)
+    runner = U.TextTestRunner(verbosity = me.verbose_test and 2 or 1)
+    if me.dry_run: return
+    result = runner.run(suite)
+    if result.errors or result.failures or \
+       getattr(result, "unexpectedSuccesses", 0):
+      SYS.exit(2)
+
 class clean_gen (Command):
   """
   Remove the generated files, as listed in `genfiles'.
@@ -351,6 +391,8 @@ class Dist (DC.Distribution):
   ## our enhanced commands.
   def __init__(me, attrs = None):
     me.genfiles = []
+    me.unittest_dir = None
+    me.unittests = []
     me.cleanfiles = []
     me._auto_version_p = False
     DC.Distribution.__init__(me, attrs)
index c828b02..70af80b 100644 (file)
@@ -35,6 +35,8 @@ PYTARGETS             += install
 OPTS-install           += --prefix $(prefix)
 
 PYTARGETS              += check
+CMD-check              ?= test
+$(foreach p,$(PYTHONS),check/$p):: check/%: all/%
 
 ###--------------------------------------------------------------------------
 ### Interfacing `setup.py' to make.