Skip to content

Testing

Rules validating test structure.

pynudger.rule.testing.AssertCount

Bases: Check, Python, Node

Rule checking extra assert statements in pytest tests.

pynudger.rule.testing.AssertCount.values

values()

Yield assert statements from pytest-style functions.

Yields:

Type Description
Iterable[Value[Assert]]

Assert statements inside matching test functions.

Source code in src/pynudger/rule/testing.py
def values(self) -> collections.abc.Iterable[lintkit.Value[ast.Assert]]:
    """Yield assert statements from pytest-style functions.

    Yields:
        Assert statements inside matching test functions.

    """
    path = self.file.resolve()  # pyright: ignore[reportOptionalMemberAccess]
    if not path.name.startswith("test") and not path.stem.endswith("test"):
        return

    data: list[ast.FunctionDef] = self.getitem("nodes_map")[ast.FunctionDef]
    for function_def in data:
        if function_def.name.startswith("test"):
            self._count: int = 0
            for statement in function_def.body:
                if isinstance(statement, ast.Assert):
                    yield lintkit.Value.from_python(statement, statement)
        else:  # pragma: no cover
            pass

pynudger.rule.testing.AssertCount.check

check(_)

Report asserts only when a test contains too many of them.

Parameters:

Name Type Description Default
_ Value[Assert]

Loaded assert statement.

required

Returns:

Type Description
bool

True if the current test function has more than two asserts.

Source code in src/pynudger/rule/testing.py
def check(self, _: lintkit.Value[ast.Assert]) -> bool:
    """Report asserts only when a test contains too many of them.

    Args:
        _:
            Loaded assert statement.

    Returns:
        True if the current test function has more than two asserts.

    """
    self._count += 1
    return self._count > self._maximum_test_asserts()

pynudger.rule.testing.AssertCount.description

description()

Return rule description.

Returns:

Type Description
str

Description of the rule.

Source code in src/pynudger/rule/testing.py
def description(self) -> str:
    """Return rule description.

    Returns:
        Description of the rule.

    """
    return (
        f"Avoid more than {self._maximum_test_asserts()} assert "
        "statements in pytest tests. Keep each test focused."
    )

pynudger.rule.testing.AssertCount.message

message(_)

Return a multiple-assert violation message.

Parameters:

Name Type Description Default
_ Value[Assert]

Extra assert statement.

required

Returns:

Type Description
str

Message describing the rule violation.

Source code in src/pynudger/rule/testing.py
def message(self, _: lintkit.Value[ast.Assert]) -> str:
    """Return a multiple-assert violation message.

    Args:
        _:
            Extra assert statement.

    Returns:
        Message describing the rule violation.

    """
    return self.description()