pytest-dev/pytest · error · ValueError

is not a string or pytest.mark.* Marker

Error message

is not a string or pytest.mark.* Marker

What it means

Node.add_marker accepts only a string (marker name resolved via pytest.mark) or a MarkDecorator instance. Any other type (int, exception, custom object) raises ValueError because the marker cannot be resolved.

Source

Thrown at src/_pytest/nodes.py:323

        chain.reverse()
        return chain

    def add_marker(self, marker: str | MarkDecorator, append: bool = True) -> None:
        """Dynamically add a marker object to the node.

        :param marker:
            The marker.
        :param append:
            Whether to append the marker, or prepend it.
        """
        from _pytest.mark import MARK_GEN

        if isinstance(marker, MarkDecorator):
            marker_ = marker
        elif isinstance(marker, str):
            marker_ = getattr(MARK_GEN, marker)
        else:
            raise ValueError("is not a string or pytest.mark.* Marker")
        self.keywords[marker_.name] = marker_
        if append:
            self.own_markers.append(marker_.mark)
        else:
            self.own_markers.insert(0, marker_.mark)

    def iter_markers(self, name: str | None = None) -> Iterator[Mark]:
        """Iterate over all markers of the node.

        :param name: If given, filter the results by the name attribute.
        :returns: An iterator of the markers of the node.
        """
        return (x[1] for x in self.iter_markers_with_node(name=name))

    def iter_markers_with_node(
        self, name: str | None = None
    ) -> Iterator[tuple[Node, Mark]]:
        """Iterate over all markers of the node.

View on GitHub (pinned to 98b357f69e)

Solutions

  1. Pass a marker name string: node.add_marker('skip')
  2. Pass a MarkDecorator: node.add_marker(pytest.mark.skip)

Example fix

// before
node.add_marker(my_marker_object)
// after
node.add_marker(pytest.mark.skip)
Defensive patterns

Strategy: type-guard

Validate before calling

from _pytest.mark import MarkDecorator
def safe_add_marker(node, marker):
    if not (isinstance(marker, (str, MarkDecorator))):
        raise TypeError('marker must be str or MarkDecorator')
    node.add_marker(marker)

Type guard

from _pytest.mark import MarkDecorator
def is_valid_marker(m) -> bool:
    return isinstance(m, (str, MarkDecorator))

Prevention

When it happens

Trigger: node.add_marker(123), node.add_marker(some_object), or passing a Mark object (not a MarkDecorator) instead of the decorator form.

Common situations: Programmatic marker application where the value comes from untrusted data; confusion between pytest.mark.x (MarkDecorator) and a stored Mark.

Related errors


AI-assisted analysis of pytest-dev/pytest@98b357f69e (2026-08-04). Data as JSON: /data/errors/0aa1a81270f1bbbe.json. Report an issue: GitHub.