Metadata-Version: 2.4
Name: pytest-testinel
Version: 0.9.1
Summary: Testinel’s pytest plugin captures structured Selenium and Playwright test execution data directly from pytest and sends it to Testinel, where your test results become searchable, comparable, and actually useful.
Author: Volodymyr Obrizan
Author-email: Volodymyr Obrizan <obrizan@first.institute>
License-Expression: MIT
License-File: LICENSE
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: 3.15
Classifier: Programming Language :: Python :: 3.16
Classifier: Operating System :: OS Independent
Classifier: Development Status :: 4 - Beta
Classifier: Framework :: Pytest
Classifier: Topic :: Software Development :: Testing
Requires-Dist: pytest>=7
Requires-Dist: requests>=2
Requires-Python: >=3.11, <3.17
Project-URL: Homepage, https://testinel.dev
Project-URL: Repository, https://github.com/Testinel/pytest-testinel
Project-URL: Issues, https://github.com/Testinel/pytest-testinel/issues
Description-Content-Type: text/markdown

## Official Testinel plugin for pytest

Testinel’s pytest plugin captures structured Selenium and Playwright test execution data directly from pytest and sends it to Testinel, where your test results become searchable, comparable, and actually useful. No log scraping. No brittle CI hacks. Just deterministic test analytics.

## 📦 Getting Started
### Prerequisites

You need a Testinel [account](https://testinel.dev/accounts/signup/?next=/projects/) and [project](https://testinel.dev/projects/).

Python 3.11 through 3.16 is required.

### Installation

Getting Testinel into your project is straightforward. Just run this command in your terminal:

```
pip install --upgrade pytest-testinel
```

Or with `uv`:

```
uv add pytest-testinel
```

### Configuration

Set Testinel reporter DSN environment variable `TESTINEL_DSN`. Get DSN for your project at [https://testinel.dev/projects/](https://testinel.dev/projects/).

Examples:

```
# Report to Testinel (HTTPS)
export TESTINEL_DSN="https://your.testinel.endpoint/ingest/xxxxxxxxxxxx/"
```

```
# Report to a local file (JSON)
export TESTINEL_DSN="file:///tmp/testinel-results.json"

# Or use a direct file path
export TESTINEL_DSN="./testinel-results.json"
```

### Logging

Testinel uses pytest's standard logging controls.

Each reported event has a UUID `event_id` in its JSON body, including events
written to a local file. Each HTTP event submission and upload-link request
gets a fresh UUID `request_id`, sent in both the `X-Request-ID` header and the
JSON body. Sending the same event again preserves its `event_id` and generates
a new `request_id`. The IDs are logged at `DEBUG` before sending the request.
Signed binary uploads retain the headers supplied by the storage provider.

If an event submission returns HTTP 404, Testinel disables reporting for the rest
of the run and emits one terminal warning and one `WARNING` log record. Check
`TESTINEL_DSN` and your project at [https://testinel.dev/projects/](https://testinel.dev/projects/).
Tests continue normally with their usual exit status. No further events or new
attachments are sent; queued uploads are discarded, while an upload already in
progress may finish. A fresh pytest process tries reporting again. Other request
failures, including attachment-link or storage-upload 404s, keep their existing
best-effort behavior.

To set the logging level to `INFO` for all pytest loggers and show the messages
live, run:

```bash
pytest --log-level=INFO --log-cli-level=INFO
```

To change the level for pytest-testinel only, set its parent logger in your
project's `conftest.py`:

```python
import logging


def pytest_configure() -> None:
    logging.getLogger("pytest_testinel").setLevel(logging.INFO)
```

To also show these messages live, enable pytest's live logging:

```bash
pytest -o log_cli=true
```

Other loggers keep their existing levels. Replace `INFO` with `DEBUG`,
`WARNING`, or another standard Python logging level as needed.

Use pytest's `--log-file`, `--log-format`, and related options to control log
storage and formatting.

### Recommended pytest flags

For better debugging and richer failure context, it is highly recommended to run pytest with:

`--showlocals --tb=long -vv`

Why:

- `--showlocals`: includes local variable values in tracebacks, which makes root-cause analysis much faster.
- `--tb=long`: shows full, non-truncated tracebacks so you can see complete failure paths.
- `-vv`: increases verbosity, showing more detailed test identifiers and execution output.

Example:

```bash
pytest --showlocals --tb=long -vv
```

### Recommended Playwright flags

If you run browser tests with `pytest-playwright`, these flags provide better artifacts for debugging:

`--tracing=retain-on-failure --video=retain-on-failure --screenshot=only-on-failure --output=test-results`

Why:

- `--tracing=retain-on-failure`: captures a full Playwright trace for failed tests only.
- `--video=retain-on-failure`: keeps video recordings only for failed tests.
- `--screenshot=only-on-failure`: saves screenshots at failure time.
- `--output=test-results`: stores artifacts in a predictable directory.

Example:

```bash
pytest --tracing=retain-on-failure --video=retain-on-failure --screenshot=only-on-failure --output=test-results
```

## Development

Run the test matrix with tox:

```bash
uv run tox
```

The matrix covers Python 3.11 through 3.16 against the latest available release
in each pytest major version: 7, 8, and 9. Each environment installs the package
as a wheel. Missing Python interpreters fail the run; install them before running
the full matrix.

Run one environment, or pass arguments to pytest:

```bash
uv run tox -e py311-pytest7
uv run tox -e py315-pytest9 -- tests/test_testinel.py -v
```

Use `uv run tox run -r` to recreate environments and resolve the latest pytest
releases after new versions are published.
