Merge pull request #7151 from nicoddemus/unittest-cleanup-6947
This commit is contained in:
@@ -537,28 +537,24 @@ class TestTrialUnittest:
|
||||
)
|
||||
result.stdout.fnmatch_lines(
|
||||
[
|
||||
"test_trial_error.py::TC::test_four SKIPPED",
|
||||
"test_trial_error.py::TC::test_four FAILED",
|
||||
"test_trial_error.py::TC::test_four ERROR",
|
||||
"test_trial_error.py::TC::test_one FAILED",
|
||||
"test_trial_error.py::TC::test_three FAILED",
|
||||
"test_trial_error.py::TC::test_two SKIPPED",
|
||||
"test_trial_error.py::TC::test_two ERROR",
|
||||
"test_trial_error.py::TC::test_two FAILED",
|
||||
"*ERRORS*",
|
||||
"*_ ERROR at teardown of TC.test_four _*",
|
||||
"NOTE: Incompatible Exception Representation, displaying natively:",
|
||||
"*DelayedCalls*",
|
||||
"*_ ERROR at teardown of TC.test_two _*",
|
||||
"NOTE: Incompatible Exception Representation, displaying natively:",
|
||||
"*DelayedCalls*",
|
||||
"*= FAILURES =*",
|
||||
# "*_ TC.test_four _*",
|
||||
# "*NameError*crash*",
|
||||
"*_ TC.test_four _*",
|
||||
"*NameError*crash*",
|
||||
"*_ TC.test_one _*",
|
||||
"*NameError*crash*",
|
||||
"*_ TC.test_three _*",
|
||||
"NOTE: Incompatible Exception Representation, displaying natively:",
|
||||
"*DelayedCalls*",
|
||||
"*= 2 failed, 2 skipped, 2 errors in *",
|
||||
"*_ TC.test_two _*",
|
||||
"*NameError*crash*",
|
||||
"*= 4 failed, 1 error in *",
|
||||
]
|
||||
)
|
||||
|
||||
@@ -876,6 +872,37 @@ def test_no_teardown_if_setupclass_failed(testdir):
|
||||
reprec.assertoutcome(passed=1, failed=1)
|
||||
|
||||
|
||||
def test_cleanup_functions(testdir):
|
||||
"""Ensure functions added with addCleanup are always called after each test ends (#6947)"""
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
import unittest
|
||||
|
||||
cleanups = []
|
||||
|
||||
class Test(unittest.TestCase):
|
||||
|
||||
def test_func_1(self):
|
||||
self.addCleanup(cleanups.append, "test_func_1")
|
||||
|
||||
def test_func_2(self):
|
||||
self.addCleanup(cleanups.append, "test_func_2")
|
||||
assert 0
|
||||
|
||||
def test_func_3_check_cleanups(self):
|
||||
assert cleanups == ["test_func_1", "test_func_2"]
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest("-v")
|
||||
result.stdout.fnmatch_lines(
|
||||
[
|
||||
"*::test_func_1 PASSED *",
|
||||
"*::test_func_2 FAILED *",
|
||||
"*::test_func_3_check_cleanups PASSED *",
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
def test_issue333_result_clearing(testdir):
|
||||
testdir.makeconftest(
|
||||
"""
|
||||
@@ -1131,6 +1158,41 @@ def test_trace(testdir, monkeypatch):
|
||||
assert result.ret == 0
|
||||
|
||||
|
||||
def test_pdb_teardown_called(testdir, monkeypatch):
|
||||
"""Ensure tearDown() is always called when --pdb is given in the command-line.
|
||||
|
||||
We delay the normal tearDown() calls when --pdb is given, so this ensures we are calling
|
||||
tearDown() eventually to avoid memory leaks when using --pdb.
|
||||
"""
|
||||
teardowns = []
|
||||
monkeypatch.setattr(
|
||||
pytest, "test_pdb_teardown_called_teardowns", teardowns, raising=False
|
||||
)
|
||||
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
import unittest
|
||||
import pytest
|
||||
|
||||
class MyTestCase(unittest.TestCase):
|
||||
|
||||
def tearDown(self):
|
||||
pytest.test_pdb_teardown_called_teardowns.append(self.id())
|
||||
|
||||
def test_1(self):
|
||||
pass
|
||||
def test_2(self):
|
||||
pass
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest_inprocess("--pdb")
|
||||
result.stdout.fnmatch_lines("* 2 passed in *")
|
||||
assert teardowns == [
|
||||
"test_pdb_teardown_called.MyTestCase.test_1",
|
||||
"test_pdb_teardown_called.MyTestCase.test_2",
|
||||
]
|
||||
|
||||
|
||||
def test_async_support(testdir):
|
||||
pytest.importorskip("unittest.async_case")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user