Skip to main content

🧪 FusionTest

AI-powered UI testing for web, desktop and mobile — built by FusionLeap.io

FusionTest runs UI tests written as plain-English goals. An LLM reads the screen and decides what to do, a verifier confirms each goal against what's actually on screen, and goals that pass are recorded so later runs replay them without calling the AI at all.


✨ Features

Feature Notes
Natural-language goals "Open the Pricing page and verify all three plans are shown"
Goal discovery Crawls a site and proposes goals grounded in its real content
Record & replay Passing goals replay with no LLM calls; the AI repairs them when the page changes
Honest results Capacity or infrastructure problems are reported as errors, not test failures
Multi-provider LLMs Groq, Claude, Gemini, OpenAI or local Ollama, with automatic fallback
Safe secrets {{PASSWORD}} placeholders — the AI never sees values, which are only typed on allowed sites
Guardrails Invalid-action checks, loop detection, backtracking, no-progress detection
Reporting JSON reports, dashboard uploads, failure screenshots, Slack, GitHub Actions annotations, webhooks
Platforms Web (Playwright), Electron, Android & iOS (Appium), Windows, macOS

🏗 Architecture

fusiontest/
├── core/         # Runner, LLM action model + fallback chain, goal verifier,
│                 # screen parser, secrets, replay, SSRF guard (netguard)
├── desktop/      # Playwright (web/Electron), Windows, macOS adapters
├── mobile/       # Android (UIAutomator2) and iOS (XCUITest) adapters via Appium
├── discovery/    # Goal discovery from a site's pages
├── guardrails/   # Action validation, loop detection, backtracking
├── reporting/    # JSON reports, Slack, GitHub annotations
└── training/     # Experimental MPNet fine-tuning (not wired into runs)
api/              # SaaS backend (FastAPI + PostgreSQL) — see docs/api.md
dashboard/        # React dashboard
website/          # Marketing site (Next.js)

Design decisions are recorded in docs/adr — start with ADR-007.


🚀 Quickstart

# macOS (Homebrew Python) or anywhere you want an isolated CLI — recommended
brew install pipx && pipx ensurepath        # then open a new terminal
pipx install "fusiontest[desktop]"
"$(pipx environment --value PIPX_LOCAL_VENVS)/fusiontest/bin/playwright" install chromium

# …or inside a virtual environment
python3 -m venv .venv && source .venv/bin/activate
pip install "fusiontest[desktop]"
playwright install chromium

export GROQ_API_KEY=gsk_...          # or ANTHROPIC_API_KEY / GEMINI_API_KEY / OPENAI_API_KEY

fusiontest run --url https://example.com \
  --goal "Verify the page heading says Example Domain" --headless

# No goals yet? Map what works on a test/staging site, and save the flows that do
fusiontest scan https://staging.example.com --save fusiontest.goals.yaml
# Behind a login: EMAIL and PASSWORD come from the environment, never the AI
fusiontest scan https://staging.example.com --login "Sign in with email {{EMAIL}} and password {{PASSWORD}}"

Groq, OpenAI and Ollama work out of the box; for Claude or Gemini add the extra — fusiontest[desktop,claude] or fusiontest[desktop,gemini]. Upgrade with pipx upgrade fusiontest (or pip install -U fusiontest in the venv).

Set FUSIONTEST_API_KEY (from the dashboard's API Keys page) to upload each run to your FusionTest dashboard.

Exit codes: 0 all goals passed · 1 a goal failed · 2 some goals couldn't be evaluated (LLM capacity or infrastructure) — not a test failure.

Full guide: docs/getting-started.md — platforms, goal files, configuration, secrets, replay, dashboard and CI.


📝 Writing goals

# tests/goals/smoke.yaml
name: Marketing site smoke test
platform: playwright
url: https://example.com
goals:
  - "Open the Pricing page and verify three plan tiers are shown"
  - "Open the Contact page, submit the form empty, and verify required-field errors appear"
  - name: Log in
    goal: "Log in with {{EMAIL}} and {{PASSWORD}} and verify the dashboard loads"
fusiontest run --file tests/goals/smoke.yaml --headless

Tips: say what to verify, not just where to go; one outcome per goal; don't submit real forms on production sites.


🛠 Configuration

fusiontest init creates fusiontest.config.yaml:

backend: groq               # unset = auto-detect from API keys
guardrails:
  loop_detection_window: 5
  max_retries: 3
replay:
  enabled: true
  trace_dir: .fusiontest/traces
  reverify_every: 10

🔌 CI/CD

Run fusiontest run --headless in any CI system. With FUSIONTEST_API_KEY set, replay recordings are shared through your FusionTest account (laptop, CI and dashboard all replay each other's passing goals); without it, cache .fusiontest/traces. Guides for GitHub Actions, Bitrise, Fastlane and Jenkins: docs/ci-integrations.md.


🤝 Contributing

See CONTRIBUTING.md and ROADMAP.md.

📄 License

MIT © FusionLeap.io

Metadata

Release files for fusiontest 0.2.36

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fusiontest 0.2.36
File Size Uploaded
fusiontest-0.2.36.tar.gz 141.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for fusiontest 0.2.36
File Interpreter ABI Platform
fusiontest-0.2.36-py3-none-any.whl Python 3 none any Details

Total release size: 299.8 kB

Release files / fusiontest-0.2.36.tar.gz

Download URL fusiontest-0.2.36.tar.gz
Size 141.6 kB
Tags Source
SHA-256 checksum
How to use checksums
ae06e4d90363dee86f47de0b907698613e3913d17d353cc6d8effb369e3d37f0
BLAKE2b-256 checksum
How to use checksums
6b7ebfd11d82cd9a5893129da7a6d842327d61353ad9bbe9e82657aba830c2ac
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / fusiontest-0.2.36-py3-none-any.whl

Download URL fusiontest-0.2.36-py3-none-any.whl
Size 158.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
54443014a215f99d6bed5d520bd640a7170b8375cced4d107dfe667e67ca71a0
BLAKE2b-256 checksum
How to use checksums
d2299a7c8bb1d6bac1e6c3a9d8a708ae675fd9aeb39939a2592e756ad2811886
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

0.2.38

2 release files

0.2.37

2 release files

This release

0.2.36 This release

2 release files

0.2.35

2 release files

0.2.34

2 release files

0.2.33

2 release files

0.2.32

2 release files

0.2.31

2 release files

0.2.30

2 release files

0.2.29

2 release files

0.2.28

2 release files

0.2.27

2 release files

0.2.26

2 release files

0.2.25

2 release files

0.2.24

2 release files

0.2.23

2 release files

0.2.22

2 release files

0.2.21

2 release files

0.2.14

2 release files

0.2.13

2 release files

0.2.10

2 release files

0.2.9

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.24

2 release files

0.1.23

2 release files

0.1.22

2 release files

0.1.21

2 release files

0.1.20

2 release files

0.1.19

2 release files

0.1.18

2 release files

0.1.17

2 release files

0.1.16

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page