diff --git a/crates/ruff_linter/resources/test/fixtures/flake8_pytest_style/PT010.py b/crates/ruff_linter/resources/test/fixtures/flake8_pytest_style/PT010.py index e6cc58cbc3..4191976043 100644 --- a/crates/ruff_linter/resources/test/fixtures/flake8_pytest_style/PT010.py +++ b/crates/ruff_linter/resources/test/fixtures/flake8_pytest_style/PT010.py @@ -9,3 +9,15 @@ def test_ok(): def test_error(): with pytest.raises(UnicodeError): pass + +def test_match_only(): + with pytest.raises(match="some error message"): + pass + +def test_check_only(): + with pytest.raises(check=lambda e: True): + pass + +def test_match_and_check(): + with pytest.raises(match="some error message", check=lambda e: True): + pass diff --git a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/raises.rs b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/raises.rs index 04c9a8c372..d11adaeea1 100644 --- a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/raises.rs +++ b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/raises.rs @@ -126,6 +126,9 @@ impl Violation for PytestRaisesTooBroad { /// `pytest.raises` expects to receive an expected exception as its first /// argument. If omitted, the `pytest.raises` call will fail at runtime. /// +/// Note: As of pytest 8.4.0, calls with only `match` or `check` keyword +/// arguments (without an exception class) are also valid. +/// /// ## Example /// ```python /// import pytest @@ -181,6 +184,8 @@ pub(crate) fn raises_call(checker: &Checker, call: &ast::ExprCall) { .arguments .find_argument("expected_exception", 0) .is_none() + && call.arguments.find_keyword("match").is_none() + && call.arguments.find_keyword("check").is_none() { checker.report_diagnostic(PytestRaisesWithoutException, call.func.range()); }