mirror of https://github.com/python/cpython
1766 lines
56 KiB
ReStructuredText
1766 lines
56 KiB
ReStructuredText
:mod:`test` --- Regression tests package for Python
|
|
===================================================
|
|
|
|
.. module:: test
|
|
:synopsis: Regression tests package containing the testing suite for Python.
|
|
|
|
.. sectionauthor:: Brett Cannon <brett@python.org>
|
|
|
|
.. note::
|
|
The :mod:`test` package is meant for internal use by Python only. It is
|
|
documented for the benefit of the core developers of Python. Any use of
|
|
this package outside of Python's standard library is discouraged as code
|
|
mentioned here can change or be removed without notice between releases of
|
|
Python.
|
|
|
|
--------------
|
|
|
|
The :mod:`test` package contains all regression tests for Python as well as the
|
|
modules :mod:`test.support` and :mod:`test.regrtest`.
|
|
:mod:`test.support` is used to enhance your tests while
|
|
:mod:`test.regrtest` drives the testing suite.
|
|
|
|
Each module in the :mod:`test` package whose name starts with ``test_`` is a
|
|
testing suite for a specific module or feature. All new tests should be written
|
|
using the :mod:`unittest` or :mod:`doctest` module. Some older tests are
|
|
written using a "traditional" testing style that compares output printed to
|
|
``sys.stdout``; this style of test is considered deprecated.
|
|
|
|
|
|
.. seealso::
|
|
|
|
Module :mod:`unittest`
|
|
Writing PyUnit regression tests.
|
|
|
|
Module :mod:`doctest`
|
|
Tests embedded in documentation strings.
|
|
|
|
|
|
.. _writing-tests:
|
|
|
|
Writing Unit Tests for the :mod:`test` package
|
|
----------------------------------------------
|
|
|
|
It is preferred that tests that use the :mod:`unittest` module follow a few
|
|
guidelines. One is to name the test module by starting it with ``test_`` and end
|
|
it with the name of the module being tested. The test methods in the test module
|
|
should start with ``test_`` and end with a description of what the method is
|
|
testing. This is needed so that the methods are recognized by the test driver as
|
|
test methods. Also, no documentation string for the method should be included. A
|
|
comment (such as ``# Tests function returns only True or False``) should be used
|
|
to provide documentation for test methods. This is done because documentation
|
|
strings get printed out if they exist and thus what test is being run is not
|
|
stated.
|
|
|
|
A basic boilerplate is often used::
|
|
|
|
import unittest
|
|
from test import support
|
|
|
|
class MyTestCase1(unittest.TestCase):
|
|
|
|
# Only use setUp() and tearDown() if necessary
|
|
|
|
def setUp(self):
|
|
... code to execute in preparation for tests ...
|
|
|
|
def tearDown(self):
|
|
... code to execute to clean up after tests ...
|
|
|
|
def test_feature_one(self):
|
|
# Test feature one.
|
|
... testing code ...
|
|
|
|
def test_feature_two(self):
|
|
# Test feature two.
|
|
... testing code ...
|
|
|
|
... more test methods ...
|
|
|
|
class MyTestCase2(unittest.TestCase):
|
|
... same structure as MyTestCase1 ...
|
|
|
|
... more test classes ...
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|
|
|
|
This code pattern allows the testing suite to be run by :mod:`test.regrtest`,
|
|
on its own as a script that supports the :mod:`unittest` CLI, or via the
|
|
``python -m unittest`` CLI.
|
|
|
|
The goal for regression testing is to try to break code. This leads to a few
|
|
guidelines to be followed:
|
|
|
|
* The testing suite should exercise all classes, functions, and constants. This
|
|
includes not just the external API that is to be presented to the outside
|
|
world but also "private" code.
|
|
|
|
* Whitebox testing (examining the code being tested when the tests are being
|
|
written) is preferred. Blackbox testing (testing only the published user
|
|
interface) is not complete enough to make sure all boundary and edge cases
|
|
are tested.
|
|
|
|
* Make sure all possible values are tested including invalid ones. This makes
|
|
sure that not only all valid values are acceptable but also that improper
|
|
values are handled correctly.
|
|
|
|
* Exhaust as many code paths as possible. Test where branching occurs and thus
|
|
tailor input to make sure as many different paths through the code are taken.
|
|
|
|
* Add an explicit test for any bugs discovered for the tested code. This will
|
|
make sure that the error does not crop up again if the code is changed in the
|
|
future.
|
|
|
|
* Make sure to clean up after your tests (such as close and remove all temporary
|
|
files).
|
|
|
|
* If a test is dependent on a specific condition of the operating system then
|
|
verify the condition already exists before attempting the test.
|
|
|
|
* Import as few modules as possible and do it as soon as possible. This
|
|
minimizes external dependencies of tests and also minimizes possible anomalous
|
|
behavior from side-effects of importing a module.
|
|
|
|
* Try to maximize code reuse. On occasion, tests will vary by something as small
|
|
as what type of input is used. Minimize code duplication by subclassing a
|
|
basic test class with a class that specifies the input::
|
|
|
|
class TestFuncAcceptsSequencesMixin:
|
|
|
|
func = mySuperWhammyFunction
|
|
|
|
def test_func(self):
|
|
self.func(self.arg)
|
|
|
|
class AcceptLists(TestFuncAcceptsSequencesMixin, unittest.TestCase):
|
|
arg = [1, 2, 3]
|
|
|
|
class AcceptStrings(TestFuncAcceptsSequencesMixin, unittest.TestCase):
|
|
arg = 'abc'
|
|
|
|
class AcceptTuples(TestFuncAcceptsSequencesMixin, unittest.TestCase):
|
|
arg = (1, 2, 3)
|
|
|
|
When using this pattern, remember that all classes that inherit from
|
|
:class:`unittest.TestCase` are run as tests. The :class:`!TestFuncAcceptsSequencesMixin` class in the example above
|
|
does not have any data and so can't be run by itself, thus it does not
|
|
inherit from :class:`unittest.TestCase`.
|
|
|
|
|
|
.. seealso::
|
|
|
|
Test Driven Development
|
|
A book by Kent Beck on writing tests before code.
|
|
|
|
|
|
.. _regrtest:
|
|
|
|
Running tests using the command-line interface
|
|
----------------------------------------------
|
|
|
|
.. module:: test.regrtest
|
|
:synopsis: Drives the regression test suite.
|
|
|
|
The :mod:`test` package can be run as a script to drive Python's regression
|
|
test suite, thanks to the :option:`-m` option: :program:`python -m test`. Under
|
|
the hood, it uses :mod:`test.regrtest`; the call :program:`python -m
|
|
test.regrtest` used in previous Python versions still works. Running the
|
|
script by itself automatically starts running all regression tests in the
|
|
:mod:`test` package. It does this by finding all modules in the package whose
|
|
name starts with ``test_``, importing them, and executing the function
|
|
:func:`test_main` if present or loading the tests via
|
|
unittest.TestLoader.loadTestsFromModule if ``test_main`` does not exist. The
|
|
names of tests to execute may also be passed to the script. Specifying a single
|
|
regression test (:program:`python -m test test_spam`) will minimize output and
|
|
only print whether the test passed or failed.
|
|
|
|
Running :mod:`test` directly allows what resources are available for
|
|
tests to use to be set. You do this by using the ``-u`` command-line
|
|
option. Specifying ``all`` as the value for the ``-u`` option enables all
|
|
possible resources: :program:`python -m test -uall`.
|
|
If all but one resource is desired (a more common case), a
|
|
comma-separated list of resources that are not desired may be listed after
|
|
``all``. The command :program:`python -m test -uall,-audio,-largefile`
|
|
will run :mod:`test` with all resources except the ``audio`` and
|
|
``largefile`` resources. For a list of all resources and more command-line
|
|
options, run :program:`python -m test -h`.
|
|
|
|
Some other ways to execute the regression tests depend on what platform the
|
|
tests are being executed on. On Unix, you can run :program:`make test` at the
|
|
top-level directory where Python was built. On Windows,
|
|
executing :program:`rt.bat` from your :file:`PCbuild` directory will run all
|
|
regression tests.
|
|
|
|
|
|
:mod:`test.support` --- Utilities for the Python test suite
|
|
===========================================================
|
|
|
|
.. module:: test.support
|
|
:synopsis: Support for Python's regression test suite.
|
|
|
|
|
|
The :mod:`test.support` module provides support for Python's regression
|
|
test suite.
|
|
|
|
.. note::
|
|
|
|
:mod:`test.support` is not a public module. It is documented here to help
|
|
Python developers write tests. The API of this module is subject to change
|
|
without backwards compatibility concerns between releases.
|
|
|
|
|
|
This module defines the following exceptions:
|
|
|
|
.. exception:: TestFailed
|
|
|
|
Exception to be raised when a test fails. This is deprecated in favor of
|
|
:mod:`unittest`\ -based tests and :class:`unittest.TestCase`'s assertion
|
|
methods.
|
|
|
|
|
|
.. exception:: ResourceDenied
|
|
|
|
Subclass of :exc:`unittest.SkipTest`. Raised when a resource (such as a
|
|
network connection) is not available. Raised by the :func:`requires`
|
|
function.
|
|
|
|
|
|
The :mod:`test.support` module defines the following constants:
|
|
|
|
.. data:: verbose
|
|
|
|
``True`` when verbose output is enabled. Should be checked when more
|
|
detailed information is desired about a running test. *verbose* is set by
|
|
:mod:`test.regrtest`.
|
|
|
|
|
|
.. data:: is_jython
|
|
|
|
``True`` if the running interpreter is Jython.
|
|
|
|
|
|
.. data:: is_android
|
|
|
|
``True`` if the system is Android.
|
|
|
|
|
|
.. data:: unix_shell
|
|
|
|
Path for shell if not on Windows; otherwise ``None``.
|
|
|
|
|
|
.. data:: LOOPBACK_TIMEOUT
|
|
|
|
Timeout in seconds for tests using a network server listening on the network
|
|
local loopback interface like ``127.0.0.1``.
|
|
|
|
The timeout is long enough to prevent test failure: it takes into account
|
|
that the client and the server can run in different threads or even
|
|
different processes.
|
|
|
|
The timeout should be long enough for :meth:`~socket.socket.connect`,
|
|
:meth:`~socket.socket.recv` and :meth:`~socket.socket.send` methods of
|
|
:class:`socket.socket`.
|
|
|
|
Its default value is 5 seconds.
|
|
|
|
See also :data:`INTERNET_TIMEOUT`.
|
|
|
|
|
|
.. data:: INTERNET_TIMEOUT
|
|
|
|
Timeout in seconds for network requests going to the internet.
|
|
|
|
The timeout is short enough to prevent a test to wait for too long if the
|
|
internet request is blocked for whatever reason.
|
|
|
|
Usually, a timeout using :data:`INTERNET_TIMEOUT` should not mark a test as
|
|
failed, but skip the test instead: see
|
|
:func:`~test.support.socket_helper.transient_internet`.
|
|
|
|
Its default value is 1 minute.
|
|
|
|
See also :data:`LOOPBACK_TIMEOUT`.
|
|
|
|
|
|
.. data:: SHORT_TIMEOUT
|
|
|
|
Timeout in seconds to mark a test as failed if the test takes "too long".
|
|
|
|
The timeout value depends on the regrtest ``--timeout`` command line option.
|
|
|
|
If a test using :data:`SHORT_TIMEOUT` starts to fail randomly on slow
|
|
buildbots, use :data:`LONG_TIMEOUT` instead.
|
|
|
|
Its default value is 30 seconds.
|
|
|
|
|
|
.. data:: LONG_TIMEOUT
|
|
|
|
Timeout in seconds to detect when a test hangs.
|
|
|
|
It is long enough to reduce the risk of test failure on the slowest Python
|
|
buildbots. It should not be used to mark a test as failed if the test takes
|
|
"too long". The timeout value depends on the regrtest ``--timeout`` command
|
|
line option.
|
|
|
|
Its default value is 5 minutes.
|
|
|
|
See also :data:`LOOPBACK_TIMEOUT`, :data:`INTERNET_TIMEOUT` and
|
|
:data:`SHORT_TIMEOUT`.
|
|
|
|
|
|
.. data:: PGO
|
|
|
|
Set when tests can be skipped when they are not useful for PGO.
|
|
|
|
|
|
.. data:: PIPE_MAX_SIZE
|
|
|
|
A constant that is likely larger than the underlying OS pipe buffer size,
|
|
to make writes blocking.
|
|
|
|
|
|
.. data:: Py_DEBUG
|
|
|
|
True if Python was built with the :c:macro:`Py_DEBUG` macro
|
|
defined, that is, if
|
|
Python was :ref:`built in debug mode <debug-build>`.
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
|
|
.. data:: SOCK_MAX_SIZE
|
|
|
|
A constant that is likely larger than the underlying OS socket buffer size,
|
|
to make writes blocking.
|
|
|
|
|
|
.. data:: TEST_SUPPORT_DIR
|
|
|
|
Set to the top level directory that contains :mod:`test.support`.
|
|
|
|
|
|
.. data:: TEST_HOME_DIR
|
|
|
|
Set to the top level directory for the test package.
|
|
|
|
|
|
.. data:: TEST_DATA_DIR
|
|
|
|
Set to the ``data`` directory within the test package.
|
|
|
|
|
|
.. data:: MAX_Py_ssize_t
|
|
|
|
Set to :data:`sys.maxsize` for big memory tests.
|
|
|
|
|
|
.. data:: max_memuse
|
|
|
|
Set by :func:`set_memlimit` as the memory limit for big memory tests.
|
|
Limited by :data:`MAX_Py_ssize_t`.
|
|
|
|
|
|
.. data:: real_max_memuse
|
|
|
|
Set by :func:`set_memlimit` as the memory limit for big memory tests. Not
|
|
limited by :data:`MAX_Py_ssize_t`.
|
|
|
|
|
|
.. data:: MISSING_C_DOCSTRINGS
|
|
|
|
Set to ``True`` if Python is built without docstrings (the
|
|
:c:macro:`WITH_DOC_STRINGS` macro is not defined).
|
|
See the :option:`configure --without-doc-strings <--without-doc-strings>` option.
|
|
|
|
See also the :data:`HAVE_DOCSTRINGS` variable.
|
|
|
|
|
|
.. data:: HAVE_DOCSTRINGS
|
|
|
|
Set to ``True`` if function docstrings are available.
|
|
See the :option:`python -OO <-O>` option, which strips docstrings of functions implemented in Python.
|
|
|
|
See also the :data:`MISSING_C_DOCSTRINGS` variable.
|
|
|
|
|
|
.. data:: TEST_HTTP_URL
|
|
|
|
Define the URL of a dedicated HTTP server for the network tests.
|
|
|
|
|
|
.. data:: ALWAYS_EQ
|
|
|
|
Object that is equal to anything. Used to test mixed type comparison.
|
|
|
|
|
|
.. data:: NEVER_EQ
|
|
|
|
Object that is not equal to anything (even to :data:`ALWAYS_EQ`).
|
|
Used to test mixed type comparison.
|
|
|
|
|
|
.. data:: LARGEST
|
|
|
|
Object that is greater than anything (except itself).
|
|
Used to test mixed type comparison.
|
|
|
|
|
|
.. data:: SMALLEST
|
|
|
|
Object that is less than anything (except itself).
|
|
Used to test mixed type comparison.
|
|
|
|
|
|
The :mod:`test.support` module defines the following functions:
|
|
|
|
.. function:: busy_retry(timeout, err_msg=None, /, *, error=True)
|
|
|
|
Run the loop body until ``break`` stops the loop.
|
|
|
|
After *timeout* seconds, raise an :exc:`AssertionError` if *error* is true,
|
|
or just stop the loop if *error* is false.
|
|
|
|
Example::
|
|
|
|
for _ in support.busy_retry(support.SHORT_TIMEOUT):
|
|
if check():
|
|
break
|
|
|
|
Example of error=False usage::
|
|
|
|
for _ in support.busy_retry(support.SHORT_TIMEOUT, error=False):
|
|
if check():
|
|
break
|
|
else:
|
|
raise RuntimeError('my custom error')
|
|
|
|
.. function:: sleeping_retry(timeout, err_msg=None, /, *, init_delay=0.010, max_delay=1.0, error=True)
|
|
|
|
Wait strategy that applies exponential backoff.
|
|
|
|
Run the loop body until ``break`` stops the loop. Sleep at each loop
|
|
iteration, but not at the first iteration. The sleep delay is doubled at
|
|
each iteration (up to *max_delay* seconds).
|
|
|
|
See :func:`busy_retry` documentation for the parameters usage.
|
|
|
|
Example raising an exception after SHORT_TIMEOUT seconds::
|
|
|
|
for _ in support.sleeping_retry(support.SHORT_TIMEOUT):
|
|
if check():
|
|
break
|
|
|
|
Example of error=False usage::
|
|
|
|
for _ in support.sleeping_retry(support.SHORT_TIMEOUT, error=False):
|
|
if check():
|
|
break
|
|
else:
|
|
raise RuntimeError('my custom error')
|
|
|
|
.. function:: is_resource_enabled(resource)
|
|
|
|
Return ``True`` if *resource* is enabled and available. The list of
|
|
available resources is only set when :mod:`test.regrtest` is executing the
|
|
tests.
|
|
|
|
|
|
.. function:: python_is_optimized()
|
|
|
|
Return ``True`` if Python was not built with ``-O0`` or ``-Og``.
|
|
|
|
|
|
.. function:: with_pymalloc()
|
|
|
|
Return :const:`_testcapi.WITH_PYMALLOC`.
|
|
|
|
|
|
.. function:: requires(resource, msg=None)
|
|
|
|
Raise :exc:`ResourceDenied` if *resource* is not available. *msg* is the
|
|
argument to :exc:`ResourceDenied` if it is raised. Always returns
|
|
``True`` if called by a function whose ``__name__`` is ``'__main__'``.
|
|
Used when tests are executed by :mod:`test.regrtest`.
|
|
|
|
|
|
.. function:: sortdict(dict)
|
|
|
|
Return a repr of *dict* with keys sorted.
|
|
|
|
|
|
.. function:: findfile(filename, subdir=None)
|
|
|
|
Return the path to the file named *filename*. If no match is found
|
|
*filename* is returned. This does not equal a failure since it could be the
|
|
path to the file.
|
|
|
|
Setting *subdir* indicates a relative path to use to find the file
|
|
rather than looking directly in the path directories.
|
|
|
|
|
|
.. function:: get_pagesize()
|
|
|
|
Get size of a page in bytes.
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
|
|
.. function:: setswitchinterval(interval)
|
|
|
|
Set the :func:`sys.setswitchinterval` to the given *interval*. Defines
|
|
a minimum interval for Android systems to prevent the system from hanging.
|
|
|
|
|
|
.. function:: check_impl_detail(**guards)
|
|
|
|
Use this check to guard CPython's implementation-specific tests or to
|
|
run them only on the implementations guarded by the arguments. This
|
|
function returns ``True`` or ``False`` depending on the host platform.
|
|
Example usage::
|
|
|
|
check_impl_detail() # Only on CPython (default).
|
|
check_impl_detail(jython=True) # Only on Jython.
|
|
check_impl_detail(cpython=False) # Everywhere except CPython.
|
|
|
|
|
|
.. function:: set_memlimit(limit)
|
|
|
|
Set the values for :data:`max_memuse` and :data:`real_max_memuse` for big
|
|
memory tests.
|
|
|
|
|
|
.. function:: record_original_stdout(stdout)
|
|
|
|
Store the value from *stdout*. It is meant to hold the stdout at the
|
|
time the regrtest began.
|
|
|
|
|
|
.. function:: get_original_stdout()
|
|
|
|
Return the original stdout set by :func:`record_original_stdout` or
|
|
``sys.stdout`` if it's not set.
|
|
|
|
|
|
.. function:: args_from_interpreter_flags()
|
|
|
|
Return a list of command line arguments reproducing the current settings
|
|
in ``sys.flags`` and ``sys.warnoptions``.
|
|
|
|
|
|
.. function:: optim_args_from_interpreter_flags()
|
|
|
|
Return a list of command line arguments reproducing the current
|
|
optimization settings in ``sys.flags``.
|
|
|
|
|
|
.. function:: captured_stdin()
|
|
captured_stdout()
|
|
captured_stderr()
|
|
|
|
A context managers that temporarily replaces the named stream with
|
|
:class:`io.StringIO` object.
|
|
|
|
Example use with output streams::
|
|
|
|
with captured_stdout() as stdout, captured_stderr() as stderr:
|
|
print("hello")
|
|
print("error", file=sys.stderr)
|
|
assert stdout.getvalue() == "hello\n"
|
|
assert stderr.getvalue() == "error\n"
|
|
|
|
Example use with input stream::
|
|
|
|
with captured_stdin() as stdin:
|
|
stdin.write('hello\n')
|
|
stdin.seek(0)
|
|
# call test code that consumes from sys.stdin
|
|
captured = input()
|
|
self.assertEqual(captured, "hello")
|
|
|
|
|
|
.. function:: disable_faulthandler()
|
|
|
|
A context manager that temporary disables :mod:`faulthandler`.
|
|
|
|
|
|
.. function:: gc_collect()
|
|
|
|
Force as many objects as possible to be collected. This is needed because
|
|
timely deallocation is not guaranteed by the garbage collector. This means
|
|
that ``__del__`` methods may be called later than expected and weakrefs
|
|
may remain alive for longer than expected.
|
|
|
|
|
|
.. function:: disable_gc()
|
|
|
|
A context manager that disables the garbage collector on entry. On
|
|
exit, the garbage collector is restored to its prior state.
|
|
|
|
|
|
.. function:: swap_attr(obj, attr, new_val)
|
|
|
|
Context manager to swap out an attribute with a new object.
|
|
|
|
Usage::
|
|
|
|
with swap_attr(obj, "attr", 5):
|
|
...
|
|
|
|
This will set ``obj.attr`` to 5 for the duration of the ``with`` block,
|
|
restoring the old value at the end of the block. If ``attr`` doesn't
|
|
exist on ``obj``, it will be created and then deleted at the end of the
|
|
block.
|
|
|
|
The old value (or ``None`` if it doesn't exist) will be assigned to the
|
|
target of the "as" clause, if there is one.
|
|
|
|
|
|
.. function:: swap_item(obj, attr, new_val)
|
|
|
|
Context manager to swap out an item with a new object.
|
|
|
|
Usage::
|
|
|
|
with swap_item(obj, "item", 5):
|
|
...
|
|
|
|
This will set ``obj["item"]`` to 5 for the duration of the ``with`` block,
|
|
restoring the old value at the end of the block. If ``item`` doesn't
|
|
exist on ``obj``, it will be created and then deleted at the end of the
|
|
block.
|
|
|
|
The old value (or ``None`` if it doesn't exist) will be assigned to the
|
|
target of the "as" clause, if there is one.
|
|
|
|
|
|
.. function:: flush_std_streams()
|
|
|
|
Call the ``flush()`` method on :data:`sys.stdout` and then on
|
|
:data:`sys.stderr`. It can be used to make sure that the logs order is
|
|
consistent before writing into stderr.
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
|
|
.. function:: print_warning(msg)
|
|
|
|
Print a warning into :data:`sys.__stderr__`. Format the message as:
|
|
``f"Warning -- {msg}"``. If *msg* is made of multiple lines, add
|
|
``"Warning -- "`` prefix to each line.
|
|
|
|
.. versionadded:: 3.9
|
|
|
|
|
|
.. function:: wait_process(pid, *, exitcode, timeout=None)
|
|
|
|
Wait until process *pid* completes and check that the process exit code is
|
|
*exitcode*.
|
|
|
|
Raise an :exc:`AssertionError` if the process exit code is not equal to
|
|
*exitcode*.
|
|
|
|
If the process runs longer than *timeout* seconds (:data:`SHORT_TIMEOUT` by
|
|
default), kill the process and raise an :exc:`AssertionError`. The timeout
|
|
feature is not available on Windows.
|
|
|
|
.. versionadded:: 3.9
|
|
|
|
|
|
.. function:: calcobjsize(fmt)
|
|
|
|
Return the size of the :c:type:`PyObject` whose structure members are
|
|
defined by *fmt*. The returned value includes the size of the Python object header and alignment.
|
|
|
|
|
|
.. function:: calcvobjsize(fmt)
|
|
|
|
Return the size of the :c:type:`PyVarObject` whose structure members are
|
|
defined by *fmt*. The returned value includes the size of the Python object header and alignment.
|
|
|
|
|
|
.. function:: checksizeof(test, o, size)
|
|
|
|
For testcase *test*, assert that the ``sys.getsizeof`` for *o* plus the GC
|
|
header size equals *size*.
|
|
|
|
|
|
.. decorator:: anticipate_failure(condition)
|
|
|
|
A decorator to conditionally mark tests with
|
|
:func:`unittest.expectedFailure`. Any use of this decorator should
|
|
have an associated comment identifying the relevant tracker issue.
|
|
|
|
|
|
.. function:: system_must_validate_cert(f)
|
|
|
|
A decorator that skips the decorated test on TLS certification validation failures.
|
|
|
|
|
|
.. decorator:: run_with_locale(catstr, *locales)
|
|
|
|
A decorator for running a function in a different locale, correctly
|
|
resetting it after it has finished. *catstr* is the locale category as
|
|
a string (for example ``"LC_ALL"``). The *locales* passed will be tried
|
|
sequentially, and the first valid locale will be used.
|
|
|
|
|
|
.. decorator:: run_with_tz(tz)
|
|
|
|
A decorator for running a function in a specific timezone, correctly
|
|
resetting it after it has finished.
|
|
|
|
|
|
.. decorator:: requires_freebsd_version(*min_version)
|
|
|
|
Decorator for the minimum version when running test on FreeBSD. If the
|
|
FreeBSD version is less than the minimum, the test is skipped.
|
|
|
|
|
|
.. decorator:: requires_linux_version(*min_version)
|
|
|
|
Decorator for the minimum version when running test on Linux. If the
|
|
Linux version is less than the minimum, the test is skipped.
|
|
|
|
|
|
.. decorator:: requires_mac_version(*min_version)
|
|
|
|
Decorator for the minimum version when running test on macOS. If the
|
|
macOS version is less than the minimum, the test is skipped.
|
|
|
|
|
|
.. decorator:: requires_IEEE_754
|
|
|
|
Decorator for skipping tests on non-IEEE 754 platforms.
|
|
|
|
|
|
.. decorator:: requires_zlib
|
|
|
|
Decorator for skipping tests if :mod:`zlib` doesn't exist.
|
|
|
|
|
|
.. decorator:: requires_gzip
|
|
|
|
Decorator for skipping tests if :mod:`gzip` doesn't exist.
|
|
|
|
|
|
.. decorator:: requires_bz2
|
|
|
|
Decorator for skipping tests if :mod:`bz2` doesn't exist.
|
|
|
|
|
|
.. decorator:: requires_lzma
|
|
|
|
Decorator for skipping tests if :mod:`lzma` doesn't exist.
|
|
|
|
|
|
.. decorator:: requires_resource(resource)
|
|
|
|
Decorator for skipping tests if *resource* is not available.
|
|
|
|
|
|
.. decorator:: requires_docstrings
|
|
|
|
Decorator for only running the test if :data:`HAVE_DOCSTRINGS`.
|
|
|
|
|
|
.. decorator:: requires_limited_api
|
|
|
|
Decorator for only running the test if :ref:`Limited C API <limited-c-api>`
|
|
is available.
|
|
|
|
|
|
.. decorator:: cpython_only
|
|
|
|
Decorator for tests only applicable to CPython.
|
|
|
|
|
|
.. decorator:: impl_detail(msg=None, **guards)
|
|
|
|
Decorator for invoking :func:`check_impl_detail` on *guards*. If that
|
|
returns ``False``, then uses *msg* as the reason for skipping the test.
|
|
|
|
|
|
.. decorator:: no_tracing
|
|
|
|
Decorator to temporarily turn off tracing for the duration of the test.
|
|
|
|
|
|
.. decorator:: refcount_test
|
|
|
|
Decorator for tests which involve reference counting. The decorator does
|
|
not run the test if it is not run by CPython. Any trace function is unset
|
|
for the duration of the test to prevent unexpected refcounts caused by
|
|
the trace function.
|
|
|
|
|
|
.. decorator:: bigmemtest(size, memuse, dry_run=True)
|
|
|
|
Decorator for bigmem tests.
|
|
|
|
*size* is a requested size for the test (in arbitrary, test-interpreted
|
|
units.) *memuse* is the number of bytes per unit for the test, or a good
|
|
estimate of it. For example, a test that needs two byte buffers, of 4 GiB
|
|
each, could be decorated with ``@bigmemtest(size=_4G, memuse=2)``.
|
|
|
|
The *size* argument is normally passed to the decorated test method as an
|
|
extra argument. If *dry_run* is ``True``, the value passed to the test
|
|
method may be less than the requested value. If *dry_run* is ``False``, it
|
|
means the test doesn't support dummy runs when ``-M`` is not specified.
|
|
|
|
|
|
.. decorator:: bigaddrspacetest
|
|
|
|
Decorator for tests that fill the address space.
|
|
|
|
|
|
.. function:: check_syntax_error(testcase, statement, errtext='', *, lineno=None, offset=None)
|
|
|
|
Test for syntax errors in *statement* by attempting to compile *statement*.
|
|
*testcase* is the :mod:`unittest` instance for the test. *errtext* is the
|
|
regular expression which should match the string representation of the
|
|
raised :exc:`SyntaxError`. If *lineno* is not ``None``, compares to
|
|
the line of the exception. If *offset* is not ``None``, compares to
|
|
the offset of the exception.
|
|
|
|
|
|
.. function:: open_urlresource(url, *args, **kw)
|
|
|
|
Open *url*. If open fails, raises :exc:`TestFailed`.
|
|
|
|
|
|
.. function:: reap_children()
|
|
|
|
Use this at the end of ``test_main`` whenever sub-processes are started.
|
|
This will help ensure that no extra children (zombies) stick around to
|
|
hog resources and create problems when looking for refleaks.
|
|
|
|
|
|
.. function:: get_attribute(obj, name)
|
|
|
|
Get an attribute, raising :exc:`unittest.SkipTest` if :exc:`AttributeError`
|
|
is raised.
|
|
|
|
|
|
.. function:: catch_unraisable_exception()
|
|
|
|
Context manager catching unraisable exception using
|
|
:func:`sys.unraisablehook`.
|
|
|
|
Storing the exception value (``cm.unraisable.exc_value``) creates a
|
|
reference cycle. The reference cycle is broken explicitly when the context
|
|
manager exits.
|
|
|
|
Storing the object (``cm.unraisable.object``) can resurrect it if it is set
|
|
to an object which is being finalized. Exiting the context manager clears
|
|
the stored object.
|
|
|
|
Usage::
|
|
|
|
with support.catch_unraisable_exception() as cm:
|
|
# code creating an "unraisable exception"
|
|
...
|
|
|
|
# check the unraisable exception: use cm.unraisable
|
|
...
|
|
|
|
# cm.unraisable attribute no longer exists at this point
|
|
# (to break a reference cycle)
|
|
|
|
.. versionadded:: 3.8
|
|
|
|
|
|
.. function:: load_package_tests(pkg_dir, loader, standard_tests, pattern)
|
|
|
|
Generic implementation of the :mod:`unittest` ``load_tests`` protocol for
|
|
use in test packages. *pkg_dir* is the root directory of the package;
|
|
*loader*, *standard_tests*, and *pattern* are the arguments expected by
|
|
``load_tests``. In simple cases, the test package's ``__init__.py``
|
|
can be the following::
|
|
|
|
import os
|
|
from test.support import load_package_tests
|
|
|
|
def load_tests(*args):
|
|
return load_package_tests(os.path.dirname(__file__), *args)
|
|
|
|
|
|
.. function:: detect_api_mismatch(ref_api, other_api, *, ignore=())
|
|
|
|
Returns the set of attributes, functions or methods of *ref_api* not
|
|
found on *other_api*, except for a defined list of items to be
|
|
ignored in this check specified in *ignore*.
|
|
|
|
By default this skips private attributes beginning with '_' but
|
|
includes all magic methods, i.e. those starting and ending in '__'.
|
|
|
|
.. versionadded:: 3.5
|
|
|
|
|
|
.. function:: patch(test_instance, object_to_patch, attr_name, new_value)
|
|
|
|
Override *object_to_patch.attr_name* with *new_value*. Also add
|
|
cleanup procedure to *test_instance* to restore *object_to_patch* for
|
|
*attr_name*. The *attr_name* should be a valid attribute for
|
|
*object_to_patch*.
|
|
|
|
|
|
.. function:: run_in_subinterp(code)
|
|
|
|
Run *code* in subinterpreter. Raise :exc:`unittest.SkipTest` if
|
|
:mod:`tracemalloc` is enabled.
|
|
|
|
|
|
.. function:: check_free_after_iterating(test, iter, cls, args=())
|
|
|
|
Assert instances of *cls* are deallocated after iterating.
|
|
|
|
|
|
.. function:: missing_compiler_executable(cmd_names=[])
|
|
|
|
Check for the existence of the compiler executables whose names are listed
|
|
in *cmd_names* or all the compiler executables when *cmd_names* is empty
|
|
and return the first missing executable or ``None`` when none is found
|
|
missing.
|
|
|
|
|
|
.. function:: check__all__(test_case, module, name_of_module=None, extra=(), not_exported=())
|
|
|
|
Assert that the ``__all__`` variable of *module* contains all public names.
|
|
|
|
The module's public names (its API) are detected automatically
|
|
based on whether they match the public name convention and were defined in
|
|
*module*.
|
|
|
|
The *name_of_module* argument can specify (as a string or tuple thereof) what
|
|
module(s) an API could be defined in order to be detected as a public
|
|
API. One case for this is when *module* imports part of its public API from
|
|
other modules, possibly a C backend (like ``csv`` and its ``_csv``).
|
|
|
|
The *extra* argument can be a set of names that wouldn't otherwise be automatically
|
|
detected as "public", like objects without a proper ``__module__``
|
|
attribute. If provided, it will be added to the automatically detected ones.
|
|
|
|
The *not_exported* argument can be a set of names that must not be treated
|
|
as part of the public API even though their names indicate otherwise.
|
|
|
|
Example use::
|
|
|
|
import bar
|
|
import foo
|
|
import unittest
|
|
from test import support
|
|
|
|
class MiscTestCase(unittest.TestCase):
|
|
def test__all__(self):
|
|
support.check__all__(self, foo)
|
|
|
|
class OtherTestCase(unittest.TestCase):
|
|
def test__all__(self):
|
|
extra = {'BAR_CONST', 'FOO_CONST'}
|
|
not_exported = {'baz'} # Undocumented name.
|
|
# bar imports part of its API from _bar.
|
|
support.check__all__(self, bar, ('bar', '_bar'),
|
|
extra=extra, not_exported=not_exported)
|
|
|
|
.. versionadded:: 3.6
|
|
|
|
.. function:: skip_if_broken_multiprocessing_synchronize()
|
|
|
|
Skip tests if the :mod:`multiprocessing.synchronize` module is missing, if
|
|
there is no available semaphore implementation, or if creating a lock raises
|
|
an :exc:`OSError`.
|
|
|
|
.. versionadded:: 3.10
|
|
|
|
|
|
.. function:: check_disallow_instantiation(test_case, tp, *args, **kwds)
|
|
|
|
Assert that type *tp* cannot be instantiated using *args* and *kwds*.
|
|
|
|
.. versionadded:: 3.10
|
|
|
|
|
|
.. function:: adjust_int_max_str_digits(max_digits)
|
|
|
|
This function returns a context manager that will change the global
|
|
:func:`sys.set_int_max_str_digits` setting for the duration of the
|
|
context to allow execution of test code that needs a different limit
|
|
on the number of digits when converting between an integer and string.
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
|
|
The :mod:`test.support` module defines the following classes:
|
|
|
|
|
|
.. class:: SuppressCrashReport()
|
|
|
|
A context manager used to try to prevent crash dialog popups on tests that
|
|
are expected to crash a subprocess.
|
|
|
|
On Windows, it disables Windows Error Reporting dialogs using
|
|
`SetErrorMode <https://msdn.microsoft.com/en-us/library/windows/desktop/ms680621.aspx>`_.
|
|
|
|
On UNIX, :func:`resource.setrlimit` is used to set
|
|
:const:`resource.RLIMIT_CORE`'s soft limit to 0 to prevent coredump file
|
|
creation.
|
|
|
|
On both platforms, the old value is restored by :meth:`~object.__exit__`.
|
|
|
|
|
|
.. class:: SaveSignals()
|
|
|
|
Class to save and restore signal handlers registered by the Python signal
|
|
handler.
|
|
|
|
.. method:: save(self)
|
|
|
|
Save the signal handlers to a dictionary mapping signal numbers to the
|
|
current signal handler.
|
|
|
|
.. method:: restore(self)
|
|
|
|
Set the signal numbers from the :meth:`save` dictionary to the saved
|
|
handler.
|
|
|
|
|
|
.. class:: Matcher()
|
|
|
|
.. method:: matches(self, d, **kwargs)
|
|
|
|
Try to match a single dict with the supplied arguments.
|
|
|
|
|
|
.. method:: match_value(self, k, dv, v)
|
|
|
|
Try to match a single stored value (*dv*) with a supplied value (*v*).
|
|
|
|
|
|
:mod:`test.support.socket_helper` --- Utilities for socket tests
|
|
================================================================
|
|
|
|
.. module:: test.support.socket_helper
|
|
:synopsis: Support for socket tests.
|
|
|
|
|
|
The :mod:`test.support.socket_helper` module provides support for socket tests.
|
|
|
|
.. versionadded:: 3.9
|
|
|
|
|
|
.. data:: IPV6_ENABLED
|
|
|
|
Set to ``True`` if IPv6 is enabled on this host, ``False`` otherwise.
|
|
|
|
|
|
.. function:: find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM)
|
|
|
|
Returns an unused port that should be suitable for binding. This is
|
|
achieved by creating a temporary socket with the same family and type as
|
|
the ``sock`` parameter (default is :const:`~socket.AF_INET`,
|
|
:const:`~socket.SOCK_STREAM`),
|
|
and binding it to the specified host address (defaults to ``0.0.0.0``)
|
|
with the port set to 0, eliciting an unused ephemeral port from the OS.
|
|
The temporary socket is then closed and deleted, and the ephemeral port is
|
|
returned.
|
|
|
|
Either this method or :func:`bind_port` should be used for any tests
|
|
where a server socket needs to be bound to a particular port for the
|
|
duration of the test.
|
|
Which one to use depends on whether the calling code is creating a Python
|
|
socket, or if an unused port needs to be provided in a constructor
|
|
or passed to an external program (i.e. the ``-accept`` argument to
|
|
openssl's s_server mode). Always prefer :func:`bind_port` over
|
|
:func:`find_unused_port` where possible. Using a hard coded port is
|
|
discouraged since it can make multiple instances of the test impossible to
|
|
run simultaneously, which is a problem for buildbots.
|
|
|
|
|
|
.. function:: bind_port(sock, host=HOST)
|
|
|
|
Bind the socket to a free port and return the port number. Relies on
|
|
ephemeral ports in order to ensure we are using an unbound port. This is
|
|
important as many tests may be running simultaneously, especially in a
|
|
buildbot environment. This method raises an exception if the
|
|
``sock.family`` is :const:`~socket.AF_INET` and ``sock.type`` is
|
|
:const:`~socket.SOCK_STREAM`, and the socket has
|
|
:const:`~socket.SO_REUSEADDR` or :const:`~socket.SO_REUSEPORT` set on it.
|
|
Tests should never set these socket options for TCP/IP sockets.
|
|
The only case for setting these options is testing multicasting via
|
|
multiple UDP sockets.
|
|
|
|
Additionally, if the :const:`~socket.SO_EXCLUSIVEADDRUSE` socket option is
|
|
available (i.e. on Windows), it will be set on the socket. This will
|
|
prevent anyone else from binding to our host/port for the duration of the
|
|
test.
|
|
|
|
|
|
.. function:: bind_unix_socket(sock, addr)
|
|
|
|
Bind a Unix socket, raising :exc:`unittest.SkipTest` if
|
|
:exc:`PermissionError` is raised.
|
|
|
|
|
|
.. decorator:: skip_unless_bind_unix_socket
|
|
|
|
A decorator for running tests that require a functional ``bind()`` for Unix
|
|
sockets.
|
|
|
|
|
|
.. function:: transient_internet(resource_name, *, timeout=30.0, errnos=())
|
|
|
|
A context manager that raises :exc:`~test.support.ResourceDenied` when
|
|
various issues with the internet connection manifest themselves as
|
|
exceptions.
|
|
|
|
|
|
:mod:`test.support.script_helper` --- Utilities for the Python execution tests
|
|
==============================================================================
|
|
|
|
.. module:: test.support.script_helper
|
|
:synopsis: Support for Python's script execution tests.
|
|
|
|
|
|
The :mod:`test.support.script_helper` module provides support for Python's
|
|
script execution tests.
|
|
|
|
.. function:: interpreter_requires_environment()
|
|
|
|
Return ``True`` if ``sys.executable interpreter`` requires environment
|
|
variables in order to be able to run at all.
|
|
|
|
This is designed to be used with ``@unittest.skipIf()`` to annotate tests
|
|
that need to use an ``assert_python*()`` function to launch an isolated
|
|
mode (``-I``) or no environment mode (``-E``) sub-interpreter process.
|
|
|
|
A normal build & test does not run into this situation but it can happen
|
|
when trying to run the standard library test suite from an interpreter that
|
|
doesn't have an obvious home with Python's current home finding logic.
|
|
|
|
Setting :envvar:`PYTHONHOME` is one way to get most of the testsuite to run
|
|
in that situation. :envvar:`PYTHONPATH` or :envvar:`PYTHONUSERSITE` are
|
|
other common environment variables that might impact whether or not the
|
|
interpreter can start.
|
|
|
|
|
|
.. function:: run_python_until_end(*args, **env_vars)
|
|
|
|
Set up the environment based on *env_vars* for running the interpreter
|
|
in a subprocess. The values can include ``__isolated``, ``__cleanenv``,
|
|
``__cwd``, and ``TERM``.
|
|
|
|
.. versionchanged:: 3.9
|
|
The function no longer strips whitespaces from *stderr*.
|
|
|
|
|
|
.. function:: assert_python_ok(*args, **env_vars)
|
|
|
|
Assert that running the interpreter with *args* and optional environment
|
|
variables *env_vars* succeeds (``rc == 0``) and return a ``(return code,
|
|
stdout, stderr)`` tuple.
|
|
|
|
If the *__cleanenv* keyword-only parameter is set, *env_vars* is used as a fresh
|
|
environment.
|
|
|
|
Python is started in isolated mode (command line option ``-I``),
|
|
except if the *__isolated* keyword-only parameter is set to ``False``.
|
|
|
|
.. versionchanged:: 3.9
|
|
The function no longer strips whitespaces from *stderr*.
|
|
|
|
|
|
.. function:: assert_python_failure(*args, **env_vars)
|
|
|
|
Assert that running the interpreter with *args* and optional environment
|
|
variables *env_vars* fails (``rc != 0``) and return a ``(return code,
|
|
stdout, stderr)`` tuple.
|
|
|
|
See :func:`assert_python_ok` for more options.
|
|
|
|
.. versionchanged:: 3.9
|
|
The function no longer strips whitespaces from *stderr*.
|
|
|
|
|
|
.. function:: spawn_python(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw)
|
|
|
|
Run a Python subprocess with the given arguments.
|
|
|
|
*kw* is extra keyword args to pass to :func:`subprocess.Popen`. Returns a
|
|
:class:`subprocess.Popen` object.
|
|
|
|
|
|
.. function:: kill_python(p)
|
|
|
|
Run the given :class:`subprocess.Popen` process until completion and return
|
|
stdout.
|
|
|
|
|
|
.. function:: make_script(script_dir, script_basename, source, omit_suffix=False)
|
|
|
|
Create script containing *source* in path *script_dir* and *script_basename*.
|
|
If *omit_suffix* is ``False``, append ``.py`` to the name. Return the full
|
|
script path.
|
|
|
|
|
|
.. function:: make_zip_script(zip_dir, zip_basename, script_name, name_in_zip=None)
|
|
|
|
Create zip file at *zip_dir* and *zip_basename* with extension ``zip`` which
|
|
contains the files in *script_name*. *name_in_zip* is the archive name.
|
|
Return a tuple containing ``(full path, full path of archive name)``.
|
|
|
|
|
|
.. function:: make_pkg(pkg_dir, init_source='')
|
|
|
|
Create a directory named *pkg_dir* containing an ``__init__`` file with
|
|
*init_source* as its contents.
|
|
|
|
|
|
.. function:: make_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename, \
|
|
source, depth=1, compiled=False)
|
|
|
|
Create a zip package directory with a path of *zip_dir* and *zip_basename*
|
|
containing an empty ``__init__`` file and a file *script_basename*
|
|
containing the *source*. If *compiled* is ``True``, both source files will
|
|
be compiled and added to the zip package. Return a tuple of the full zip
|
|
path and the archive name for the zip file.
|
|
|
|
|
|
:mod:`test.support.bytecode_helper` --- Support tools for testing correct bytecode generation
|
|
=============================================================================================
|
|
|
|
.. module:: test.support.bytecode_helper
|
|
:synopsis: Support tools for testing correct bytecode generation.
|
|
|
|
The :mod:`test.support.bytecode_helper` module provides support for testing
|
|
and inspecting bytecode generation.
|
|
|
|
.. versionadded:: 3.9
|
|
|
|
The module defines the following class:
|
|
|
|
.. class:: BytecodeTestCase(unittest.TestCase)
|
|
|
|
This class has custom assertion methods for inspecting bytecode.
|
|
|
|
.. method:: BytecodeTestCase.get_disassembly_as_string(co)
|
|
|
|
Return the disassembly of *co* as string.
|
|
|
|
|
|
.. method:: BytecodeTestCase.assertInBytecode(x, opname, argval=_UNSPECIFIED)
|
|
|
|
Return instr if *opname* is found, otherwise throws :exc:`AssertionError`.
|
|
|
|
|
|
.. method:: BytecodeTestCase.assertNotInBytecode(x, opname, argval=_UNSPECIFIED)
|
|
|
|
Throws :exc:`AssertionError` if *opname* is found.
|
|
|
|
|
|
:mod:`test.support.threading_helper` --- Utilities for threading tests
|
|
======================================================================
|
|
|
|
.. module:: test.support.threading_helper
|
|
:synopsis: Support for threading tests.
|
|
|
|
The :mod:`test.support.threading_helper` module provides support for threading tests.
|
|
|
|
.. versionadded:: 3.10
|
|
|
|
|
|
.. function:: join_thread(thread, timeout=None)
|
|
|
|
Join a *thread* within *timeout*. Raise an :exc:`AssertionError` if thread
|
|
is still alive after *timeout* seconds.
|
|
|
|
|
|
.. decorator:: reap_threads
|
|
|
|
Decorator to ensure the threads are cleaned up even if the test fails.
|
|
|
|
|
|
.. function:: start_threads(threads, unlock=None)
|
|
|
|
Context manager to start *threads*, which is a sequence of threads.
|
|
*unlock* is a function called after the threads are started, even if an
|
|
exception was raised; an example would be :meth:`threading.Event.set`.
|
|
``start_threads`` will attempt to join the started threads upon exit.
|
|
|
|
|
|
.. function:: threading_cleanup(*original_values)
|
|
|
|
Cleanup up threads not specified in *original_values*. Designed to emit
|
|
a warning if a test leaves running threads in the background.
|
|
|
|
|
|
.. function:: threading_setup()
|
|
|
|
Return current thread count and copy of dangling threads.
|
|
|
|
|
|
.. function:: wait_threads_exit(timeout=None)
|
|
|
|
Context manager to wait until all threads created in the ``with`` statement
|
|
exit.
|
|
|
|
|
|
.. function:: catch_threading_exception()
|
|
|
|
Context manager catching :class:`threading.Thread` exception using
|
|
:func:`threading.excepthook`.
|
|
|
|
Attributes set when an exception is caught:
|
|
|
|
* ``exc_type``
|
|
* ``exc_value``
|
|
* ``exc_traceback``
|
|
* ``thread``
|
|
|
|
See :func:`threading.excepthook` documentation.
|
|
|
|
These attributes are deleted at the context manager exit.
|
|
|
|
Usage::
|
|
|
|
with threading_helper.catch_threading_exception() as cm:
|
|
# code spawning a thread which raises an exception
|
|
...
|
|
|
|
# check the thread exception, use cm attributes:
|
|
# exc_type, exc_value, exc_traceback, thread
|
|
...
|
|
|
|
# exc_type, exc_value, exc_traceback, thread attributes of cm no longer
|
|
# exists at this point
|
|
# (to avoid reference cycles)
|
|
|
|
.. versionadded:: 3.8
|
|
|
|
|
|
:mod:`test.support.os_helper` --- Utilities for os tests
|
|
========================================================================
|
|
|
|
.. module:: test.support.os_helper
|
|
:synopsis: Support for os tests.
|
|
|
|
The :mod:`test.support.os_helper` module provides support for os tests.
|
|
|
|
.. versionadded:: 3.10
|
|
|
|
|
|
.. data:: FS_NONASCII
|
|
|
|
A non-ASCII character encodable by :func:`os.fsencode`.
|
|
|
|
|
|
.. data:: SAVEDCWD
|
|
|
|
Set to :func:`os.getcwd`.
|
|
|
|
|
|
.. data:: TESTFN
|
|
|
|
Set to a name that is safe to use as the name of a temporary file. Any
|
|
temporary file that is created should be closed and unlinked (removed).
|
|
|
|
|
|
.. data:: TESTFN_NONASCII
|
|
|
|
Set to a filename containing the :data:`FS_NONASCII` character, if it exists.
|
|
This guarantees that if the filename exists, it can be encoded and decoded
|
|
with the default filesystem encoding. This allows tests that require a
|
|
non-ASCII filename to be easily skipped on platforms where they can't work.
|
|
|
|
|
|
.. data:: TESTFN_UNENCODABLE
|
|
|
|
Set to a filename (str type) that should not be able to be encoded by file
|
|
system encoding in strict mode. It may be ``None`` if it's not possible to
|
|
generate such a filename.
|
|
|
|
|
|
.. data:: TESTFN_UNDECODABLE
|
|
|
|
Set to a filename (bytes type) that should not be able to be decoded by
|
|
file system encoding in strict mode. It may be ``None`` if it's not
|
|
possible to generate such a filename.
|
|
|
|
|
|
.. data:: TESTFN_UNICODE
|
|
|
|
Set to a non-ASCII name for a temporary file.
|
|
|
|
|
|
.. class:: EnvironmentVarGuard()
|
|
|
|
Class used to temporarily set or unset environment variables. Instances can
|
|
be used as a context manager and have a complete dictionary interface for
|
|
querying/modifying the underlying ``os.environ``. After exit from the
|
|
context manager all changes to environment variables done through this
|
|
instance will be rolled back.
|
|
|
|
.. versionchanged:: 3.1
|
|
Added dictionary interface.
|
|
|
|
|
|
.. class:: FakePath(path)
|
|
|
|
Simple :term:`path-like object`. It implements the
|
|
:meth:`~os.PathLike.__fspath__`
|
|
method which just returns the *path* argument. If *path* is an exception,
|
|
it will be raised in :meth:`!__fspath__`.
|
|
|
|
|
|
.. method:: EnvironmentVarGuard.set(envvar, value)
|
|
|
|
Temporarily set the environment variable ``envvar`` to the value of
|
|
``value``.
|
|
|
|
|
|
.. method:: EnvironmentVarGuard.unset(envvar)
|
|
|
|
Temporarily unset the environment variable ``envvar``.
|
|
|
|
|
|
.. function:: can_symlink()
|
|
|
|
Return ``True`` if the OS supports symbolic links, ``False``
|
|
otherwise.
|
|
|
|
|
|
.. function:: can_xattr()
|
|
|
|
Return ``True`` if the OS supports xattr, ``False``
|
|
otherwise.
|
|
|
|
|
|
.. function:: change_cwd(path, quiet=False)
|
|
|
|
A context manager that temporarily changes the current working
|
|
directory to *path* and yields the directory.
|
|
|
|
If *quiet* is ``False``, the context manager raises an exception
|
|
on error. Otherwise, it issues only a warning and keeps the current
|
|
working directory the same.
|
|
|
|
|
|
.. function:: create_empty_file(filename)
|
|
|
|
Create an empty file with *filename*. If it already exists, truncate it.
|
|
|
|
|
|
.. function:: fd_count()
|
|
|
|
Count the number of open file descriptors.
|
|
|
|
|
|
.. function:: fs_is_case_insensitive(directory)
|
|
|
|
Return ``True`` if the file system for *directory* is case-insensitive.
|
|
|
|
|
|
.. function:: make_bad_fd()
|
|
|
|
Create an invalid file descriptor by opening and closing a temporary file,
|
|
and returning its descriptor.
|
|
|
|
|
|
.. function:: rmdir(filename)
|
|
|
|
Call :func:`os.rmdir` on *filename*. On Windows platforms, this is
|
|
wrapped with a wait loop that checks for the existence of the file,
|
|
which is needed due to antivirus programs that can hold files open and prevent
|
|
deletion.
|
|
|
|
|
|
.. function:: rmtree(path)
|
|
|
|
Call :func:`shutil.rmtree` on *path* or call :func:`os.lstat` and
|
|
:func:`os.rmdir` to remove a path and its contents. As with :func:`rmdir`,
|
|
on Windows platforms
|
|
this is wrapped with a wait loop that checks for the existence of the files.
|
|
|
|
|
|
.. decorator:: skip_unless_symlink
|
|
|
|
A decorator for running tests that require support for symbolic links.
|
|
|
|
|
|
.. decorator:: skip_unless_xattr
|
|
|
|
A decorator for running tests that require support for xattr.
|
|
|
|
|
|
.. function:: temp_cwd(name='tempcwd', quiet=False)
|
|
|
|
A context manager that temporarily creates a new directory and
|
|
changes the current working directory (CWD).
|
|
|
|
The context manager creates a temporary directory in the current
|
|
directory with name *name* before temporarily changing the current
|
|
working directory. If *name* is ``None``, the temporary directory is
|
|
created using :func:`tempfile.mkdtemp`.
|
|
|
|
If *quiet* is ``False`` and it is not possible to create or change
|
|
the CWD, an error is raised. Otherwise, only a warning is raised
|
|
and the original CWD is used.
|
|
|
|
|
|
.. function:: temp_dir(path=None, quiet=False)
|
|
|
|
A context manager that creates a temporary directory at *path* and
|
|
yields the directory.
|
|
|
|
If *path* is ``None``, the temporary directory is created using
|
|
:func:`tempfile.mkdtemp`. If *quiet* is ``False``, the context manager
|
|
raises an exception on error. Otherwise, if *path* is specified and
|
|
cannot be created, only a warning is issued.
|
|
|
|
|
|
.. function:: temp_umask(umask)
|
|
|
|
A context manager that temporarily sets the process umask.
|
|
|
|
|
|
.. function:: unlink(filename)
|
|
|
|
Call :func:`os.unlink` on *filename*. As with :func:`rmdir`,
|
|
on Windows platforms, this is
|
|
wrapped with a wait loop that checks for the existence of the file.
|
|
|
|
|
|
:mod:`test.support.import_helper` --- Utilities for import tests
|
|
================================================================
|
|
|
|
.. module:: test.support.import_helper
|
|
:synopsis: Support for import tests.
|
|
|
|
The :mod:`test.support.import_helper` module provides support for import tests.
|
|
|
|
.. versionadded:: 3.10
|
|
|
|
|
|
.. function:: forget(module_name)
|
|
|
|
Remove the module named *module_name* from ``sys.modules`` and delete any
|
|
byte-compiled files of the module.
|
|
|
|
|
|
.. function:: import_fresh_module(name, fresh=(), blocked=(), deprecated=False)
|
|
|
|
This function imports and returns a fresh copy of the named Python module
|
|
by removing the named module from ``sys.modules`` before doing the import.
|
|
Note that unlike :func:`reload`, the original module is not affected by
|
|
this operation.
|
|
|
|
*fresh* is an iterable of additional module names that are also removed
|
|
from the ``sys.modules`` cache before doing the import.
|
|
|
|
*blocked* is an iterable of module names that are replaced with ``None``
|
|
in the module cache during the import to ensure that attempts to import
|
|
them raise :exc:`ImportError`.
|
|
|
|
The named module and any modules named in the *fresh* and *blocked*
|
|
parameters are saved before starting the import and then reinserted into
|
|
``sys.modules`` when the fresh import is complete.
|
|
|
|
Module and package deprecation messages are suppressed during this import
|
|
if *deprecated* is ``True``.
|
|
|
|
This function will raise :exc:`ImportError` if the named module cannot be
|
|
imported.
|
|
|
|
Example use::
|
|
|
|
# Get copies of the warnings module for testing without affecting the
|
|
# version being used by the rest of the test suite. One copy uses the
|
|
# C implementation, the other is forced to use the pure Python fallback
|
|
# implementation
|
|
py_warnings = import_fresh_module('warnings', blocked=['_warnings'])
|
|
c_warnings = import_fresh_module('warnings', fresh=['_warnings'])
|
|
|
|
.. versionadded:: 3.1
|
|
|
|
|
|
.. function:: import_module(name, deprecated=False, *, required_on=())
|
|
|
|
This function imports and returns the named module. Unlike a normal
|
|
import, this function raises :exc:`unittest.SkipTest` if the module
|
|
cannot be imported.
|
|
|
|
Module and package deprecation messages are suppressed during this import
|
|
if *deprecated* is ``True``. If a module is required on a platform but
|
|
optional for others, set *required_on* to an iterable of platform prefixes
|
|
which will be compared against :data:`sys.platform`.
|
|
|
|
.. versionadded:: 3.1
|
|
|
|
|
|
.. function:: modules_setup()
|
|
|
|
Return a copy of :data:`sys.modules`.
|
|
|
|
|
|
.. function:: modules_cleanup(oldmodules)
|
|
|
|
Remove modules except for *oldmodules* and ``encodings`` in order to
|
|
preserve internal cache.
|
|
|
|
|
|
.. function:: unload(name)
|
|
|
|
Delete *name* from ``sys.modules``.
|
|
|
|
|
|
.. function:: make_legacy_pyc(source)
|
|
|
|
Move a :pep:`3147`/:pep:`488` pyc file to its legacy pyc location and return the file
|
|
system path to the legacy pyc file. The *source* value is the file system
|
|
path to the source file. It does not need to exist, however the PEP
|
|
3147/488 pyc file must exist.
|
|
|
|
|
|
.. class:: CleanImport(*module_names)
|
|
|
|
A context manager to force import to return a new module reference. This
|
|
is useful for testing module-level behaviors, such as the emission of a
|
|
:exc:`DeprecationWarning` on import. Example usage::
|
|
|
|
with CleanImport('foo'):
|
|
importlib.import_module('foo') # New reference.
|
|
|
|
|
|
.. class:: DirsOnSysPath(*paths)
|
|
|
|
A context manager to temporarily add directories to :data:`sys.path`.
|
|
|
|
This makes a copy of :data:`sys.path`, appends any directories given
|
|
as positional arguments, then reverts :data:`sys.path` to the copied
|
|
settings when the context ends.
|
|
|
|
Note that *all* :data:`sys.path` modifications in the body of the
|
|
context manager, including replacement of the object,
|
|
will be reverted at the end of the block.
|
|
|
|
|
|
:mod:`test.support.warnings_helper` --- Utilities for warnings tests
|
|
====================================================================
|
|
|
|
.. module:: test.support.warnings_helper
|
|
:synopsis: Support for warnings tests.
|
|
|
|
The :mod:`test.support.warnings_helper` module provides support for warnings tests.
|
|
|
|
.. versionadded:: 3.10
|
|
|
|
|
|
.. function:: ignore_warnings(*, category)
|
|
|
|
Suppress warnings that are instances of *category*,
|
|
which must be :exc:`Warning` or a subclass.
|
|
Roughly equivalent to :func:`warnings.catch_warnings`
|
|
with :meth:`warnings.simplefilter('ignore', category=category) <warnings.simplefilter>`.
|
|
For example::
|
|
|
|
@warning_helper.ignore_warnings(category=DeprecationWarning)
|
|
def test_suppress_warning():
|
|
# do something
|
|
|
|
.. versionadded:: 3.8
|
|
|
|
|
|
.. function:: check_no_resource_warning(testcase)
|
|
|
|
Context manager to check that no :exc:`ResourceWarning` was raised. You
|
|
must remove the object which may emit :exc:`ResourceWarning` before the
|
|
end of the context manager.
|
|
|
|
|
|
.. function:: check_syntax_warning(testcase, statement, errtext='', *, lineno=1, offset=None)
|
|
|
|
Test for syntax warning in *statement* by attempting to compile *statement*.
|
|
Test also that the :exc:`SyntaxWarning` is emitted only once, and that it
|
|
will be converted to a :exc:`SyntaxError` when turned into error.
|
|
*testcase* is the :mod:`unittest` instance for the test. *errtext* is the
|
|
regular expression which should match the string representation of the
|
|
emitted :exc:`SyntaxWarning` and raised :exc:`SyntaxError`. If *lineno*
|
|
is not ``None``, compares to the line of the warning and exception.
|
|
If *offset* is not ``None``, compares to the offset of the exception.
|
|
|
|
.. versionadded:: 3.8
|
|
|
|
|
|
.. function:: check_warnings(*filters, quiet=True)
|
|
|
|
A convenience wrapper for :func:`warnings.catch_warnings()` that makes it
|
|
easier to test that a warning was correctly raised. It is approximately
|
|
equivalent to calling ``warnings.catch_warnings(record=True)`` with
|
|
:meth:`warnings.simplefilter` set to ``always`` and with the option to
|
|
automatically validate the results that are recorded.
|
|
|
|
``check_warnings`` accepts 2-tuples of the form ``("message regexp",
|
|
WarningCategory)`` as positional arguments. If one or more *filters* are
|
|
provided, or if the optional keyword argument *quiet* is ``False``,
|
|
it checks to make sure the warnings are as expected: each specified filter
|
|
must match at least one of the warnings raised by the enclosed code or the
|
|
test fails, and if any warnings are raised that do not match any of the
|
|
specified filters the test fails. To disable the first of these checks,
|
|
set *quiet* to ``True``.
|
|
|
|
If no arguments are specified, it defaults to::
|
|
|
|
check_warnings(("", Warning), quiet=True)
|
|
|
|
In this case all warnings are caught and no errors are raised.
|
|
|
|
On entry to the context manager, a :class:`WarningRecorder` instance is
|
|
returned. The underlying warnings list from
|
|
:func:`~warnings.catch_warnings` is available via the recorder object's
|
|
:attr:`warnings` attribute. As a convenience, the attributes of the object
|
|
representing the most recent warning can also be accessed directly through
|
|
the recorder object (see example below). If no warning has been raised,
|
|
then any of the attributes that would otherwise be expected on an object
|
|
representing a warning will return ``None``.
|
|
|
|
The recorder object also has a :meth:`reset` method, which clears the
|
|
warnings list.
|
|
|
|
The context manager is designed to be used like this::
|
|
|
|
with check_warnings(("assertion is always true", SyntaxWarning),
|
|
("", UserWarning)):
|
|
exec('assert(False, "Hey!")')
|
|
warnings.warn(UserWarning("Hide me!"))
|
|
|
|
In this case if either warning was not raised, or some other warning was
|
|
raised, :func:`check_warnings` would raise an error.
|
|
|
|
When a test needs to look more deeply into the warnings, rather than
|
|
just checking whether or not they occurred, code like this can be used::
|
|
|
|
with check_warnings(quiet=True) as w:
|
|
warnings.warn("foo")
|
|
assert str(w.args[0]) == "foo"
|
|
warnings.warn("bar")
|
|
assert str(w.args[0]) == "bar"
|
|
assert str(w.warnings[0].args[0]) == "foo"
|
|
assert str(w.warnings[1].args[0]) == "bar"
|
|
w.reset()
|
|
assert len(w.warnings) == 0
|
|
|
|
|
|
Here all warnings will be caught, and the test code tests the captured
|
|
warnings directly.
|
|
|
|
.. versionchanged:: 3.2
|
|
New optional arguments *filters* and *quiet*.
|
|
|
|
|
|
.. class:: WarningsRecorder()
|
|
|
|
Class used to record warnings for unit tests. See documentation of
|
|
:func:`check_warnings` above for more details.
|