---
title: "Run M3 tests in CI"
description: "m3 ci test uses the normal project Python, storage, harness, and pytest selection. It excludes tests whose nearest M3 marker sets ci=False."
---

> M3 v0.2.16 · commit 796f6943274f075d973f267794444b91ba208010.


# Run M3 tests in CI

`m3 ci test` uses the normal project Python, storage, harness, and pytest
selection. It excludes tests whose nearest M3 marker sets `ci=False`.

```python
import pytest

pytestmark = pytest.mark.m3(suite_name="shipping")


@pytest.mark.m3(ci=False)
def test_requires_a_person_at_the_keyboard():
    answer = input("Type yes after checking the test system: ")
    assert answer == "yes"
```

Run the credential-free selection locally before adding a workflow:

```sh
m3 setup
m3 ci test -- tests/
```

Ordinary `m3 test` still includes the marked test. Paths, `-k`, `-m`, and
`--suite` combine with the CI exclusion. Publishing is separate and occurs
only when `--upload` is present.

Continue to [GitHub Actions](https://m3.sineframe.com/docs/guides/ci/github-actions.md).
