NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #3712 most downloaded on PyPI
Extensions to the Python standard library unit testing framework
Last release 5 months ago
24 Apr 2026
Release timing varies
gaps range from 1 weeks to 1.7 years
Nearly every release is documented
notes for 59 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
15 years old
64 releases · first in 2011
Don't leak testtools-specific exception details into unittest.TestResult error reports when using a stdlib TestResult. (Jelmer Vernooij, #607)
unittest.TestResult error reports when using a stdlib TestResult.
(Jelmer Vernooij, #607)Add LessThanOrEqual and GreaterThanOrEqual matchers. (Julian Edwards, #594)
Add LessThanOrEqual and GreaterThanOrEqual matchers.
(Julian Edwards, #594)
Improve type annotations throughout the codebase, including compatibility fixes for mypy 1.20.0. (Stephen Finucane, #587, #591, #592, #593, #600)
One column per quarter.
Fix an issue with iterate_tests, which was recently changes to insist on accepting an instance of unittest.TestSuite, breaking some users. (Jelmer Ver
Fix an issue with iterate_tests, which was recently changes to insist
on accepting an instance of unittest.TestSuite, breaking some users.
(Jelmer Vernooij, #584)
Improve the type annotations for testtools.testcase.TestCase.skipTest
(Stephen Finucane, #585)
Correct a URL in the README (Steve Kowalik, #582)
Fix the type annotations for testtools.testcase.TestCase.useFixture (Stephen Finucane, #574)
testtools.testcase.TestCase.useFixture
(Stephen Finucane, #574)Make extract_result() and DeferredNotFired public APIs by @jelmer in #562
Full Changelog: 2.8.3...2.8.4
Clear force_failure in _reset() so that re-running a test
after an expectThat failure can succeed if successful conditions are met again.
(OumarCamara, #563)
Make extract_result() and DeferredNotFired public APIs in
testtools.twistedsupport. These utilities are useful for extracting
results from synchronous Deferreds in tests.
(Jelmer Vernooij, #546)
Add support for unittest.TestCase.subTest. Failures are reported
individually while the entire test method is still treated as a single test.
(Stephen Finucane, #567)
Add testtools.matchers.test module providing a test harness for
users who write their own custom matchers.
(Stephen Finucane)
Re-add compat helpers and helper modules that were accidentally removed in a patch release, breaking API compatibility. These are now deprecated and will be removed in a future major release. (Stephen Finucane, #566)
typing-extensions is no longer required at runtime; it is only needed
for type checking.
(Jelmer Vernooij, Takashi Kajinami, #569, #571)
Support binary contents in FileContains matcher by @jelmer in #553
Full Changelog: 2.8.2...2.8.3
Add comprehensive type annotations to assertions, compat, run, and other modules. (Jelmer Vernooij, Stephen Finucane)
Support async setUp/tearDown validation with Deferreds. (Jelmer Vernooij)
Remove remaining references to Launchpad by @jelmer in #549
Full Changelog: 2.8.1...2.8.2
Fully migrate away from Launchpad to GitHub.
Support binary contents in FileContains matcher.
(Jelmer Vernooij, #538)
Allow stream=None to be passed to various TestResult classes that now support verbosity; fixes a regression from 2.8.0. (Jelmer Vernooij)
Add workflow for publishing releases by @jelmer in #479
Full Changelog: 2.8.0...2.8.1
Add Nearly matcher for approximate numerical comparisons.
(Jelmer Vernooij, #222)
Improve handling of sets in assertEquals.
(Jelmer Vernooij, #108)
Re-add accidentally removed methods on StreamToExtendedDecorator. (Jelmer Vernooij)
Add typing. (Jelmer Vernooij, Stephen Finucane)
Remove support for Python 3.8 + deprecated methods and classes by @stephenfin in #424
UseFixtureProtocol.getDetails by @allenap in #456Full Changelog: 2.7.2...2.8.0
Drop support for Python 3.8. (Stephen Finucane)
Drop support for Python 3.9. (Jelmer Vernooij)
Add support for Python 3.13 and 3.14. (Jelmer Vernooij)
Implemented verbosity support for the test runner. The -v (--verbose)
flag is now functional and properly controls output verbosity. Verbosity
levels: 0 (quiet), 1 (dots, default), 2 (test names). This applies to both
normal test runs and discovery mode. (LP: #872906)
Add support for Python 3.12's addDuration method and collectedDurations
attribute in TestResult classes. (Jelmer Vernooij, #2045171)
Remove a number of deprecated classes and methods. (Stephen Finucane)
testtools.matchers
AfterPreproccessing (use AfterPreprocessing)testtools.testcase
TestSkipped (use unittest.SkipTest)TestCase.skip (use TestCase.skipTest)TestCase.failUnlessEqual (use TestCase.assertEqual)TestCase.assertEquals (use TestCase.assertEqual)TestCase.failUnlessRaises (use TestCase.assertRaises)TestCase.assertItemsEqual (use TestCase.assertCountEqual)testtools.testresult.real
domap (no replacement)testtools.twistedsupport._runtest
run_with_log_observers (no replacement)stdlib alignment by @stephenfin in https://github.com/testing-cabal/testtools/pull/368
Full Changelog: https://github.com/testing-cabal/testtools/compare/2.7.1...2.7.2
Treat methodName="runTest" similar to unittest.TestCase, fixes compatibility with pytest 8.3. (Natanael Copa, #372)
Format with ruff format. (Jelmer Vernooij)
Use ruff for linting. (Jelmer Vernooij)
Fix compatibility with Python 3.12.1. (Matthew Treinish)
Deprecate SkippedTest exception. (Stephen Finucane)
Drop support for Python 3.7. (Jelmer Vernooij)
Various linting cleanups by @jelmer in https://github.com/testing-cabal/testtools/pull/364
Full Changelog: https://github.com/testing-cabal/testtools/compare/2.7.0...2.7.1
Remove various unused imports. (Jelmer Vernooij)
Fix build backend. This should prevent version from being set to 0.0.0 when building wheels. (Jelmer Vernooij, #363)
Reduce use of deprecated distutils module by @jakelishman in https://github.com/testing-cabal/testtools/pull/353
distutils module by @jakelishman in https://github.com/testing-cabal/testtools/pull/353Full Changelog: https://github.com/testing-cabal/testtools/compare/2.6.0...2.7.0
Fix compatibility with Python 3.12. (Jake Lishman, #353)
Add typing in various modules (still lacking full coverage). (Jelmer Vernooij)
Drop the 'test' command for distutils. This has been deprecated since 2.6.0. (Jelmer Vernooij)
Drop support for Python 3.6. (Jelmer Vernooij)
Deprecate distutils integration by @stephenfin in https://github.com/testing-cabal/testtools/pull/318
testtools[twisted] extra by @cjwatson in https://github.com/testing-cabal/testtools/pull/327cgi module usage with email by @mtreinish in https://github.com/testing-cabal/testtools/pull/340Full Changelog: https://github.com/testing-cabal/testtools/compare/2.5.0...2.6.0
Add support for Python 3.10 and 3.11. (Jürgen Gmach, Colin Watson)
Drop support for Python 3.5 (EOL). (Hugo van Kemenade)
Distutils integration is deprecated and will be removed in the next major version. (Stephen Finucane)
Use CompoundFixture from fixtures>=2.0 rather than rolling our
own.
(Colin Watson)
Provide a testtools[twisted] extra documenting dependencies needed for
testtools.twistedsupport.
(Colin Watson)
Make TestCase hashable.
(Ben Beecher)
Prevent AttributeError in TestCase.__eq__ for objects lacking a
__dict__ attribute.
(Tim Burke)
Replace deprecated cgi module usage with email.
(Matthew Treinish)
Python 3.5 has reached end-of-life and this is the last release to support it.
Add support for Python 3.9.
Python 3.5 has reached end-of-life and this is the last release to support it.
The skip, skipIf, and skipUnless decorators can now be used as class decorators as well as test method decorators, just as they can in unittest.
The SameMembers matcher class is now exposed as part of the public
matchers API.
The dependency on the unittest2 module has been removed. This has some
knock on effects, including the removal of the assertItemsEqual helper
which was removed from unittest in Python 3.x.
The safe_hasattr utility has been removed from testtools.helpers.
This was a compat wrapper introduced in 0.9.25 when the utility itself was
moved to the extras package. It is no longer useless on Python 3-only
projects.
The try_imports utility has been removed from testtools.helpers.
This was a compat wrapper introduced in 0.9.25 when the utility itself was
moved to the extras package. It is no longer used within testtools and
has therefore been dropped.
Python 3.6 invalid escape sequence deprecation fixes. (Ville Skyttä)
Add support for Python 3.7, 3.8 and PyPy3. (Hugo van Kemenade)
Drop support for Python 3.4 (EOL). (Jelmer Vernooij)
Avoid using eval(). (Ross Burton)
PyCharm IDE unittest detection compatibility fix. (Adam Harwell)
Drop support for Python 3.3 (EOL). (Robert Collins)
Spelling fixes. (Free Ekanayaka)
Python 3.6 invalid escape sequence deprecation fixes. (Ville Skyttä)
New ResourcedToStreamDecorator for tracking lifecycle events of test resources, and possibly integrate with subunit. (Free Ekanayaka, Github #243)
New ResourcedToStreamDecorator for tracking lifecycle events of
test resources, and possibly integrate with subunit. (Free Ekanayaka,
Github #243)
Make KeysEqual usable with no arguments, i.e. match a dict with
no keys. (Gavin Panella, Github #241)
Add testtools.assertions to the documented API modules. (Free
Ekanayaka, Github #257).
Don't add file details without content. (Thomas Herve, Github #252)
Make testtools.twistedsupport and tests work on Python 3. (Free Ekanayaka)
Twisted support code uses inlineCallbacks rather than the deprecated deferredGenerator. (Tristan Seligmann)
inlineCallbacks rather than the deprecated
deferredGenerator. (Tristan Seligmann)New Warnings matcher, and WarningMessage and IsDeprecated functions for matching emitted warnings. (Jonathan Jacobs, Github #223)
TestResult objects that don't implement stop/shouldStop are now
handled sanely. (Jonathan Lange)
New Always and Never matchers. (Tristan Seligmann, #947026)
Fixed example in failed docstring. (Jonathan Lange, Github #208)
Rather than explicitly raising a KeyboardInterrupt if we get no result
from a Deferred, we tell the test result to stop running tests and
report the lack of result as a test error. This ought to make weird
concurrency interaction bugs easier to understand. (Jonathan Lange)
Introduce the unique_text_generator generator function. Similar to the getUniqueString() method, except it creates unique unicode text strings. (Brant Knudson)
Previously, when gathering details caused by a setUp() failure, a traceback occurred if the fixture used the newer _setUp(). This had the side effect of not clearing up fixtures nor gathering details properly. This is now fixed. (Julian Edwards, #1469759)
New Warnings matcher, and WarningMessage and IsDeprecated
functions for matching emitted warnings. (Jonathan Jacobs, Github #223)
Just a few tweaks to our Twisted support. Major version bump to indicate that Python 2.6 & 3.2 are no longer supported.
Just a few tweaks to our Twisted support. Major version bump to indicate that Python 2.6 & 3.2 are no longer supported.
AsynchronousDeferredRunTest now has suppress_twisted_logging and
store_twisted_logs parameters that can be used to override the default
logging behaviour. (Jonathan Lange, #942785)
New fixture CaptureTwistedLogs that can be used with
AsynchronousDeferredRunTest to attach a detail containing everything
logged to Twisted during the test run. (Jonathan Lange, #1515362)
Python 2.6 and 3.2 are no longer supported. If you want to use either of these versions of Python, use testtools 1.9.0. (Jonathan Lange)
Make fixtures a real dependency, not just a test dependency.
(Jonathan Lange)
run_with_log_observers is deprecated.
Many new fixes in this branch, including lots of work around Twisted support.
This is the first release that explicitly supports Python 3.5 and the last release that supports Python 2.6 or 3.2.
Thanks to all who contributed!
Python 3.5 added to the list of supported platforms. (Jonathan Lange)
MatchesListwise has more informative error when lengths don't match.
(Jonathan Lange)
The short form of errors for failed binary comparisons will now put the
expected value on the right. This means that assertThat(2, Equals(3))
will raise an error saying 2 != 3.
(Jonathan Lange, #1525227)
Tests for assertRaisesRegexp. (Julia Varlamova, Jonathan Lange)
Tests that customize skipException no longer get tracebacks for skipped
tests. (Jonathan Lange, #1518101)
A failing expectThat now fails tests run with
AsynchronousDeferredRunTest. (Jonathan Lange, #1532452)
New testtools.twistedsupport package that collects all of our Twisted
support code in one place, including that currently available under
testtools.deferredruntest. (Jonathan Lange)
New matchers for testing Deferred code: failed, succeeded, and
has_no_result. (Jonathan Lange, Tristan Seligmann, #1369134)
TestCase objects can now be run twice. All internal state is reset
between runs. In particular, testtools tests can now be run with
trial -u. (Jonathan Lange, #1517879)
Fixed bug where if an asynchronous Deferred test times out but the
Deferred then fires, the entire test run would abort with
KeyboardInterrupt, failing the currently running test.
(Jonathan Lange, James Westby)
Add a new test dependency of testscenarios. (Robert Collins)
Make fixtures a real dependency, not just a test dependency.
(Jonathan Lange)
run_with_log_observers is deprecated.
addCleanup can now only be called within a test run.
(Jonathan Lange)
TestCase.skip deprecated. Use skipTest instead.
(Jonathan Lange, #988893)
Getting expected or observed attributes from binary comparison
mismatches (e.g. Equals(2).match(3).expected) is now deprecated.
(Jonathan Lange)
Last release of testtools to support Python 3.2. (Jonathan Lange)
Last release of testtools to support Python 2.6. (Jonathan Lange)
Report on all duplicate test ids when sorting test suites that contain duplicate ids. (Thomas Bechtold, Jonathan Lange, #1390082)
Add readthedocs-requirements.txt so readthedocs.org can build the
Twisted API documentation. (Jonathan Lange)
Documented more explicitly how to build and install testtools in the hacking documentation. (Thomi Richards)
Documented more explicitly how to build and install testtools in the hacking documentation. (Thomi Richards)
deferredruntest now works with Twisted 15.1.0 and later.
(Colin Watson, #1488710)
AsynchronousDeferredRunTest now correctly attaches the test log. Previously it attached an empty file. (Colin Watson)
Building a wheel on Python 3 was missing _compat2x.py needed for Python2. This was a side effect of the fix to bug #941958, where we fixed a cosmetic
Building a wheel on Python 3 was missing _compat2x.py needed for Python2.
This was a side effect of the fix to bug #941958, where we fixed a cosmetic
error. (Robert Collins, #1430534)
During reporting in TextTestResult now always uses ceil rather than
depending on the undefined rounding behaviour in string formatting.
(Robert Collins)
Empty attachments to tests were triggering a file payload of None in the ExtendedToStreamDecorator code, which caused multiple copies of attachments t
ExtendedToStreamDecorator code, which caused multiple copies of
attachments that had been output prior to the empty one.
(Robert Collins, #1378609)Fix installing when extras is not already installed. Our guards for the absence of unittest2 were not sufficient. (Robert Collins, #1430076)
extras is not already installed. Our guards
for the absence of unittest2 were not sufficient.
(Robert Collins, #1430076)testtools.run now accepts --locals to show local variables in tracebacks, which can be a significant aid in debugging. In doing so we've removed the c
testtools.run now accepts --locals to show local variables
in tracebacks, which can be a significant aid in debugging. In doing
so we've removed the code reimplementing linecache and traceback by
using the new traceback2 and linecache2 packages.
(Robert Collins, github #111)testtools now depends on unittest2 1.0.0 which brings in a dependency
on traceback2 and via it linecache2. (Robert Collins)When an import error happens testtools.run will now show the full error rather than just the name of the module that failed to import. (Robert Collins
testtools.run will now show the full
error rather than just the name of the module that failed to import.
(Robert Collins)testtools.TestCase now inherits from unittest2.TestCase, which provides a setUpClass for upcalls on Python 2.6. (Robert Collins, #1393283)
testtools.TestCase now inherits from unittest2.TestCase, which
provides a setUpClass for upcalls on Python 2.6.
(Robert Collins, #1393283)Fixed our setup.py to use setup_requires to ensure the import dependencies for testtools are present before setup.py runs (as setup.py imports testtoo
Fixed our setup.py to use setup_requires to ensure the import dependencies for testtools are present before setup.py runs (as setup.py imports testtools to read out the version number). (Robert Collins)
Support setUpClass skipping with self.skipException. Previously this worked with unittest from 2.7 and above but was not supported by testtools - it was a happy accident. Since we now hard depend on unittest2, we need to invert our exception lookup priorities to support it. Regular skips done through raise self.skipException will continue to work, since they were always caught in our code - its because the suite type being used to implement setUpClass has changed that an issue occurred. (Robert Collins, #1393068)
Correctly express our unittest2 dependency: we don't work with old releases. (Robert Collins)
Depends on unittest2 for discovery functionality and the TestProgram base class. This brings in many fixes made to discovery where previously we were
Depends on unittest2 for discovery functionality and the TestProgram base
class. This brings in many fixes made to discovery where previously we were
only using the discovery package or the version in the release of Python
that the test execution was occurring on. (Robert Collins, #1271133)
Fixed unit tests which were failing under pypy due to a change in the way pypy formats tracebacks. (Thomi Richards)
Fixed the testtools test suite to run correctly when run via unit2
or testtools.run discover.
Make testtools.content.text_content error if anything other than text
is given as content. (Thomi Richards)
We now publish wheels of testtools. (Robert Collins, #issue84)
Exceptions in a fixture.getDetails method will no longer mask errors raised from the same fixture's setUp method. (Robert Collins, #1368440)
fixture.getDetails method will no longer mask errors
raised from the same fixture's setUp method.
(Robert Collins, #1368440)Long overdue, we've adopted a backwards compatibility statement and recognized that we have plenty of users depending on our behaviour - calling our v
Long overdue, we've adopted a backwards compatibility statement and recognized that we have plenty of users depending on our behaviour - calling our version 1.0.0 is a recognition of that.
Fix a long-standing bug where tearDown and cleanUps would not be called if the test run was interrupted. This should fix leaking external resources from interrupted tests. (Robert Collins, #1364188)
Fix a long-standing bug where calling sys.exit(0) from within a test would cause the test suite to exit with 0, without reporting a failure of that test. We still allow the test suite to be exited (since catching higher order exceptions requires exceptional circumstances) but we now call a last-resort handler on the TestCase, resulting in an error being reported for the test. (Robert Collins, #1364188)
Fix an issue where tests skipped with the skip* family of decorators would
still have their setUp and tearDown functions called.
(Thomi Richards, #https://github.com/testing-cabal/testtools/issues/86)
We have adopted a formal backwards compatibility statement (see hacking.rst) (Robert Collins)
Brown paper bag release - 0.9.38 was broken for some users, _jython_aware_splitext was not defined entirely compatibly. (Robert Collins, #https://gith
Brown paper bag release - 0.9.38 was broken for some users, _jython_aware_splitext was not defined entirely compatibly. (Robert Collins, #https://github.com/testing-cabal/testtools/issues/100)
Discovery import error detection wasn't implemented for python 2.6 (the 'discover' module). (Robert Collins)
Bug fixes for test importing.
Discovery import error detection wasn't implemented for python 2.6 (the 'discover' module). (Robert Collins)
Discovery now executes load_tests (if present) in init in all packages. (Robert Collins, http://bugs.python.org/issue16662)
Minor improvements to correctness.
Minor improvements to correctness.
stdout is now correctly honoured on run.TestProgram - before the
runner objects would be created with no stdout parameter. If construction
fails, the previous parameter list is attempted, permitting compatibility
with Runner classes that don't accept stdout as a parameter.
(Robert Collins)
The ExtendedToStreamDecorator now handles content objects with one less
packet - the last packet of the source content is sent with EOF set rather
than an empty packet with EOF set being sent after the last packet of the
source content. (Robert Collins)
Welcome to our long overdue 0.9.36 release, which improves compatibility with Python3.4, adds assert_that, a function for using matchers without TestC
Welcome to our long overdue 0.9.36 release, which improves compatibility with Python3.4, adds assert_that, a function for using matchers without TestCase objects, and finally will error if you try to use setUp or tearDown twice - since that invariably leads to bad things of one sort or another happening.
Error if setUp or tearDown are called twice.
(Robert Collins, #882884)
Make testtools compatible with the unittest.expectedFailure decorator in
Python 3.4. (Thomi Richards)
Removed a number of code paths where Python 2.4 and Python 2.5 were explicitly handled. (Daniel Watkins)
Added the testtools.TestCase.expectThat method, which implements
delayed assertions. (Thomi Richards)
Docs are now built as part of the Travis-CI build, reducing the chance of Read The Docs being broken accidentally. (Daniel Watkins, #1158773)
Added ability for testtools.TestCase instances to force a test to fail, even if no assertions failed. (Thomi Richards)
Added ability for testtools.TestCase instances to force a test to
fail, even if no assertions failed. (Thomi Richards)
Added testtools.content.StacktraceContent, a content object that
automatically creates a StackLinesContent object containing the current
stack trace. (Thomi Richards)
AnyMatch is now exported properly in testtools.matchers.
(Robert Collins, Rob Kennedy, github #44)
In Python 3.3, if there are duplicate test ids, tests.sort() will fail and raise TypeError. Detect the duplicate test ids firstly in sorted_tests() to ensure that all test ids are unique. (Kui Shi, #1243922)
json_content is now in the __all__ attribute for
testtools.content. (Robert Collins)
Network tests now bind to 127.0.0.1 to avoid (even temporary) network visible ports. (Benedikt Morbach, github #46)
Test listing now explicitly indicates by printing 'Failed to import' and exiting (2) when an import has failed rather than only signalling through the test name. (Robert Collins, #1245672)
test_compat.TestDetectEncoding.test_bom now works on Python 3.3 - the
corner case with euc_jp is no longer permitted in Python 3.3 so we can
skip it. (Martin [gz], #1251962)
Added addDetailuniqueName method to testtools.TestCase class. (Thomi Richards)
Added addDetailuniqueName method to testtools.TestCase class.
(Thomi Richards)
Removed some unused code from testtools.content.TracebackContent.
(Thomi Richards)
Added testtools.StackLinesContent: a content object for displaying
pre-processed stack lines. (Thomi Richards)
StreamSummary was calculating testsRun incorrectly: exists status
tests were counted as run tests, but they are not.
(Robert Collins, #1203728)
Regular maintenance release. Special thanks to new contributor, Xiao Hanyu!
Regular maintenance release. Special thanks to new contributor, Xiao Hanyu!
testttols.compat._format_exc_info has been refactored into several
smaller functions. (Thomi Richards)Stacktrace filtering no longer hides unittest frames that are surrounded by user frames. We will reenable this when we figure out a better algorithm for retaining meaning. (Robert Collins, #1188420)
The compatibility code for skipped tests with unittest2 was broken. (Robert Collins, #1190951)
Various documentation improvements (Clint Byrum, Xiao Hanyu).
A new sort of TestResult, the StreamResult has been added, as a prototype for a revised standard library test result API. Expect this API to change. A
A new sort of TestResult, the StreamResult has been added, as a prototype for a revised standard library test result API. Expect this API to change. Although we will try to preserve compatibility for early adopters, it is experimental and we might need to break it if it turns out to be unsuitable.
assertRaises works properly for exception classes that have custom
metaclasses
ConcurrentTestSuite was silently eating exceptions that propagate from
the test.run(result) method call. Ignoring them is fine in a normal test
runner, but when they happen in a different thread, the thread that called
suite.run() is not in the stack anymore, and the exceptions are lost. We now
create a synthetic test recording any such exception.
(Robert Collins, #1130429)
Fixed SyntaxError raised in _compat2x.py when installing via Python 3.
(Will Bond, #941958)
New class StreamResult which defines the API for the new result type.
(Robert Collins)
New support class ConcurrentStreamTestSuite for convenient construction
and utilisation of StreamToQueue objects. (Robert Collins)
New support class CopyStreamResult which forwards events onto multiple
StreamResult objects (each of which receives all the events).
(Robert Collins)
New support class StreamSummary which summarises a StreamResult
stream compatibly with TestResult code. (Robert Collins)
New support class StreamTagger which adds or removes tags from
StreamResult events. (RobertCollins)
New support class StreamToDict which converts a StreamResult to a
series of dicts describing a test. Useful for writing trivial stream
analysers. (Robert Collins)
New support class TestControl which permits cancelling an in-progress
run. (Robert Collins)
New support class StreamFailFast which calls a TestControl instance
to abort the test run when a failure is detected. (Robert Collins)
New support class ExtendedToStreamDecorator which translates both regular
unittest TestResult API calls and the ExtendedTestResult API which testtools
has supported into the StreamResult API. ExtendedToStreamDecorator also
forwards calls made in the StreamResult API, permitting it to be used
anywhere a StreamResult is used. Key TestResult query methods like
wasSuccessful and shouldStop are synchronised with the StreamResult API
calls, but the detailed statistics like the list of errors are not - a
separate consumer will be created to support that.
(Robert Collins)
New support class StreamToExtendedDecorator which translates
StreamResult API calls into ExtendedTestResult (or any older
TestResult) calls. This permits using un-migrated result objects with
new runners / tests. (Robert Collins)
New support class StreamToQueue for sending messages to one
StreamResult from multiple threads. (Robert Collins)
New support class TimestampingStreamResult which adds a timestamp to
events with no timestamp. (Robert Collins)
New TestCase decorator DecorateTestCaseResult that adapts the
TestResult or StreamResult a case will be run with, for ensuring that
a particular result object is used even if the runner running the test doesn't
know to use it. (Robert Collins)
New test support class testtools.testresult.doubles.StreamResult, which
captures all the StreamResult events. (Robert Collins)
PlaceHolder can now hold tags, and applies them before, and removes them
after, the test. (Robert Collins)
PlaceHolder can now hold timestamps, and applies them before the test and
then before the outcome. (Robert Collins)
StreamResultRouter added. This is useful for demultiplexing - e.g. for
partitioning analysis of events or sending feedback encapsulated in
StreamResult events back to their source. (Robert Collins)
testtools.run.TestProgram now supports the TestRunner taking over
responsibility for formatting the output of --list-tests.
(Robert Collins)
The error message for setUp and tearDown upcall errors was broken on Python 3.4. (Monty Taylor, Robert Collins, #1140688)
The repr of object() on pypy includes the object id, which was breaking a test that accidentally depended on the CPython repr for object(). (Jonathan Lange)
A simple bug fix, and better error messages when you don't up-call.
A simple bug fix, and better error messages when you don't up-call.
testtools.content_type.ContentType incorrectly used ',' rather than ';'
to separate parameters. (Robert Collins)testtools.compat.unicode_output_stream was wrapping a stream encoder
around io.StringIO and io.TextIOWrapper objects, which was incorrect.
(Robert Collins)
Report the name of the source file for setUp and tearDown upcall errors. (Monty Taylor)
Testtools has moved VCS - https://github.com/testing-cabal/testtools/ is the new home. Bug tracking is still on Launchpad, and releases are on Pypi.
Testtools has moved VCS - https://github.com/testing-cabal/testtools/ is the new home. Bug tracking is still on Launchpad, and releases are on Pypi.
We made this change to take advantage of the richer ecosystem of tools around Git, and to lower the barrier for new contributors.
testtools.testcase.attr and testtools.testcase.WithAttributes
helpers allow marking up test case methods with simple labels. This permits
filtering tests with more granularity than organising them into modules and
test classes. (Robert Collins)New matcher HasLength for matching the length of a collection. (Robert Collins)
New matcher HasLength for matching the length of a collection.
(Robert Collins)
New matcher MatchesPredicateWithParams make it still easier to create
ad hoc matchers. (Robert Collins)
We have a simpler release process in future - see doc/hacking.rst. (Robert Collins)
Brown paper bag fix: failed to document the need for setup to be able to use extras. Compounded by pip not supporting setup_requires.
Brown paper bag fix: failed to document the need for setup to be able to use extras. Compounded by pip not supporting setup_requires.
python -m testtools.run --load-list will now preserve any custom suites (such as testtools.FixtureSuite or testresources.OptimisingTestSuite) rather t
python -m testtools.run --load-list will now preserve any custom suites
(such as testtools.FixtureSuite or testresources.OptimisingTestSuite)
rather than flattening them.
(Robert Collins, #827175)
Testtools now depends on extras, a small library split out from it to contain generally useful non-testing facilities. Since extras has been around for a couple of testtools releases now, we're making this into a hard dependency of testtools. (Robert Collins)
Testtools now uses setuptools rather than distutils so that we can document the extras dependency. (Robert Collins)
testtools.run discover will now sort the tests it discovered. This is a workaround for http://bugs.python.org/issue16709. Non-standard test suites are
testtools.run discover will now sort the tests it discovered. This is a
workaround for http://bugs.python.org/issue16709. Non-standard test suites
are preserved, and their sort_tests() method called (if they have such an
attribute). testtools.testsuite.sorted_tests(suite, True) can be used by
such suites to do a local sort. (Robert Collins, #1091512)
ThreadsafeForwardingResult now defines a stub progress method, which
fixes testr run of streams containing progress markers (by discarding the
progress data). (Robert Collins, #1019165)
run.TestToolsTestRunner now accepts the verbosity, buffer and failfast arguments the upstream python TestProgram code wants to give it, making it poss
run.TestToolsTestRunner now accepts the verbosity, buffer and failfast
arguments the upstream python TestProgram code wants to give it, making it
possible to support them in a compatible fashion. (Robert Collins)testtools.run now supports the -f or --failfast parameter.
Previously it was advertised in the help but ignored.
(Robert Collins, #1090582)
AnyMatch added, a new matcher that matches when any item in a collection
matches the given matcher. (Jonathan Lange)
Spelling corrections to documentation. (Vincent Ladeuil)
TestProgram now has a sane default for its testRunner argument.
(Vincent Ladeuil)
The test suite passes on Python 3 again. (Robert Collins)
content_from_file and content_from_stream now accept seek_offset and seek_whence parameters allowing them to be used to grab less than the full stream
content_from_file and content_from_stream now accept seek_offset and
seek_whence parameters allowing them to be used to grab less than the full
stream, or to be used with StringIO streams. (Robert Collins, #1088693)DirContains correctly exposed, after being accidentally hidden in the great matcher re-organization of 0.9.17. (Jonathan Lange)
DirContains correctly exposed, after being accidentally hidden in the
great matcher re-organization of 0.9.17. (Jonathan Lange)Three new matchers that'll rock your world.
Three new matchers that'll rock your world.
New, powerful matchers that match items in a dictionary:
MatchesDict, match every key in a dictionary with a key in a
dictionary of matchers. For when the set of expected keys is equal to the
set of observed keys.
ContainsDict, every key in a dictionary of matchers must be
found in a dictionary, and the values for those keys must match. For when
the set of expected keys is a subset of the set of observed keys.
ContainedByDict, every key in a dictionary must be found in
a dictionary of matchers. For when the set of expected keys is a superset
of the set of observed keys.
The names are a little confusing, sorry. We're still trying to figure out how to present the concept in the simplest way possible.
How embarrassing! Three releases in two days.
How embarrassing! Three releases in two days.
We've worked out the kinks and have confirmation from our downstreams that this is all good. Should be the last release for a little while. Please ignore 0.9.18 and 0.9.17.
Include the matcher tests in the release, allowing the tests to run and pass from the release tarball. (Jonathan Lange)
Fix cosmetic test failures in Python 3.3, introduced during release 0.9.17. (Jonathan Lange)
Due to an oversight, release 0.9.18 did not contain the new testtools.matchers package and was thus completely broken. This release corrects that, ret
Due to an oversight, release 0.9.18 did not contain the new
testtools.matchers package and was thus completely broken. This release
corrects that, returning us all to normality.
This release brings better discover support and Python3.x improvements. There are still some test failures on Python3.3 but they are cosmetic - the li
This release brings better discover support and Python3.x improvements. There are still some test failures on Python3.3 but they are cosmetic - the library is as usable there as on any other Python 3 release.
testtools.matchers package has been split up. No change to the
public interface. (Jonathan Lange)python -m testtools.run discover . --list now works. (Robert Collins)
Correctly handling of bytes vs text in JSON content type. (Martin [gz])
Some new matchers and a new content helper for JSON content.
Some new matchers and a new content helper for JSON content.
This is the first release of testtools to drop support for Python 2.4 and 2.5. If you need support for either of those versions, please use testtools 0.9.15.
New content helper, json_content (Jonathan Lange)
New matchers:
ContainsAll for asserting one thing is a subset of another
(Raphaël Badin)
SameMembers for asserting two iterators have the same members.
(Jonathan Lange)
Reraising of exceptions in Python 3 is more reliable. (Martin [gz])
This is the last release to support Python2.4 and 2.5. It brings in a slew of improvements to test tagging and concurrency, making running large test
This is the last release to support Python2.4 and 2.5. It brings in a slew of
improvements to test tagging and concurrency, making running large test suites
with partitioned workers more reliable and easier to reproduce exact test
ordering in a given worker. See our sister project testrepository for a
test runner that uses these features.
PlaceHolder and ErrorHolder now support being given result details.
(Robert Collins)
ErrorHolder is now just a function - all the logic is in PlaceHolder.
(Robert Collins)
TestResult and all other TestResult-like objects in testtools
distinguish between global tags and test-local tags, as per the subunit
specification. (Jonathan Lange)
This is the last release of testtools that supports Python 2.4 or 2.5. These releases are no longer supported by the Python community and do not receive security updates. If this affects you, you will need to either stay on this release or perform your own backports. (Jonathan Lange, Robert Collins)
ThreadsafeForwardingResult now forwards global tags as test-local tags,
making reasoning about the correctness of the multiplexed stream simpler.
This preserves the semantic value (what tags apply to a given test) while
consuming less stream size (as no negative-tag statement is needed).
(Robert Collins, Gary Poster, #986434)
API documentation corrections. (Raphaël Badin)
ConcurrentTestSuite now takes an optional wrap_result parameter
that can be used to wrap the ThreadsafeForwardingResults created by
the suite. (Jonathan Lange)
Tagger added. It's a new TestResult that tags all tests sent to
it with a particular set of tags. (Jonathan Lange)
testresultdecorator brought over from subunit. (Jonathan Lange)
All TestResult wrappers now correctly forward current_tags from
their wrapped results, meaning that current_tags can always be relied
upon to return the currently active tags on a test result.
TestByTestResult, a TestResult that calls a method once per test,
added. (Jonathan Lange)
ThreadsafeForwardingResult correctly forwards tags() calls where
only one of new_tags or gone_tags are specified.
(Jonathan Lange, #980263)
ThreadsafeForwardingResult no longer leaks local tags from one test
into all future tests run. (Jonathan Lange, #985613)
ThreadsafeForwardingResult has many, many more tests. (Jonathan Lange)
Our sister project, subunit _, was using a private API that was deleted in the 0.9.13 release. This release restores that API in order to smooth out t
Our sister project, subunit <https://launchpad.net/subunit>_, was using a
private API that was deleted in the 0.9.13 release. This release restores
that API in order to smooth out the upgrade path.
If you don't use subunit, then this release won't matter very much to you.
Plenty of new matchers and quite a few critical bug fixes (especially to do with stack traces from failed assertions). A net win for all.
Plenty of new matchers and quite a few critical bug fixes (especially to do with stack traces from failed assertions). A net win for all.
MatchesAll now takes an first_only keyword argument that changes how
mismatches are displayed. If you were previously passing matchers to
MatchesAll with keyword arguments, then this change might affect your
test results. (Jonathan Lange)Actually hide all of the testtools stack for assertion failures. The previous release promised clean stack, but now we actually provide it. (Jonathan Lange, #854769)
assertRaises now includes the repr of the callable that failed to raise
properly. (Jonathan Lange, #881052)
Asynchronous tests no longer hang when run with trial. (Jonathan Lange, #926189)
Content objects now have an as_text method to convert their contents
to Unicode text. (Jonathan Lange)
Failed equality assertions now line up. (Jonathan Lange, #879339)
FullStackRunTest no longer aborts the test run if a test raises an
error. (Jonathan Lange)
MatchesAll and MatchesListwise both take a first_only keyword
argument. If True, they will report only on the first mismatch they find,
and not continue looking for other possible mismatches.
(Jonathan Lange)
New helper, Nullary that turns callables with arguments into ones that
don't take arguments. (Jonathan Lange)
New matchers:
DirContains matches the contents of a directory.
(Jonathan Lange, James Westby)
DirExists matches if a directory exists.
(Jonathan Lange, James Westby)
FileContains matches the contents of a file.
(Jonathan Lange, James Westby)
FileExists matches if a file exists.
(Jonathan Lange, James Westby)
HasPermissions matches the permissions of a file. (Jonathan Lange)
MatchesPredicate matches if a predicate is true. (Jonathan Lange)
PathExists matches if a path exists. (Jonathan Lange, James Westby)
SamePath matches if two paths are the same. (Jonathan Lange)
TarballContains matches the contents of a tarball. (Jonathan Lange)
MultiTestResult supports the tags method.
(Graham Binns, Francesco Banconi, #914279)
ThreadsafeForwardingResult supports the tags method.
(Graham Binns, Francesco Banconi, #914279)
ThreadsafeForwardingResult no longer includes semaphore acquisition time
in the test duration (for implicitly timed test runs).
(Robert Collins, #914362)
Old name preserved for backwards compatibility, but is now deprecated. Please stop using it. (Jonathan Lange, #813460)
This is a very big release. We've made huge improvements on three fronts:
assertThat are much more convenient to useWe've trimmed off the fat from the stack trace you get when tests fail, we've cut out the bits of error messages that just didn't help, we've made it easier to annotate mismatch failures, to compare complex objects and to match raised exceptions.
Testing code was never this fun.
AfterPreproccessing renamed to AfterPreprocessing, which is a more
correct spelling. Old name preserved for backwards compatibility, but is
now deprecated. Please stop using it.
(Jonathan Lange, #813460)
assertThat raises MismatchError instead of
TestCase.failureException. MismatchError is a subclass of
AssertionError, so in most cases this change will not matter. However,
if self.failureException has been set to a non-default value, then
mismatches will become test errors rather than test failures.
gather_details takes two dicts, rather than two detailed objects.
(Jonathan Lange, #801027)
MatchesRegex mismatch now says "<value> does not match /<regex>/" rather
than "<regex> did not match <value>". The regular expression contains fewer
backslashes too. (Jonathan Lange, #818079)
Tests that run with AsynchronousDeferredRunTest now have the reactor
attribute set to the running reactor. (Jonathan Lange, #720749)
All public matchers are now in testtools.matchers.__all__.
(Jonathan Lange, #784859)
assertThat can actually display mismatches and matchers that contain
extended unicode characters. (Jonathan Lange, Martin [gz], #804127)
assertThat output is much less verbose, displaying only what the mismatch
tells us to display. Old-style verbose output can be had by passing
verbose=True to assertThat. (Jonathan Lange, #675323, #593190)
assertThat accepts a message which will be used to annotate the matcher.
This can be given as a third parameter or as a keyword parameter.
(Robert Collins)
Automated the Launchpad part of the release process. (Jonathan Lange, #623486)
Correctly display non-ASCII unicode output on terminals that claim to have a unicode encoding. (Martin [gz], #804122)
DocTestMatches correctly handles unicode output from examples, rather
than raising an error. (Martin [gz], #764170)
ErrorHolder and PlaceHolder added to docs. (Jonathan Lange, #816597)
ExpectedException now matches any exception of the given type by
default, and also allows specifying a Matcher rather than a mere regular
expression. (Jonathan Lange, #791889)
FixtureSuite added, allows test suites to run with a given fixture.
(Jonathan Lange)
Hide testtools's own stack frames when displaying tracebacks, making it easier for test authors to focus on their errors. (Jonathan Lange, Martin [gz], #788974)
Less boilerplate displayed in test failures and errors. (Jonathan Lange, #660852)
MatchesException now allows you to match exceptions against any matcher,
rather than just regular expressions. (Jonathan Lange, #791889)
MatchesException now permits a tuple of types rather than a single type
(when using the type matching mode). (Robert Collins)
MatchesStructure.byEquality added to make the common case of matching
many attributes by equality much easier. MatchesStructure.byMatcher
added in case folk want to match by things other than equality.
(Jonathan Lange)
New convenience assertions, assertIsNone and assertIsNotNone.
(Christian Kampka)
New matchers:
AllMatch matches many values against a single matcher.
(Jonathan Lange, #615108)
Contains. (Robert Collins)
GreaterThan. (Christian Kampka)
New helper, safe_hasattr added. (Jonathan Lange)
reraise added to testtools.compat. (Jonathan Lange)
Your coding agent can read these notes before it upgrades. Set up the MCP server →