Skip to content

saurabh-oss/testloom

Repository files navigation

🧵 TestLoom

Weaving comprehensive test cases from the threads of your requirements.

Open-source, LLM-agnostic framework for AI-powered test case generation.

CI Python 3.11+ License: Apache 2.0 Version


What is TestLoom?

Just like a loom weaves raw threads into structured fabric, TestLoom takes your raw requirements — user stories, API specs, acceptance criteria — and weaves them into comprehensive, structured test suites using AI. It's designed for QA teams, SDETs, and test architects who want to accelerate test design without vendor lock-in.

Key principles:

  • LLM-agnostic — swap between OpenAI, Anthropic, Ollama (local), Azure, or any provider via one line of config
  • Open source — Apache 2.0 licensed, no proprietary dependencies
  • RAG-powered — builds a living knowledge base of your project's test history for progressively better generation
  • Enterprise-ready — retry logic, audit logging, JUnit CI output, governance guardrails

Quick Start

Installation

# Core — basic generation
pip install testloom

# With RAG support (ChromaDB vector store, PDF input)
pip install "testloom[rag]"

Generate from a file

testloom generate --input requirements.md --format markdown --output tests.md

Generate with specific test types

testloom generate --text "Users can filter products by category and price range" \
  --types functional,negative,boundary \
  --context "Filters are applied client-side; max 500 products per page" \
  --max-cases 12

Batch-generate across multiple requirements

# requirements.md: one requirement per blank-line-separated paragraph
testloom batch requirements.md --output-dir output/ --format junit --concurrency 3

Use a free local model (zero API cost)

ollama pull llama3
testloom generate --input story.md --model ollama/llama3

Python SDK

Basic generation

import asyncio
from testloom import Settings, GenerationRequest, RequirementGenerator, GatewayRegistry

settings = Settings.load("testloom.yaml")
gateway  = GatewayRegistry.create(settings.llm)
gen      = RequirementGenerator(gateway, settings)

suite = asyncio.run(gen.generate(GenerationRequest(
    requirement_text="Users can filter products by category, price range, and rating",
    max_cases=15,
)))

for tc in suite.test_cases:
    print(f"[{tc.priority.value}] [{tc.test_type.value}] {tc.title}")

RAG-augmented generation

from testloom import ContextStore, RAGGenerator, GatewayRegistry, Settings, GenerationRequest

settings = Settings.load("testloom.yaml")
gateway  = GatewayRegistry.create(settings.llm)
store    = ContextStore(persist_dir="./chroma_data")   # persists across runs
gen      = RAGGenerator(gateway, settings, store, n_context=3)

# First run: no context yet, generates normally and indexes the result
# Subsequent runs: injects semantically similar past test cases into the prompt
suite = asyncio.run(gen.generate(GenerationRequest(
    requirement_text="Password reset via email link",
)))
print(f"Generated {suite.total_cases} cases, "
      f"used {suite.generation_metadata['rag_context_chunks']} context chunks")

Batch generation

suites = asyncio.run(gen.generate_batch(requests, concurrency=3))

Configuration

Create testloom.yaml in your project root:

llm:
  provider: openai           # openai | anthropic | ollama | azure | litellm
  model: gpt-4o
  temperature: 0.3
  max_tokens: 4096
  retry_attempts: 3          # retries on rate-limit / timeout / 5xx
  retry_backoff: 1.5         # exponential backoff base (seconds)

generation:
  max_cases_per_request: 20
  include_negative_cases: true
  include_edge_cases: true
  include_test_data: true

log_level: INFO

Or use environment variables (takes priority over the YAML file):

export TESTLOOM_LLM__PROVIDER=anthropic
export TESTLOOM_LLM__MODEL=anthropic/claude-sonnet-4-6
export TESTLOOM_LLM__API_KEY=sk-ant-...
export TESTLOOM_LLM__RETRY_ATTEMPTS=5

CLI Reference

testloom generate   --input / --text     # Source requirement
                    --format             # json | markdown | csv | junit | xml
                    --output             # Write to file (default: stdout)
                    --max-cases          # Cap on generated cases (default 20)
                    --model              # Override LLM (e.g. ollama/llama3)
                    --types              # Comma-sep types: functional,negative,boundary,...
                    --context            # Extra context injected into the prompt

testloom batch      <requirements_file>  # One requirement per blank-line paragraph
                    --output-dir         # Directory for output files (default: output/)
                    --format             # Same options as generate
                    --max-cases          # Per-requirement cap (default 15)
                    --concurrency        # Parallel LLM calls (default 3)

testloom config                          # Show current settings
testloom providers                       # List available LLM providers
testloom version                         # Show version

Output formats

Format Flag Use case
Markdown --format markdown Human review, PR comments
JSON --format json API integrations, tooling
CSV --format csv Excel, test management import
JUnit XML --format junit Jenkins, GitHub Actions, CI reports

Supported LLM Providers

Provider Model String Notes
OpenAI gpt-4o, gpt-4o-mini Default provider
Anthropic anthropic/claude-sonnet-4-6 Via LiteLLM
Ollama ollama/llama3, ollama/mistral Local, zero cost
Azure OpenAI azure/your-deployment Enterprise VNet
AWS Bedrock bedrock/anthropic.claude-3 AWS credentials
Any OpenAI-compatible Set api_base Self-hosted / on-prem

Architecture

┌──────────────────────────────────────────────────────────────┐
│                    CLI / Python SDK / REST API                │
├──────────────────────────────────────────────────────────────┤
│          Generators                                           │
│   ┌─────────────────────┐  ┌──────────────────────────────┐  │
│   │ RequirementGenerator │  │ RAGGenerator                 │  │
│   │  (Phase 1 ✅)        │  │  (Phase 2 ✅)                │  │
│   └─────────────────────┘  └──────────────────────────────┘  │
│          ↑ Prompt Engine (Jinja2 + YAML templates)            │
├──────────────────────────────────────────────────────────────┤
│   ContextStore (ChromaDB)     LLM Gateway (LiteLLM)          │
│   [living test knowledge]     [100+ providers, retry]         │
│                               ┌────┬──────────┬──────┬──────┐│
│                               │GPT │ Claude   │Llama │Azure ││
│                               └────┴──────────┴──────┴──────┘│
├──────────────────────────────────────────────────────────────┤
│   Output Formatters: JSON | Markdown | CSV | JUnit XML        │
│   Input Processors:  TXT | Markdown | PDF                     │
└──────────────────────────────────────────────────────────────┘

See Architecture Decision Records for design rationale.


Development

# Clone and setup
git clone https://github.com/saurabh-oss/testloom.git
cd testloom
make dev

# Run tests
make test

# Lint and format
make lint && make format

# Build Docker image (includes ChromaDB + Ollama)
make docker

Using Docker Compose

cd docker
docker compose up -d

# Pull a local model and generate against it
docker exec ollama ollama pull llama3
testloom generate --text "Login requirement" --model ollama/llama3

Project Structure

testloom/
├── src/testloom/
│   ├── cli/            # CLI — generate, batch, config, providers
│   ├── core/           # Domain models, config, exceptions
│   ├── gateway/        # LLM Gateway abstraction (LiteLLM, retry)
│   ├── generators/     # RequirementGenerator, RAGGenerator
│   ├── store/          # ContextStore (ChromaDB vector store)
│   ├── inputs/         # Input processors (TXT, MD, PDF)
│   ├── prompts/        # Prompt templates (YAML + Jinja2)
│   ├── formatters/     # JSON, Markdown, CSV, JUnit XML
│   └── utils/          # Logging, JSON extraction
├── tests/              # Pytest suite (async, mock gateway)
├── docs/               # GitHub Pages site + Architecture ADRs
├── docker/             # Dockerfile + Compose (ChromaDB + Ollama)
└── examples/           # Usage examples

Roadmap

Phase Focus Status
Phase 0 Project scaffold, CI/CD, core abstractions ✅ Complete
Phase 1 LLM gateway, generation, CLI, JUnit, retry ✅ Complete
Phase 2 RAG pipeline, ContextStore, input processors ✅ Complete
Phase 3 Multi-agent review mesh, quality scoring, governance 🔄 In Progress
Phase 4 CI/CD plugins, REST API, Web UI 📋 Planned
Phase 5 Enterprise scale, observability, plugins 📋 Future

Contributing

We welcome contributions! See CONTRIBUTING.md for guidelines.

License

Apache License 2.0 — see LICENSE for details.

About

TestLoom — Open-source, LLM-agnostic AI framework for automated test case generation. Weave comprehensive test suites from requirements using any LLM provider.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors