Skip to content

Commit 10e6506

Browse files
authored
bpo-40275: Add warnings_helper submodule in test.support (GH-20797)
1 parent bdfe9b6 commit 10e6506

File tree

3 files changed

+288
-267
lines changed

3 files changed

+288
-267
lines changed

Doc/library/test.rst

+102-93
Original file line numberDiff line numberDiff line change
@@ -497,79 +497,6 @@ The :mod:`test.support` module defines the following functions:
497497
check_impl_detail(cpython=False) # Everywhere except CPython.
498498

499499

500-
.. function:: check_warnings(\*filters, quiet=True)
501-
502-
A convenience wrapper for :func:`warnings.catch_warnings()` that makes it
503-
easier to test that a warning was correctly raised. It is approximately
504-
equivalent to calling ``warnings.catch_warnings(record=True)`` with
505-
:meth:`warnings.simplefilter` set to ``always`` and with the option to
506-
automatically validate the results that are recorded.
507-
508-
``check_warnings`` accepts 2-tuples of the form ``("message regexp",
509-
WarningCategory)`` as positional arguments. If one or more *filters* are
510-
provided, or if the optional keyword argument *quiet* is ``False``,
511-
it checks to make sure the warnings are as expected: each specified filter
512-
must match at least one of the warnings raised by the enclosed code or the
513-
test fails, and if any warnings are raised that do not match any of the
514-
specified filters the test fails. To disable the first of these checks,
515-
set *quiet* to ``True``.
516-
517-
If no arguments are specified, it defaults to::
518-
519-
check_warnings(("", Warning), quiet=True)
520-
521-
In this case all warnings are caught and no errors are raised.
522-
523-
On entry to the context manager, a :class:`WarningRecorder` instance is
524-
returned. The underlying warnings list from
525-
:func:`~warnings.catch_warnings` is available via the recorder object's
526-
:attr:`warnings` attribute. As a convenience, the attributes of the object
527-
representing the most recent warning can also be accessed directly through
528-
the recorder object (see example below). If no warning has been raised,
529-
then any of the attributes that would otherwise be expected on an object
530-
representing a warning will return ``None``.
531-
532-
The recorder object also has a :meth:`reset` method, which clears the
533-
warnings list.
534-
535-
The context manager is designed to be used like this::
536-
537-
with check_warnings(("assertion is always true", SyntaxWarning),
538-
("", UserWarning)):
539-
exec('assert(False, "Hey!")')
540-
warnings.warn(UserWarning("Hide me!"))
541-
542-
In this case if either warning was not raised, or some other warning was
543-
raised, :func:`check_warnings` would raise an error.
544-
545-
When a test needs to look more deeply into the warnings, rather than
546-
just checking whether or not they occurred, code like this can be used::
547-
548-
with check_warnings(quiet=True) as w:
549-
warnings.warn("foo")
550-
assert str(w.args[0]) == "foo"
551-
warnings.warn("bar")
552-
assert str(w.args[0]) == "bar"
553-
assert str(w.warnings[0].args[0]) == "foo"
554-
assert str(w.warnings[1].args[0]) == "bar"
555-
w.reset()
556-
assert len(w.warnings) == 0
557-
558-
559-
Here all warnings will be caught, and the test code tests the captured
560-
warnings directly.
561-
562-
.. versionchanged:: 3.2
563-
New optional arguments *filters* and *quiet*.
564-
565-
566-
.. function:: check_no_resource_warning(testcase)
567-
568-
Context manager to check that no :exc:`ResourceWarning` was raised. You
569-
must remove the object which may emit :exc:`ResourceWarning` before the
570-
end of the context manager.
571-
572-
573500
.. function:: set_memlimit(limit)
574501

575502
Set the values for :data:`max_memuse` and :data:`real_max_memuse` for big
@@ -851,20 +778,6 @@ The :mod:`test.support` module defines the following functions:
851778
the offset of the exception.
852779

853780

854-
.. function:: check_syntax_warning(testcase, statement, errtext='', *, lineno=1, offset=None)
855-
856-
Test for syntax warning in *statement* by attempting to compile *statement*.
857-
Test also that the :exc:`SyntaxWarning` is emitted only once, and that it
858-
will be converted to a :exc:`SyntaxError` when turned into error.
859-
*testcase* is the :mod:`unittest` instance for the test. *errtext* is the
860-
regular expression which should match the string representation of the
861-
emitted :exc:`SyntaxWarning` and raised :exc:`SyntaxError`. If *lineno*
862-
is not ``None``, compares to the line of the warning and exception.
863-
If *offset* is not ``None``, compares to the offset of the exception.
864-
865-
.. versionadded:: 3.8
866-
867-
868781
.. function:: open_urlresource(url, *args, **kw)
869782

870783
Open *url*. If open fails, raises :exc:`TestFailed`.
@@ -1051,12 +964,6 @@ The :mod:`test.support` module defines the following classes:
1051964
Try to match a single stored value (*dv*) with a supplied value (*v*).
1052965

1053966

1054-
.. class:: WarningsRecorder()
1055-
1056-
Class used to record warnings for unit tests. See documentation of
1057-
:func:`check_warnings` above for more details.
1058-
1059-
1060967
.. class:: BasicTestRunner()
1061968

1062969
.. method:: run(test)
@@ -1659,3 +1566,105 @@ The :mod:`test.support.import_helper` module provides support for import tests.
16591566
will be reverted at the end of the block.
16601567

16611568

1569+
:mod:`test.support.warnings_helper` --- Utilities for warnings tests
1570+
====================================================================
1571+
1572+
.. module:: test.support.warnings_helper
1573+
:synopsis: Support for warnings tests.
1574+
1575+
The :mod:`test.support.warnings_helper` module provides support for warnings tests.
1576+
1577+
.. versionadded:: 3.10
1578+
1579+
1580+
.. function:: check_no_resource_warning(testcase)
1581+
1582+
Context manager to check that no :exc:`ResourceWarning` was raised. You
1583+
must remove the object which may emit :exc:`ResourceWarning` before the
1584+
end of the context manager.
1585+
1586+
1587+
.. function:: check_syntax_warning(testcase, statement, errtext='', *, lineno=1, offset=None)
1588+
1589+
Test for syntax warning in *statement* by attempting to compile *statement*.
1590+
Test also that the :exc:`SyntaxWarning` is emitted only once, and that it
1591+
will be converted to a :exc:`SyntaxError` when turned into error.
1592+
*testcase* is the :mod:`unittest` instance for the test. *errtext* is the
1593+
regular expression which should match the string representation of the
1594+
emitted :exc:`SyntaxWarning` and raised :exc:`SyntaxError`. If *lineno*
1595+
is not ``None``, compares to the line of the warning and exception.
1596+
If *offset* is not ``None``, compares to the offset of the exception.
1597+
1598+
.. versionadded:: 3.8
1599+
1600+
1601+
.. function:: check_warnings(\*filters, quiet=True)
1602+
1603+
A convenience wrapper for :func:`warnings.catch_warnings()` that makes it
1604+
easier to test that a warning was correctly raised. It is approximately
1605+
equivalent to calling ``warnings.catch_warnings(record=True)`` with
1606+
:meth:`warnings.simplefilter` set to ``always`` and with the option to
1607+
automatically validate the results that are recorded.
1608+
1609+
``check_warnings`` accepts 2-tuples of the form ``("message regexp",
1610+
WarningCategory)`` as positional arguments. If one or more *filters* are
1611+
provided, or if the optional keyword argument *quiet* is ``False``,
1612+
it checks to make sure the warnings are as expected: each specified filter
1613+
must match at least one of the warnings raised by the enclosed code or the
1614+
test fails, and if any warnings are raised that do not match any of the
1615+
specified filters the test fails. To disable the first of these checks,
1616+
set *quiet* to ``True``.
1617+
1618+
If no arguments are specified, it defaults to::
1619+
1620+
check_warnings(("", Warning), quiet=True)
1621+
1622+
In this case all warnings are caught and no errors are raised.
1623+
1624+
On entry to the context manager, a :class:`WarningRecorder` instance is
1625+
returned. The underlying warnings list from
1626+
:func:`~warnings.catch_warnings` is available via the recorder object's
1627+
:attr:`warnings` attribute. As a convenience, the attributes of the object
1628+
representing the most recent warning can also be accessed directly through
1629+
the recorder object (see example below). If no warning has been raised,
1630+
then any of the attributes that would otherwise be expected on an object
1631+
representing a warning will return ``None``.
1632+
1633+
The recorder object also has a :meth:`reset` method, which clears the
1634+
warnings list.
1635+
1636+
The context manager is designed to be used like this::
1637+
1638+
with check_warnings(("assertion is always true", SyntaxWarning),
1639+
("", UserWarning)):
1640+
exec('assert(False, "Hey!")')
1641+
warnings.warn(UserWarning("Hide me!"))
1642+
1643+
In this case if either warning was not raised, or some other warning was
1644+
raised, :func:`check_warnings` would raise an error.
1645+
1646+
When a test needs to look more deeply into the warnings, rather than
1647+
just checking whether or not they occurred, code like this can be used::
1648+
1649+
with check_warnings(quiet=True) as w:
1650+
warnings.warn("foo")
1651+
assert str(w.args[0]) == "foo"
1652+
warnings.warn("bar")
1653+
assert str(w.args[0]) == "bar"
1654+
assert str(w.warnings[0].args[0]) == "foo"
1655+
assert str(w.warnings[1].args[0]) == "bar"
1656+
w.reset()
1657+
assert len(w.warnings) == 0
1658+
1659+
1660+
Here all warnings will be caught, and the test code tests the captured
1661+
warnings directly.
1662+
1663+
.. versionchanged:: 3.2
1664+
New optional arguments *filters* and *quiet*.
1665+
1666+
1667+
.. class:: WarningsRecorder()
1668+
1669+
Class used to record warnings for unit tests. See documentation of
1670+
:func:`check_warnings` above for more details.

0 commit comments

Comments
 (0)