-
-
Notifications
You must be signed in to change notification settings - Fork 2.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add RaisesGroup & Matcher #13192
base: main
Are you sure you want to change the base?
add RaisesGroup & Matcher #13192
Conversation
src/_pytest/_raises_group.py
Outdated
|
||
|
||
@final | ||
class Matcher(AbstractMatcher[MatchE]): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We ought not to use such a generic name easily
There's a general wishlist plan to enable matchers as a whole that act similar to dirty equals
The matcher api that's being used here conflates multiple aspects of that in a manner that's problematic to partition later
Ideally the whole api around matchers is first evolved as a plugin to avoid early api lock in as it's hard to make good matchers
I'll elaborate further when the flu is over
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sure, I can rename it... maybe something that's closer to RaisesGroup
... RaisesExc
/RaisesException
? or something like ExpectedExc
/ExpectedException
This has been available & in use for >1 year in trio, which has allowed the interface to mature. I don't think pytest needs to repeat that process by putting it in a plugin.
I know you've mentioned matcher objects in #11538 and I'm excited for what that might entail in the future, but I don't think we want to wait for that to add usable exceptiongroup support. If you have concrete ways of improving the RaisesGroup
interface to harmonize with it I'm of course open to suggestions though.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've been heavily involved in the design and review for this feature as we've developed and shipped it in Trio. I'm excited to get it into Pytest (and ideally soonish), but I shouldn't be the only approving core dev for a substantial feature.
…s on RaisesGroup&RaisesExc. Add warnings to group_contains. Remove group_contains example from getting-started page
@Zac-HD please review the documentation :) It feels a bit silly to add big warning boxes to |
Previous PR's: #11656 (ExpectedExceptionGroup), #11671 (closed to give this a fresh PR w/o stale comments)
fixes: #11538 #12504
This adds
RaisesGroup
(also exported asraises_group
) andMatcher
, to allow a robust way of expectingExceptionGroup
and the ability to specify the structure of nested groups, etc etc.This is the exact implementation available in trio.testing.RaisesGroup which has been in use since december 2023 and gone through a couple iterations since to settle on a good interface. The most recent addition was python-trio/trio#3145 which added error messages, where the formatting can probably still be fine-tuned.
Pytest currently has excinfo.group_contains for checking exceptiongroups... which is very problematic. I think it should be deprecated, either in the same release as this PR, or very soon after.
This currently does not touch the implementation of
pytest.raises
, but if we madeMatcher
a contextmanager we could easily supportthis would fix e.g. #12763 with Matcher having the
check
parameter. The only complication is the legacy form of pytest.raises but that should be solvable with a small helper function.This can however be done in a followup PR.
This currently does not add an
.assert_matches
method, which previous iterations of the PR had. The reason to add that would be to improve the error message on failure, though it's possible to get the same result withthough note that
.matches()
is already a fairly niche feature that is entirely separate to the context-manager use (not to be confused with thematch
parameter).TODO: