Test the web app, the API behind it, the data it writes and the devices it talks to —
with one pytest-native framework, one configuration model and one set of reports.
Why innoHarmony
Quality teams usually stitch together a UI tool, an API tool, a data-diff script and a hardware harness, each with its own conventions and reports. innoHarmony™ puts all of them on pytest + Playwright with a shared page-object model, YAML configuration, observability and a release quality gate — so a 5-person team and a 100-person programme work the same way.
- One workflow — UI, API, database, file and device tests are ordinary pytest tests.
- Enterprise by default — multi-project layouts, environment overlays, org → business-unit → project governance, secrets from environment variables or vaults, never from code.
- Resilient — self-healing locators, retries and flaky-test detection cut maintenance noise.
- Decision-ready — every run ends in reports for engineers, QA and leadership, plus an optional PASS / WARN / BLOCK verdict your pipeline can act on.
- Opt-in everything — install only the extras you need; features are off until enabled in YAML.
Install
pip install innoharmony
playwright install chromium # or: playwright install (all browsers)
Requires Python 3.11+. Add extras for the capabilities you use:
| Extra | Adds |
|---|---|
innoharmony[data-comparison] |
Excel / CSV / JSON comparison and HTML mismatch reports (pandas, openpyxl) |
innoharmony[postgresql] · [mysql] · [sqlserver] · [oracle] · [db2] · [informix] · [snowflake] · [mongodb] |
Database drivers (SQLite needs none) — or [all-databases] |
innoharmony[graphql-client] · [soap-client] · [contracts] · [pact] |
GraphQL, SOAP, OpenAPI / JSON-Schema and consumer-driven contract testing |
innoharmony[accessibility] |
WCAG checks with axe-core |
innoharmony[devices] |
Every device transport and the simulator (or pick devices-serial, devices-mqtt, devices-can, devices-ble, devices-adb, …) |
innoharmony[mcp] |
MCP server for AI assistants |
innoharmony[allure-reporting] · [html-reporting] · [dashboard] · [telemetry] · [prometheus] |
Reporting, live dashboard and OpenTelemetry / Prometheus export |
innoharmony[vault] · [aws] · [azure] |
HashiCorp Vault, AWS Secrets Manager, Azure Key Vault |
innoharmony[all] |
API clients, data comparison, all databases and reporting in one go |
Quick start
innoharmony init my-qe-suite # scaffold a suite with runnable demos
cd my-qe-suite
export INNOHARMONY_TEST_USERNAME=standard_user # demo login for saucedemo.com
export INNOHARMONY_TEST_PASSWORD=secret_sauce
pytest tests/demo/functional/api tests/demo/functional/ui
On Windows PowerShell, set the credentials with:
$env:INNOHARMONY_TEST_USERNAME = "standard_user"
$env:INNOHARMONY_TEST_PASSWORD = "secret_sauce"
The scaffold contains configuration, page objects and demo UI, API and database tests.
The data-comparison demos also need pip install "innoharmony[data-comparison]".
What tests look like
Web UI — locators live in page objects; tests read like the business flow.
import pytest
from innoharmony import BasePage
class LoginPage(BasePage):
USERNAME = "#user-name"
PASSWORD = "#password"
SUBMIT = "#login-button"
def login(self, user: str, password: str) -> None:
self.fill(self.USERNAME, user)
self.fill(self.PASSWORD, password)
self.click(self.SUBMIT)
@pytest.mark.smoke
def test_login(page, runtime_options, login_test_data):
login = LoginPage(page, runtime_options["resilience_policy"])
login.navigate(runtime_options["base_url"])
user = login_test_data["valid_user"] # values resolved from ${ENV_VAR} placeholders
login.login(user["username"], user["password"])
API — an HTTP client with retries, auth and chainable assertions.
from innoharmony import ApiClient, ResponseValidator
def test_create_order(base_url):
api = ApiClient(base_url=base_url, retries=3)
response = api.post("/orders", json_body={"sku": "A-100", "qty": 2})
ResponseValidator.assert_status_code(response, 201)
ResponseValidator.assert_json_has_keys(response, ["id", "status"])
ResponseValidator.assert_response_time_less_than(response, 800)
Data — compare extracts, files and tables with keys, tolerances and column mappings.
from utils.data_comparison_utils import compare_excel_files
def test_migration_matches_legacy():
result = compare_excel_files(
"legacy_extract.xlsx", "new_platform_extract.xlsx",
key_columns=["employee_id"], float_tolerance=0.01, ignore_fields={"updated_at"},
)
assert result.passed, result.summary # interactive HTML report at result.report_path
Devices — the same test runs against a digital twin or real hardware.
import pytest
@pytest.mark.device
@pytest.mark.requires_dut(capability="thermostat")
def test_heats_up(dut):
dut.set_target(22)
dut.wait_until_temperature(22, timeout=900)
pytest -m device # simulated twin
pytest -m device --innoharmony-dut-mode hil # real hardware, same test
Run it your way
| Goal | Command |
|---|---|
| Pick environment and browser | pytest --innoharmony-env qa --innoharmony-browser firefox |
| Watch the browser | pytest --innoharmony-headed |
| Emulate a phone | pytest --innoharmony-device "iPhone 13" |
| Run in parallel | pytest -n auto |
| Run a suite by marker | pytest -m smoke · pytest -m regression |
| Check the environment first | pytest --innoharmony-readiness-check |
| Gate the release | pytest --innoharmony-quality-gate — exits 1 on BLOCK |
| Enforce suite ordering | pytest --innoharmony-orchestration |
| Update visual baselines | pytest --innoharmony-update-snapshots |
CI templates for GitHub Actions, Jenkins and Azure DevOps are included
(innoharmony docs ci).
AI-ready: MCP server
innoHarmony ships a Model Context Protocol server so AI assistants such as Claude and GitHub Copilot can discover the framework API, list tests and page objects, read resolved configuration and test results, and get a release recommendation. Every tool is also a terminal command.
pip install "innoharmony[mcp]"
innoharmony-mcp serve # MCP server (stdio)
innoharmony-mcp search-methods tolerance # the same tools from the terminal
innoharmony-mcp get-release-recommendation
Documentation
Guides are installed with the package — no network or repository access needed:
innoharmony docs # list every topic
innoharmony docs quickstart # print one
| Topic | Covers |
|---|---|
quickstart · install · cli |
First test in 10 minutes, installation, every command and --innoharmony-* option |
multi-project · test-organization · qe-visual-guide |
Suite layout at scale and the page-object model |
api-testing · database · data-validation |
REST / GraphQL / SOAP, database drivers and assertions, data comparison |
architecture · resilience · observability |
How the layers fit, self-healing locators, metrics and persona reports |
secrets-governance · plugins · ci · mcp |
Secrets and org policy, plugin authoring, pipelines, the MCP server |
Support
innoHarmony is developed and supported by Innominds. For onboarding, enterprise support or custom integrations, contact RKonduru@innominds.com or visit innominds.com.
innoHarmony™ is a trademark of Innominds. © Innominds. Released under the MIT License.
Metadata
Release files for innoharmony 5.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| innoharmony-5.0.2.tar.gz | 860.3 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| innoharmony-5.0.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.5 MB
Release files / innoharmony-5.0.2.tar.gz
| Download URL | innoharmony-5.0.2.tar.gz |
|---|---|
| Size | 860.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
93a79e0df97e251f20ec4cf7b704f48bdd5bb0ba24457a075bc552abca0fea70
|
|
BLAKE2b-256 checksum How to use checksums |
f1ab3ee4585d1478e891ee31536cc100d281c56b1ed4d717068a636c7038ceb5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / innoharmony-5.0.2-py3-none-any.whl
| Download URL | innoharmony-5.0.2-py3-none-any.whl |
|---|---|
| Size | 614.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
da6acf8de358c88ef727b941d2182b189d93290b302d133f83c75878df841e4c
|
|
BLAKE2b-256 checksum How to use checksums |
7a127349000d0656a34ed1cd626356b4806c2cf09354b71766ae1acd4303ea36
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logSecurity for innoharmony 5.0.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for innoharmony-5.0.2.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.