Metadata-Version: 1.0
Name: unittest2
Version: 0.5.1
Summary: The new features in unittest for Python 2.7 backported to Python 2.3+.
Home-page: http://pypi.python.org/pypi/unittest2
Author: Michael Foord
Author-email: michael@voidspace.org.uk
License: UNKNOWN
Description: unittest2 is a backport of the new features added to the unittest testing
        framework in Python 2.7. It is tested to run on Python 2.4 - 2.7.
        
        Thanks to Mark Roddy, there is also a version of for Python 2.3. This is
        maintained as a separate branch and is a separate download.
        
        To use unittest2 instead of unittest simply replace ``import unittest`` with
        ``import unittest2``.
        
        unittest2 is maintained in a mercurial repository. The issue tracker is on
        google code:
        
        * `unittest2 hg <http://hg.python.org/unittest2>`_
        * `unittest2 issue tracker
          <http://code.google.com/p/unittest-ext/issues/list>`_
        * `Article / Docs: New features in unittest
          <http://www.voidspace.org.uk/python/articles/unittest2.shtml>`_
        
        
        Classes in unittest2 derive from the appropriate classes in unittest, so it
        should be possible to use the unittest2 test running infrastructure without
        having to switch all your tests to using unittest2 immediately. Similarly
        you can use the new assert methods on ``unittest2.TestCase`` with the standard
        unittest test running infrastructure. Not all of the new features in unittest2
        will work with the standard unittest test loaders, runners result objects
        however.
        
        New features include:
        
        * ``addCleanups`` - better resource management
        * *many* new assert methods including better defaults for comparing lists,
          sets, dicts unicode strings etc and the ability to specify new default methods
          for comparing specific types
        * ``assertRaises`` as context manager, with access to the exception afterwards 
        * test discovery and new command line options (including failfast and better
          handling of ctrl-C during test runs)
        * class and module level fixtures: ``setUpClass``, ``tearDownClass``,
          ``setUpModule``, ``tearDownModule``
        * test skipping and expected failures
        * new ``delta`` keyword argument to ``assertAlmostEqual`` for more useful
          comparison and for comparing non-numeric objects (like datetimes)
        * ``load_tests`` protocol for loading tests from modules or packages 
        * ``startTestRun`` and ``stopTestRun`` methods on TestResult
        * various other API improvements and fixes
        
        .. note:: Command line usage
        
            In Python 2.7 you invoke the unittest command line features (including test
            discover) with ``python -m unittest <args>``. As unittest is a package, and
            the ability to invoke packages with ``python -m ...`` is new in Python 2.7,
            we can't do this for unittest2.
            
            Instead unittest2 comes with a script ``unit2``. 
            `Command line usage
            <http://docs.python.org/dev/library/unittest.html#command-line-interface>`_::
            
                unit2 discover
                unit2 -v test_module
            
            There is also a copy of this script called ``unit2.py``, useful for Windows
            which uses file-extensions rather than shebang lines to determine what
            program to execute files with. Both of these scripts are installed by
            distutils.
        
        Until I write proper documentation, the best information on all the new features
        is the development version of the Python documentation for Python 2.7:
        
        * http://docs.python.org/dev/library/unittest.html
        
        Look for notes about features added or changed in Python 2.7.
        
        .. note::
        
            unittest2 is already in use for development of`distutils2
            <http://hg.python.org/distutils2>`_.
            
            Version 0.5.0 of unittest2 has feature parity with unittest_ in Python 2.7
            final. If you want to ensure that your tests run identically under unittest2
            and unittest in Python 2.7 you should use unittest2 0.5.0.
            
            Later versions of unittest2 include changes in unittest made in Python 3.2
            and onwards after the release of Python 2.7.
        
        
        .. _unittest: http://docs.python.org/release/2.7/library/unittest.html
        
        
        Differences
        ===========
        
        Differences between unittest2 and unittest in Python 2.7:
        
        ``assertItemsEqual`` does not silence Py3k warnings as this uses
        ``warnings.catch_warnings()`` which is new in Python 2.6 (and is used as a
        context manager which would be a pain to make work with Python 2.4).
        
        The underlying dictionary storing the type equality functions on TestCase is a
        custom object rather than a real dictionary. This allows TestCase instances to
        be deep-copyable on Python versions prior to 2.7.
        
        ``TestCase.longMessage`` defaults to True because it is better. It defaults to
        False in Python 2.7 for backwards compatibility reasons.
        
        ``python -m package`` doesn't work in versions of Python before Python 2.7. The
        command line features of unittest2 are provided by a ``unit2`` (and 
        ``unit2.py``) script instead.
        
        unittest2 includes a very basic setuptools compatible test collector. Specify
        ``test_suite = 'unittest2.collector'`` in your setup.py. This starts test
        discovery with the default parameters from the directory containing setup.py, so
        it is perhaps most useful as an example (see unittest2/collector.py).
        
        
        
        Issues
        ======
        
        A ``TestResult`` object with unexpected successes returns True
        for ``result.wasSuccessful()``. Difficult to know if this is the correct
        behaviour or not.
        
        If a dotted path name is used for test discovery then a globally installed
        module/package will still be used in preference of one in the current
        directory. When doing discovery from a dotted path name we could check for this
        specific case.
        
        The ``removeHandler`` decorator could also be a context manager.
        
        `Issue 8313: <http://bugs.python.org/issue8313>`_, \<unprintable AssertionError object\>
        message in unittest tracebacks, is hard to fix in versions of Python before 2.7.
        The fix in Python 2.7 relies on changes to both the traceback module and
        traceback objects. As the issue is rare I am leaving it unfixed in unittest2.
        
        There are several places in unittest2 (and unittest) that call ``str(...)`` on
        exceptions to get the exception message. This can fail if the exception was
        created with non-ascii unicode. This is rare and I won't address it unless it is
        actually reported as a problem for someone.
        
        A comparison of text or long sequences (using ``assertSequenceEqual`` or
        ``assertMultiLineEqual`` etc) can take a *long* time to generate diffs for
        failure messages. These methods use ``prettyprint`` and ``difflib``.
        
        
        CHANGELOG
        =========
        
        2010/07/12 - 0.5.1
        ------------------
        
        Reverted script names created by setuptools back to "unit2" instead of
        "unit2.py". (Not necessary as setuptools creates stub .exes for console scripts
        anyway.)
        
        
        2010/07/11 - 0.5.0
        ------------------
        
        Addition of a setuptools compatible test collector (very basic). Specify
        ``test_suite = 'unittest2.collector'`` in your setup.py.
        
        ``TestSuite.debug()`` and ``TestCase.debug()`` now execute cleanup functions
        and class and module level setups and teardowns.
        
        No longer monkey-patch os.path.relpath for Python 2.4 / 2.5 so that projects
        don't accidentally depend on our patching. Contributed by Konrad Delong.
        
        Added a Python version specific unit2 entrypoint. This will, for example,
        create a ``unit2-2.6`` script if unittest2 is installed with Python 2.6.
        (Requires setuptools or distribute.)
        
        Python 2.3 compatibility (in the python2.3 branch of the repository),
        contributed by Mark Roddy.
        
        setuptools console script entry points are created as '.py' scripts on Windows.
        
        Feature parity with the Python 2.7 final release.
        
        
        2010/06/06 - 0.4.2
        ------------------
        
        Improved help message for ``unit2 discover -h``.
        
        SkipTest in unittest.TestCase.setUpClass or setUpModule is now reported as a 
        skip rather than an error.
        
        Excessively large diffs due to ``TestCase.assertSequenceEqual`` are no
        longer included in failure reports. (Controlled by ``TestCase.maxDiff``.)
        
        Matching files during test discovery is done in ``TestLoader._match_path``. This
        method can be overriden in subclasses to, for example, match on the full file
        path or use regular expressions for matching.
        
        Addition of a setuptools compatible entrypoint for the unit2 test runner script.
        Contributed by Chris Withers.
        
        Tests fixed to be compatible with Python 2.7, where deprecation warnings are
        silenced by default.
        
        Feature parity with unittest in Python 2.7 RC 1.
        
        
        2010/05/09 - 0.4.1
        ------------------
        
        If test discovery imports a module from the wrong location (usually because the
        module is globally installed and the user is expecting to run tests against a
        development version in a different location) then discovery halts with an
        ``ImportError`` and the problem is reported.
        
        Added docstrings to ``assertRegexpMatches`` and ``assertNotRegexpMatches``.
        
        Putting functions in test suites no longer crashes.
        
        Feature parity with unittest in Python 2.7 Beta 2.
        
        2010/04/08 - 0.4.0
        ------------------
        
        Addition of ``removeHandler`` for removing the control-C handler.
        
        ``delta`` keyword argument for ``assertAlmostEqual`` and
        ``assertNotAlmostEqual``.
        
        Addition of -b command line option (and ``TestResult.buffer``) for buffering 
        stdout / stderr during test runs.
        
        Addition of ``TestCase.assertNotRegexpMatches``.
        
        Allow test discovery using dotted module names instead of a path.
        
        All imports requiring the signal module are now optional, for compatiblity
        with IronPython (or other platforms without this module).
        
        Tests fixed to be compatible with nosetest.
        
        
        2010/03/26 - 0.3.0
        ------------------
        
        ``assertSameElements`` removed and ``assertItemsEqual`` added; assert that
        sequences contain the same elements.
        
        Addition of -f/--failfast command line option, stopping test run on first
        failure or error.
        
        Addition of -c/--catch command line option for better control-C handling during
        test runs.
        
        Added ``BaseTestSuite``, for use by frameworks that don't want to support shared
        class and module fixtures.
        
        Skipped test methods no longer have ``setUp`` and ``tearDown`` called around
        them.
        
        Faulty ``load_tests`` functions no longer halt test discovery.
        
        Using non-strings for failure messages now works.
        
        Potential for ``UnicodeDecodeError`` whilst creating failure messages fixed.
        
        Split out monolithic test module into a package.
        
        BUGFIX: Correct usage message now shown for unit2 scripts.
        
        BUGFIX: ``__unittest`` in module globals trims frames from that module in
        reported stacktraces.
        
        
        2010/03/06 - 0.2.0
        ------------------
        
        The ``TextTestRunner`` is now compatible with old result objects and standard
        (non-TextTestResult) ``TestResult`` objects.
        
        ``setUpClass`` / ``tearDownClass`` / ``setUpModule`` / ``tearDownModule`` added.
        
        
        2010/02/22 - 0.1.6
        ------------------
        
        Fix for compatibility with old ``TestResult`` objects. New tests can now be run
        with nosetests (with a DeprecationWarning for ``TestResult`` objects without
        methods to support skipping etc).
        
        
        0.1
        ---
        
        Initial release.
        
        
        TODO
        ====
        
        * Document ``SkipTest``, ``BaseTestSuite```
        
Keywords: unittest,testing,tests
Platform: UNKNOWN
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2.3
Classifier: Programming Language :: Python :: 2.4
Classifier: Programming Language :: Python :: 2.5
Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Operating System :: OS Independent
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: Software Development :: Testing
