mirror of
https://github.com/python/cpython.git
synced 2025-07-23 11:15:24 +00:00

Add explicit `asyncSetUp` and `asyncTearDown` methods. The rest is the same as for #13228 `AsyncTestCase` create a loop instance for every test for the sake of test isolation. Sometimes a loop shared between all tests can speed up tests execution time a lot but it requires control of closed resources after every test finish. Basically, it requires nested supervisors support that was discussed with @1st1 many times. Sorry, asyncio supervisors have no chance to land on Python 3.8. The PR intentionally does not provide API for changing the used event loop or getting the test loop: use `asyncio.set_event_loop_policy()` and `asyncio.get_event_loop()` instead. The PR adds four overridable methods to base `unittest.TestCase` class: ``` def _callSetUp(self): self.setUp() def _callTestMethod(self, method): method() def _callTearDown(self): self.tearDown() def _callCleanup(self, function, /, *args, **kwargs): function(*args, **kwargs) ``` It allows using asyncio facilities with minimal influence on the unittest code. The last but not least: the PR respects contextvars. The context variable installed by `asyncSetUp` is available on test, `tearDown` and a coroutine scheduled by `addCleanup`. https://bugs.python.org/issue32972
80 lines
3.2 KiB
Python
80 lines
3.2 KiB
Python
"""
|
|
Python unit testing framework, based on Erich Gamma's JUnit and Kent Beck's
|
|
Smalltalk testing framework (used with permission).
|
|
|
|
This module contains the core framework classes that form the basis of
|
|
specific test cases and suites (TestCase, TestSuite etc.), and also a
|
|
text-based utility class for running the tests and reporting the results
|
|
(TextTestRunner).
|
|
|
|
Simple usage:
|
|
|
|
import unittest
|
|
|
|
class IntegerArithmeticTestCase(unittest.TestCase):
|
|
def testAdd(self): # test method names begin with 'test'
|
|
self.assertEqual((1 + 2), 3)
|
|
self.assertEqual(0 + 1, 1)
|
|
def testMultiply(self):
|
|
self.assertEqual((0 * 10), 0)
|
|
self.assertEqual((5 * 8), 40)
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|
|
|
|
Further information is available in the bundled documentation, and from
|
|
|
|
http://docs.python.org/library/unittest.html
|
|
|
|
Copyright (c) 1999-2003 Steve Purcell
|
|
Copyright (c) 2003-2010 Python Software Foundation
|
|
This module is free software, and you may redistribute it and/or modify
|
|
it under the same terms as Python itself, so long as this copyright message
|
|
and disclaimer are retained in their original form.
|
|
|
|
IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
|
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF
|
|
THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
|
DAMAGE.
|
|
|
|
THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT
|
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
|
PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS,
|
|
AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
|
|
SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
|
"""
|
|
|
|
__all__ = ['TestResult', 'TestCase', 'IsolatedAsyncioTestCase', 'TestSuite',
|
|
'TextTestRunner', 'TestLoader', 'FunctionTestCase', 'main',
|
|
'defaultTestLoader', 'SkipTest', 'skip', 'skipIf', 'skipUnless',
|
|
'expectedFailure', 'TextTestResult', 'installHandler',
|
|
'registerResult', 'removeResult', 'removeHandler',
|
|
'addModuleCleanup']
|
|
|
|
# Expose obsolete functions for backwards compatibility
|
|
__all__.extend(['getTestCaseNames', 'makeSuite', 'findTestCases'])
|
|
|
|
__unittest = True
|
|
|
|
from .result import TestResult
|
|
from .async_case import IsolatedAsyncioTestCase
|
|
from .case import (addModuleCleanup, TestCase, FunctionTestCase, SkipTest, skip,
|
|
skipIf, skipUnless, expectedFailure)
|
|
from .suite import BaseTestSuite, TestSuite
|
|
from .loader import (TestLoader, defaultTestLoader, makeSuite, getTestCaseNames,
|
|
findTestCases)
|
|
from .main import TestProgram, main
|
|
from .runner import TextTestRunner, TextTestResult
|
|
from .signals import installHandler, registerResult, removeResult, removeHandler
|
|
|
|
# deprecated
|
|
_TextTestResult = TextTestResult
|
|
|
|
# There are no tests here, so don't try to run anything discovered from
|
|
# introspecting the symbols (e.g. FunctionTestCase). Instead, all our
|
|
# tests come from within unittest.test.
|
|
def load_tests(loader, tests, pattern):
|
|
import os.path
|
|
# top level directory cached on loader instance
|
|
this_dir = os.path.dirname(__file__)
|
|
return loader.discover(start_dir=this_dir, pattern=pattern)
|