[Distutils] test command for setup.py

Berthold Höllmann hoel@germanlloyd.org
Tue Sep 19 07:28:03 2000

Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

hoel@germanlloyd.org (Berthold H=F6llmann) writes:

> Hello,
> I'm thinking about providing a framework for pre-install testing for
> distutils enabled Python packages. I think about a new "test" command,
> which inserts the lib build path into PYTHONPATH and runs specified
> tests. Is anyone else working on something like this, and what are
> your opinions and requirements on this?

Attatched you find a first version of test.py. This copied into
../distutils/command allows

python setup.py test

First this command calls "build" to enshure a correctly build

It then modifies "sys.path" to point it to the build directory,
imports files from a subdirectory, and calls a function named "test"
in the imported module. The default name of the subdirectory is
"test". From this directory by default all modules named "test_*.py"
are imported.

Additional options are:

  - test_dir (test-dir): name of the directory containg the test files
                 (default: "test")

  - test_prefix (test-prefix): prefix for the test files. (default:

  - test_suffixes (test-suffixes): suffixes used to generate filenames
                 for the tests (default: None, which means: look for
                 all files in test_dir named test_prefix<something>.py
                 and list all <somethings>s for test_suffixes).

I took build.py as a template for writing this.


Content-Type: application/octet-stream
Content-Disposition: attachment; filename=test.py


Implements the Distutils 'test' command."""

# created 2000/09/18, Greg Ward

__revision__ = "$Id"

import sys, os
from distutils.core import Command
from distutils.util import get_platform

class test (Command):

    description = "test the distribution prior to install"

    user_options = [
        ('build-base=', 'b',
         "base directory for build library"),
        ('build-purelib=', None,
         "build directory for platform-neutral distributions"),
        ('build-platlib=', None,
         "build directory for platform-specific distributions"),
        ('build-lib=', None,
         "build directory for all distribution (defaults to either " +
         "build-purelib or build-platlib"),
        ('build-scripts=', None,
         "build directory for scripts"),
        ('test-dir=', None,
         "directory that contains the test definitions"),
        ('test-prefix=', None,
         "prefix to the testcase filename"),
        ('test-suffix=', None,
         "a list of suffixes used to generate names the of the testcases")

    def initialize_options (self):
        self.build_base = 'build'
        # these are decided only after 'build_base' has its final value
        # (unless overridden by the user or client)
        self.build_purelib = None
        self.build_platlib = None
        self.build_lib = None
        self.build_scripts = None
        self.test_dir = 'test'
        self.test_prefix = 'test_'
        self.test_suffixes = None
    def finalize_options (self):

        # Need this to name platform-specific directories, but sys.platform
        # is not enough -- it only names the OS and version, not the
        # hardware architecture!
        self.plat = get_platform ()

        # 'build_purelib' and 'build_platlib' just default to 'lib' and
        # 'lib.<plat>' under the base build directory.  We only use one of
        # them for a given distribution, though --
        if self.build_purelib is None:
            self.build_purelib = os.path.join (self.build_base, 'lib')
        if self.build_platlib is None:
            self.build_platlib = os.path.join (self.build_base,
                                               'lib.' + self.plat)

        # 'build_lib' is the actual directory that we will use for this
        # particular module distribution -- if user didn't supply it, pick
        # one of 'build_purelib' or 'build_platlib'.
        if self.build_lib is None:
            if self.distribution.ext_modules:
                self.build_lib = self.build_platlib
                self.build_lib = self.build_purelib

        if self.build_scripts is None:
            self.build_scripts = os.path.join (self.build_base, 'scripts')

        if self.test_suffixes is None:
            self.test_suffixes = []
            pref_len = len(self.test_prefix)
            for file in os.listdir(self.test_dir):
                if (file[-3:] == ".py" and
    # finalize_options ()

    def run (self):

        # Invoke the 'build' command to "build" pure Python modules
        # (ie. copy 'em into the build tree)
        self.run_command ('build')

        # remember old sys.path to restore it afterwards
        old_path = sys.path[:]

        # extend sys.path
        sys.path.insert(0, self.build_purelib)
        sys.path.insert(0, self.build_platlib)
        sys.path.insert(0, self.test_dir)

        # build include path for test
        for case in self.test_suffixes:
            TEST = __import__(self.test_prefix+case,
                              globals(), locals(),

        # restore sys.path
        sys.path = old_path[:]

# class test


       email: hoel@GermanLloyd.org
   )   tel. : +49 (40) 3 61 49 - 73 74
C[_]  These opinions might be mine, but never those of my employer.