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
- Pass a marker name string: node.add_marker('skip')
- 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
- Prefer passing marker name strings when applying markers dynamically
- Use pytest.mark.<name> to obtain a MarkDecorator rather than reaching for internal Mark objects
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
- warning must be an instance of Warning or subclass, got {war
- {cat} is not a Warning subclass
- invalid type for ini option {name!r}: {type_!r} (expected on
- invalid type for ini option {name!r}: Literal choices must b
- Keyword expressions do not support call parameters.
AI-assisted analysis of pytest-dev/pytest@98b357f69e (2026-08-04).
Data as JSON: /data/errors/0aa1a81270f1bbbe.json.
Report an issue: GitHub.