Skip to content

Report subtests through the exception handlers - #633

Merged
jelmer merged 1 commit into
masterfrom
subtest-fixes
Sep 14, 2026
Merged

jelmer merged 1 commit into
masterfrom
subtest-fixes

Conversation

@jelmer

@jelmer jelmer commented Sep 14, 2026

Copy link
Copy Markdown
Member

Subtest failures were buffered on the test case and replayed at the end of RunTest._run_core, bypassing testtools' own exception machinery. That lost several behaviours relative to a non-subtest failure:

  • a subclass overriding skipException had its skip reported as an error, since subTest caught the hardcoded unittest.SkipTest
  • expectFailure inside a subtest leaked the private _ExpectedFailure as an error instead of recording an expected failure
  • MultipleExceptions was reported verbatim rather than unpacked
  • details attached inside a failing subtest never reached the result
  • AsynchronousDeferredRunTest._run_core never drained the buffers, so a failing subtest reported as a pass

Report each subtest as it completes instead, dispatching on the case's exception handlers and passing the details accumulated inside the block. Since reporting no longer lives in _run_core, the Twisted runner is covered too; it only needs to know not to also report success.

Also align with unittest where the buffering had diverged.

Follow-up to #630.

Subtest failures were buffered on the test case and replayed at the end
of RunTest._run_core, bypassing testtools' own exception machinery. That
lost several behaviours relative to a non-subtest failure:

- a subclass overriding `skipException` had its skip reported as an error,
  since `subTest` caught the hardcoded `unittest.SkipTest`
- `expectFailure` inside a subtest leaked the private `_ExpectedFailure`
  as an error instead of recording an expected failure
- `MultipleExceptions` was reported verbatim rather than unpacked
- details attached inside a failing subtest never reached the result
- `AsynchronousDeferredRunTest._run_core` never drained the buffers, so a
  failing subtest reported as a pass

Report each subtest as it completes instead, dispatching on the case's
exception handlers and passing the details accumulated inside the block.
Since reporting no longer lives in `_run_core`, the Twisted runner is
covered too; it only needs to know not to also report success.

Also align with unittest where the buffering had diverged.

Follow-up to #630.
@jelmer
jelmer enabled auto-merge September 14, 2026 20:17
@jelmer
jelmer merged commit a72490e into master Sep 14, 2026
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant