Skip to content

NDViet/test-automation-platform

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

61 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Test Automation Platform

Cross-team quality intelligence platform for automated testing. It ingests test results, normalizes execution history, computes quality signals, manages test cases and requirements, classifies failures with AI, and runs agentic workflows for impact analysis, test generation, and flaky-test healing.

Demo

Test Automation Platform demo

What's in v2.0

Commit b4640398780f0f339bb3a9bf5e83b271ab4e1b01 initializes the v2.0 platform revamp:

  • platform-agent: Agent Hub for workflow orchestration, node routing, PR impact analysis, test generation, automation generation, review decisions, and flaky-test fixes.
  • platform-storage: shared blob storage with filesystem, MinIO, and S3-compatible backends.
  • platform-integration-config: integration adapter registry with initial Jira Cloud and GitHub adapter skeletons.
  • Canonical quality model: requirements, test cases, traceability edges, test suites, manual test runs, agent workflows, review requests, token budgets, GitHub PR tracking, and impact analyses.
  • Portal expansion: requirements, PR analyses, impact analyses, project settings, test case management, test runs, flaky tests, API keys, and AI settings.
  • Database migrations extended through V44.

Architecture

                          Test Automation Platform

  Test frameworks and CI
  JUnit 5 / TestNG / Cucumber / Allure / Playwright / Newman / k6 / Gatling / JMeter
                 |
                 v
  +----------------------+       Kafka        +----------------------+
  | platform-ingestion   |  test.results.raw  | platform-analytics   |
  | :8081                +------------------->| :8082                |
  | parse, normalize, DB |                    | flakiness, TIA, logs |
  +----------+-----------+                    +----------+-----------+
             |                                           |
             |                                           v
             |                                +----------------------+
             |                                | platform-ai          |
             |                                | :8084                |
             |                                | Claude/OpenAI        |
             |                                +----------------------+
             |
             v
  +----------------------+                    +----------------------+
  | PostgreSQL 17        |<------------------>| platform-agent       |
  | source of truth      |                    | :8086, host :8087   |
  +----------------------+                    | agent workflows      |
             ^                                +----------+-----------+
             |                                           |
  +----------+-----------+                    +----------v-----------+
  | platform-portal      |                    | MinIO / S3 / FS      |
  | :8085                |                    | artifacts, diffs,    |
  | BFF + React SPA      |                    | checkpoints          |
  +----------------------+                    +----------------------+

  Supporting services: Redis, OpenSearch, Logstash, Loki, Promtail, Grafana,
  Prometheus, and Flyway.

Maven modules

Module Port Role
platform-common - Shared DTOs, enums, Kafka topics, agent contracts, integration contracts, storage contracts
platform-storage - BlobStore auto-configuration for filesystem, MinIO, and S3-compatible storage
platform-core - JPA domain, repositories, Flyway migrations V1 through V44
platform-ingestion 8081 Result ingestion, parsers, project/team management, requirements, integrations, TCM APIs
platform-analytics 8082 Flakiness, trends, quality gates, release reports, Test Impact Analysis, alerting, log search
platform-integration 8083 Jira ticket lifecycle for repeated failures and flaky tests
platform-integration-config - Project-scoped integration adapter registry and adapter contracts
platform-ai 8084 Failure classification, batch analysis, AI settings (all models via the LiteLLM gateway)
platform-portal 8085 Spring Boot BFF plus embedded React SPA
platform-agent 8086 Agent Hub, node registry, workflows, webhooks, review gateway, impact/test-generation/healing flows
platform-testkit - Rich Java instrumentation for JUnit 5, TestNG, Cucumber, Playwright-assisted tests
platform-adapters - Java, Playwright, and k6 publishing adapters

Runtime services

Service Local URL Notes
Platform Portal http://localhost:8085 Main UI
Ingestion API http://localhost:8081/swagger-ui.html Result, project, requirement, integration, and TCM APIs
Analytics API http://localhost:8082/swagger-ui.html Flakiness, TIA, quality gates, alerts, logs
Integration API http://localhost:8083/swagger-ui.html Jira lifecycle service
AI API http://localhost:8084/swagger-ui.html Failure analysis and provider settings
Agent Hub http://localhost:8087 Host port maps to container port 8086
OpenSearch http://localhost:9200 Log search backend
MinIO Console http://localhost:9001 platform / platform123
PostgreSQL localhost:5432 db platform, user platform, password platform
Kafka localhost:9092 KRaft mode
Redis localhost:6379 Agent checkpoints

The Grafana monitoring stack is not part of the default docker compose up. Start it with the override (see Full stack with monitoring) to also get Grafana (http://localhost:3000, admin/admin), Prometheus (http://localhost:9090, metrics + k6 remote-write), Loki (http://localhost:3100), and Promtail.

Quick start with Docker

No Java or Maven is required for the pre-built image path. The default docker-compose.yml is the full operational platform — a single docker compose up -d starts the data pipeline, storage, cache, log-search backend, and the LiteLLM gateway, runs Flyway through the db-migrate one-shot container, and then starts all backend services and the portal.

git clone https://github.com/ndviet/test-automation-platform.git
cd test-automation-platform

docker compose pull
docker compose up -d
docker compose ps

Stop the stack:

docker compose down

# Wipes database, Kafka, Redis, OpenSearch, and MinIO data.
docker compose down -v

Full stack with monitoring

docker-compose-full.yml is an additive override holding the self-contained extras: a bundled LiteLLM container (the default stack expects an external endpoint) and the Grafana observability stack (Grafana, Prometheus, Loki, Promtail). With the override present, platform-ai/agent default to the bundled litellm. Layer it on the default to run the full stack:

docker compose -f docker-compose.yml -f docker-compose-full.yml up -d
docker compose -f docker-compose.yml -f docker-compose-full.yml down   # stop it all

scripts/dev-up.sh --full (or COMPOSE_FULL=1 scripts/dev-up.sh) does the same with the bind-volume warmup.

Configuration

Create a .env file in the project root when you need non-default settings. Docker Compose reads it automatically.

# LiteLLM gateway — the single OpenAI-compatible endpoint the platform talks to
# (Claude/GPT/Gemini/etc. are routed by model id inside LiteLLM).
#
# The DEFAULT stack uses an EXTERNAL LiteLLM: platform-ai/agent start with these
# unset (empty), so the platform comes up from scratch without a gateway. Point them
# at your LiteLLM when ready — here, or per Org/Team/Project in the Portal (/settings/ai):
# LITELLM_BASE_URL=https://your-litellm/v1
# LITELLM_API_KEY=sk-...
#
# Prefer a bundled gateway? Run the full stack (-f docker-compose-full.yml) — it adds a
# `litellm` container that proxies to the Claude API, and platform-ai/agent then default to
# LITELLM_BASE_URL=http://litellm:4000/v1. Provide your Anthropic key (and optional proxy key):
ANTHROPIC_API_KEY=sk-ant-...
LITELLM_MASTER_KEY=sk-platform-local

# Ingestion auth, disabled by default for local development
API_KEY_AUTH_ENABLED=false

# Agent integrations
GITHUB_TOKEN=ghp_...
GITHUB_WEBHOOK_SECRET=...
JIRA_WEBHOOK_SECRET=...
LINEAR_WEBHOOK_SECRET=...
SLACK_BOT_TOKEN=xoxb-...
SLACK_SIGNING_SECRET=...
SLACK_APPROVAL_CHANNEL=#agent-approvals

Storage is selected with platform.storage.type:

Type Use case
filesystem Local service runs without object storage
minio Docker Compose local stack
s3 AWS S3 or compatible production storage

Compose configures MinIO automatically and creates these buckets: platform-artifacts, platform-knowledge, platform-checkpoints, and platform-diffs.

Build from source

Prerequisites

Tool Version
Java 21
Maven 3.9+
Docker + Docker Compose 27+
Node.js 20+ for portal and JS adapter development

Build all Java modules

mvn -B clean package -DskipTests

Build deployable services only

mvn -B clean package -DskipTests \
  -pl platform-ingestion,platform-analytics,platform-integration,platform-ai,platform-portal,platform-agent \
  -am

Run tests

mvn test

Build JS adapters

cd platform-adapters/js/playwright
npm ci
npm run build

cd ../k6
npm install --ignore-scripts
npm run bundle

Build and run local images

All service images build FROM a shared platform-base image (JRE + OS packages + non-root user + JVM entrypoint, defined in infrastructure/docker/base.Dockerfile). That common layer is built once instead of repeated in every service image.

Fastest path — build the base and all services in parallel with one command:

docker buildx bake          # builds platform-base:local + all six service images

Or with Compose (build the base once first, then the services):

docker buildx bake base                       # creates platform-base:local
docker compose up -d --build

CI builds the base once and publishes it to ghcr.io/<owner>/platform-base; the service images pull it via the BASE_IMAGE build-arg.

Run one service from source

Start infrastructure first:

docker compose up -d

Then run the service you are changing:

cd platform-ingestion
mvn spring-boot:run -Dspring-boot.run.profiles=local

cd platform-agent
mvn spring-boot:run -Dspring-boot.run.profiles=local

cd platform-portal/frontend
npm install
npm run dev

Submitting test results

HTTP upload

curl -X POST http://localhost:8081/api/v1/results/ingest \
  -F "file=@target/surefire-reports/TEST-example.xml" \
  -F "format=JUNIT_XML" \
  -F "teamId=my-team" \
  -F "projectId=my-project"

Supported formats:

JUNIT_XML, CUCUMBER_JSON, TESTNG, ALLURE, PLAYWRIGHT, NEWMAN, PLATFORM_NATIVE, K6, GATLING, JMETER.

Playwright adapter

# .npmrc
@ndviet:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=YOUR_GITHUB_TOKEN

npm install @ndviet/adapter-playwright
// playwright.config.ts
export default defineConfig({
  reporter: [
    ['list'],
    ['@ndviet/adapter-playwright', {
      endpoint: process.env.PLATFORM_URL,
      apiKey: process.env.PLATFORM_API_KEY,
      teamId: 'my-team',
      projectId: 'my-project',
    }],
  ],
})

k6 adapter

// load-test.js
import { platformHandleSummary } from './platform-k6-adapter.js'
export { platformHandleSummary as handleSummary }
k6 run \
  -e PLATFORM_URL=http://localhost:8081 \
  -e PLATFORM_API_KEY=plat_xxxx \
  -e PLATFORM_TEAM_ID=my-team \
  -e PLATFORM_PROJECT_ID=my-project \
  load-test.js

Java adapter and testkit

Use platform-adapter-java for existing suites that only need auto-publishing. Use platform-testkit-java for rich step tracking, tracing, retries, Playwright diagnostics, and native JSON publishing.

<dependency>
  <groupId>org.ndviet</groupId>
  <artifactId>platform-testkit-java</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <scope>test</scope>
</dependency>

See:

  • platform-adapters/java/USAGE.md
  • platform-testkit/java/USAGE.md
  • platform-adapters/js/playwright/README.md
  • platform-adapters/js/k6/README.md

Main APIs

Ingestion and platform management

Area Endpoints
Results POST /api/v1/results/ingest
Coverage POST /api/v1/coverage
Teams GET/POST /api/v1/teams, PUT/DELETE /api/v1/teams/{id}
Projects GET/POST /api/v1/projects, PUT/DELETE /api/v1/projects/{id}
Executions GET /api/v1/projects/{projectId}/executions, GET /api/v1/executions/{runId}
Requirements GET /api/v1/projects/{projectId}/requirements, GET /api/v1/projects/{projectId}/requirements/stats
Integrations GET/POST /api/v1/projects/{projectId}/integrations, DELETE /api/v1/projects/{projectId}/integrations/{configId}
API keys POST /api/v1/api-keys, GET /api/v1/api-keys, DELETE /api/v1/api-keys/{id}
Test suites GET/POST /api/v1/projects/{projectId}/test-suites
Test cases GET/POST /api/v1/projects/{projectId}/test-cases, review and automation actions under /test-cases/{tcId}
Manual test runs GET/POST /api/v1/projects/{projectId}/test-runs, execution updates under /test-runs/{runId}

Analytics

Area Endpoints
Flakiness GET /api/v1/analytics/{projectId}/flakiness, POST /api/v1/analytics/{projectId}/flakiness/recompute
Trends GET /api/v1/analytics/{projectId}/trends/pass-rate, /trends/mttr, /trends/duration
Quality gates GET /api/v1/analytics/{projectId}/quality-gate, GET /api/v1/projects/{projectId}/quality-gate/ci
Test Impact Analysis GET /api/v1/analytics/{projectId}/impact, GET /api/v1/analytics/{projectId}/impact/summary
TIA trends GET /api/v1/analytics/tia/summary, project TIA trend endpoints under /api/v1/analytics/{projectId}/tia/*
Alerts GET /api/v1/alerts/projects/{projectId}, GET /api/v1/alerts/org
Release report GET /api/v1/projects/{projectId}/release-report
Logs GET /api/v1/logs/runs/{runId}, GET /api/v1/logs/tests/{testId}, GET /api/v1/logs/runs

AI and Agent Hub

Area Endpoints
Failure analyses GET /api/v1/projects/{projectId}/analyses, POST /api/v1/projects/{projectId}/results/{resultId}/analyse
AI settings GET/PUT /api/v1/ai/settings, POST /api/v1/ai/settings/test
Agent workflows POST /hub/workflows, GET /hub/workflows, GET /hub/workflows/{workflowId}
Node registry POST /hub/nodes/register, POST /hub/nodes/{nodeId}/heartbeat, GET /hub/nodes
Test generation POST /hub/test-cases/{projectId}/generate, POST /hub/test-cases/{projectId}/{testCaseId}/generate-automation
Impact analysis GET/POST /hub/impact/{projectId}, GET /hub/impact/{projectId}/prs
Flaky healing POST /hub/healing/{projectId}/trigger
Review decisions GET /hub/reviews, POST /hub/reviews/{reviewRequestId}/decide
Webhooks /hub/webhooks/github, /hub/webhooks/jira, /hub/webhooks/linear, /hub/webhooks/slack/interactions

Portal features

The React portal is served by platform-portal and backed by /api/portal/**.

Route Purpose
/ Organization summary, teams, projects, recent quality signal
/projects/:projectId Project quality detail
/projects/:projectId/requirements Requirement inventory and stats
/projects/:projectId/pr-analyses Agent PR analysis history
/projects/:projectId/impact-analyses AI impact analysis workflow UI
/projects/:projectId/settings Project, team, and integration configuration
/projects/:projectId/test-cases Test suites, manual test cases, review, AI generation, automation trigger
/projects/:projectId/test-runs Manual test runs and execution updates
/projects/:projectId/flaky-tests Flakiness recompute and healing trigger
/runs/:runId Ingested run detail
/alerts Alert history
/settings/api-keys Ingestion API key management
/settings/ai LiteLLM gateway settings (base URL, key, models), test, and tool-config export

Observability

Signal Where
Dashboards Grafana at http://localhost:3000
Metrics Prometheus at http://localhost:9090
Service logs Loki through Grafana Explore
Test execution logs OpenSearch indices test_execution_logs-*
k6 performance Prometheus (remote write) plus Grafana dashboards
TIA trends Grafana TIA dashboard and analytics APIs

Database migrations

Flyway migrations live in platform-core/src/main/resources/db/migration/ and currently run from V1 through V44.

They run automatically in Docker through the db-migrate service and are also available to Spring Boot services through the shared core module.

docker compose run --rm db-migrate

CI templates

The repository includes Test Impact Analysis helper templates under platform-ci-templates/:

  • GitHub Actions: platform-ci-templates/github-actions/test-impact-analysis.yml
  • Azure DevOps: platform-ci-templates/azure-devops/test-impact-analysis.yml
  • Jenkins: platform-ci-templates/jenkins/PlatformTIA.groovy

These templates calculate changed files, call the analytics TIA endpoints, emit Maven/Gradle test filters, and can fall back to full-suite execution based on risk.

Project structure

test-automation-platform/
|-- platform-common/              # Shared platform, agent, integration, and storage contracts
|-- platform-storage/             # Blob storage auto-config and implementations
|-- platform-core/                # JPA domain, repositories, Flyway migrations
|-- platform-ingestion/           # Result parsers, REST ingest, management, TCM APIs
|-- platform-analytics/           # Flakiness, trends, quality gates, TIA, alerts, log search
|-- platform-integration/         # Jira ticket lifecycle service
|-- platform-integration-config/  # Integration adapter registry and initial adapters
|-- platform-ai/                  # Failure classification and AI settings
|-- platform-agent/               # Agent Hub, workflows, nodes, webhooks, review gateway
|-- platform-portal/              # Spring Boot BFF and React SPA
|-- platform-testkit/             # Rich Java test instrumentation
|-- platform-adapters/            # Java, Playwright, and k6 adapters
|-- platform-ci-templates/        # TIA templates for CI systems
|-- infrastructure/               # Grafana, Prometheus, Loki, Promtail, Logstash, OpenSearch
|-- helm/                         # Kubernetes chart
`-- docker-compose.yml            # Full local stack

About

Cross-team quality intelligence platform that surfaces organization-wide quality signals with AI-powered features

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors