Metadata-Version: 2.4
Name: thierryade-pytest
Version: 1.2.0
Summary: Plugin pytest pour Thierryade : marqueur covers(), propriétés JUnit, et poussée de couverture (Thierryade + rapport Argus).
Author: stationmyr
License: GPL-3.0-or-later
Project-URL: Homepage, https://git.stationmyr.net/thierryade/thierryade-pytest
Classifier: Framework :: Pytest
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
Classifier: Programming Language :: Python :: 3
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: pytest>=7
Requires-Dist: defusedxml>=0.7
Provides-Extra: dev
Requires-Dist: pytest>=8; extra == "dev"
Requires-Dist: pytest-cov; extra == "dev"
Dynamic: license-file

# thierryade-pytest

[![CI](https://git.stationmyr.net/thierryade/thierryade-pytest/badges/workflows/ci.yml/badge.svg?branch=master)](https://git.stationmyr.net/thierryade/thierryade-pytest/actions?workflow=ci.yml)
[![License: GPLv3](https://img.shields.io/badge/License-GPLv3-blue.svg)](LICENSE)

Plugin pytest pour [Thierryade](https://git.stationmyr.net/thierryade) :
relie automatiquement vos tests unitaires aux specs (raffinements compris)
que vous avez documentées dans Thierryade, et pousse le résultat de
chaque run CI directement vers l'outil.

## Installation

```bash
pip install thierryade-pytest
```

Aucune configuration supplémentaire : le marqueur `covers` est
enregistré automatiquement (entry point `pytest11`), pas besoin de le
déclarer dans votre `pytest.ini`.

## Usage

Dans vos tests, référencez le code de la spec Thierryade (`DRH-17`) que
ce test vérifie :

```python
import pytest

@pytest.mark.covers("DRH-17")
def test_commit_transfer_locks_the_registration_and_sends_an_email():
    ...
```

Un test peut couvrir plusieurs codes : `@pytest.mark.covers("DRH-17", "DRH-23")`.

Un raffinement est une spec comme une autre, avec son propre code. Les
anciens codes de raffinage (`DRH-R-9`), d'avant la refonte de
Thierryade, restent acceptés : ils désignent désormais la spec qui a
repris ce raffinage.

Après un run normal avec `--junitxml=junit.xml`, les codes couverts sont
automatiquement sérialisés dans les `<properties>` de chaque
`<testcase>`. Poussez-les ensuite vers Thierryade (typiquement une étape
de CI, après le job de tests) :

```bash
thierryade-pytest push-coverage \
  --junit-xml junit.xml \
  --thierryade-url https://thierryade.stationmyr.net \
  --thierryade-token "$THIERRYADE_UPLOAD_TOKEN" \
  --commit-sha "$GITHUB_SHA" \
  --ci-run-url "$CI_RUN_URL" \
  --argus-report-out argus-thierryade-report.json
```

`--argus-report-out` est optionnel : s'il est fourni, un second fichier
JSON est écrit au format générique d'Argus (« format maison »), à
uploader avec l'action partagée
[`argus/upload-action`](https://git.stationmyr.net/argus/upload-action) :

```yaml
- uses: https://git.stationmyr.net/argus/upload-action@v1
  with:
    token: ${{ secrets.ARGUS_UPLOAD_TOKEN }}
    reports: custom argus-thierryade-report.json thierryade-coverage
```

Un code inconnu de Thierryade n'interrompt jamais le reste du push (il
est juste signalé) ; une erreur de transport/HTTP, en revanche, fait
échouer la commande -- ce mécanisme alimente une vraie base de données,
pas juste un badge informatif.

`--log-level debug|info|warning|error` (défaut `info`) règle la
verbosité (requêtes HTTP, codes rencontrés, etc. en `debug`).

## Développement

Voir le `Makefile` (`make dev`, `make test`, `make lint`, `make tox`).
