Pytest plugin that reports testinfra results to MariaDB or PostgreSQL backends and visualizes on Grafana.
Project description
pytest-testinfra-exporter
Backend-pluggable pytest reporting plugin with preserved pytest-testinfra host parsing behavior.
Installation
From the pytest-testinfra-exporter directory, install the plugin in editable mode:
pip install -e .
If you are standing one level above this directory, use:
pip install -e ./pytest-testinfra-exporter
Pytest will auto-discover the plugin through the package's pytest11 entry point, so no conftest.py changes are required.
Install a database driver if you plan to use a backend:
pip install -e ".[mariadb]"
or:
pip install -e ".[postgres]"
Usage
Once installed, enable reporting directly from the pytest command line:
pytest --storage-report --report-backend=mariadb
The plugin is loaded automatically during pytest startup.
Overview
This project now follows a Strategy + Adapter architecture:
- Core pytest hooks are implemented in
plugin.py. - Storage is delegated through
AbstractStorageBackendinbackend.py. - MariaDB support is implemented as
MariaDBBackendinbackends/mariadb.py. - PostgreSQL support is implemented as
PostgresBackendinbackends/postgres.py. - Normalized payloads are represented by dataclasses in
models.py.
The testinfra-specific logic is intentionally unchanged (including parsing of salt://, ssh://, fixture host resolution, and nodeid parsing).
Package structure
models.py— dataclasses used by the core reporter and backends.backend.py— backend interface contract.backends/mariadb.py— MariaDB adapter implementation.backends/postgres.py— PostgreSQL adapter implementation.plugin.py— pytest hooks, helper utilities, and failure tagging.schema/db.sql— full MariaDB schema reset/apply script.failure_mapper/failure_map.yaml— failure tag mapping rules.docs/index.rst— Sphinx documentation entry point.docs/usage.rst— Sphinx usage guide.docs/api.rst— Sphinx API reference.
Runtime architecture
pytest lifecycle hooks (plugin.py)
-> build backend strategy (--report-backend)
-> accumulate TestResultRecord objects in memory
-> backend.save_results(run_id, results)
-> backend.session_finish(run_id, counters)
Hook flow
pytest_sessionstart- creates run metadata (
TestRunSummary) - initializes selected backend
- persists session start
- creates run metadata (
pytest_runtest_makereport- captures metadata per nodeid (test name, suite, class, host, markers)
pytest_runtest_logreport- merges phase reports (
setup/call/teardown) - computes final status and captured artifacts
- appends
TestResultRecord
- merges phase reports (
pytest_sessionfinish- computes final counters
- delegates persistence to backend
pytest_terminal_summary- prints reporter and tagger status
CLI options
| Option | Default | Description |
|---|---|---|
--storage-report |
False |
Enable reporting pipeline. |
--report-backend |
mariadb |
Storage backend strategy selector (mariadb, postgres). |
--datastore-config |
datastores/default.yaml |
Path to a YAML file with datastore connection settings. The datastore.<report-backend> section is used. Explicit CLI options override its values. |
--run-name |
Start datetime | Human-readable run name stored with the run. Defaults to YYYY-MM-DD HH:MM:SS. |
--mariadb-host |
localhost |
MariaDB host. |
--mariadb-port |
3306 |
MariaDB port. |
--mariadb-user |
testinfra_user |
MariaDB username. |
--mariadb-password |
password |
MariaDB password. |
--mariadb-database |
testinfra_reports |
MariaDB database name. |
--mariadb-suite-version |
None |
Suite version string (for example git SHA). |
--mariadb-init-schema |
False |
Run idempotent schema creation/migrations. |
--failure-map |
failure_mapper/failure_map.yaml |
Failure tagging rules file. |
--postgres-host |
localhost |
PostgreSQL host. |
--postgres-port |
5432 |
PostgreSQL port. |
--postgres-user |
postgres |
PostgreSQL username. |
--postgres-password |
password |
PostgreSQL password. |
--postgres-database |
testinfra_reports |
PostgreSQL database name. |
--postgres-init-schema |
False |
Run idempotent PostgreSQL schema creation. |
Example usage
MariaDB
pytest tests/ \
--storage-report \
--report-backend mariadb \
--run-name "manual-run" \
--mariadb-host 127.0.0.1 \
--mariadb-port 3306 \
--mariadb-user testinfra_user \
--mariadb-password password \
--mariadb-database testinfra_reports \
--mariadb-suite-version "$(git rev-parse --short HEAD)" \
--mariadb-init-schema
PostgreSQL
pytest tests/ \
--storage-report \
--report-backend postgres \
--postgres-host 127.0.0.1 \
--postgres-port 5432 \
--postgres-user postgres \
--postgres-password password \
--postgres-database testinfra_reports \
--postgres-init-schema
Datastore config file
Instead of passing connection flags on every invocation, define them once in a
YAML file and select the backend with --report-backend. When
--datastore-config is not supplied, the bundled
datastores/default.yaml is used:
datastore:
mariadb:
host: 'localhost'
port: 3306
user: 'testinfra_user'
password: 'password'
database: 'testinfra_reports'
postgres:
host: 'localhost'
port: 5432
user: 'postgres'
password: 'password'
database: 'testinfra_reports'
pytest tests/ \
--storage-report \
--report-backend mariadb \
--datastore-config datastore.yaml
Any explicit CLI option (for example --mariadb-user, --mariadb-port)
overrides the corresponding value from the YAML file.
Dependencies
- MariaDB backend:
PyMySQL - PostgreSQL backend:
psycopg2-binary - Failure tagging:
PyYAML
pip install PyMySQL psycopg2-binary pyyaml
Failure tagging
FailureTagger loads YAML rules from failure_mapper/failure_map.yaml and applies first-match classification for fail/error results.
Supported matching:
match_type: exact(substring)match_type: regex(re.search)
Sphinx documentation
A Sphinx-ready docs tree is now included:
docs/index.rstdocs/usage.rstdocs/api.rst
These files use autodoc directives for:
modelsbackendpluginbackends.mariadbbackends.postgres
Example minimal docs/conf.py:
extensions = [
"sphinx.ext.autodoc",
"sphinx.ext.napoleon",
"sphinx.ext.viewcode",
]
Build docs from project root:
sphinx-build -b html docs docs/_build/html
Notes
- Timestamp persistence remains naive IST for compatibility with existing dashboards.
- Existing testinfra host extraction behavior is preserved.
- Current backend implementations:
mariadb,postgres.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pytest_testinfra_exporter-0.3.1.tar.gz.
File metadata
- Download URL: pytest_testinfra_exporter-0.3.1.tar.gz
- Upload date:
- Size: 23.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.20
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eb564d0adbf3a9035b1358a0bb838abb60bdeda76d846680be5e7fd684bae153
|
|
| MD5 |
a07bf1e8e2bd3c19497637383c674080
|
|
| BLAKE2b-256 |
4aea0ab21f80b87ba80942438a6c8d19c595248747664db436d77b3bb5583f85
|
File details
Details for the file pytest_testinfra_exporter-0.3.1-py3-none-any.whl.
File metadata
- Download URL: pytest_testinfra_exporter-0.3.1-py3-none-any.whl
- Upload date:
- Size: 29.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.20
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
72f8849f1f6596989ddcc70874be99fb90a54e90e1a350d1d4889a799af5b91e
|
|
| MD5 |
7a10ca4b951b942b5b762ee89be833e8
|
|
| BLAKE2b-256 |
86cea24e57d659b4da69846b97d7028b630598f4af7cc85f1d50c411c9810dc3
|