3TG 3rd Generation Testing — deterministic test specs in your editor or any MCP agent

Get a tested codebase without writing a single line of test boilerplate.

3TG turns the business rules you write in clean Markdown tables into a complete, deterministic test suite — generated right inside VS Code and IntelliJ. Your spec is the source of truth, not a language model guessing your logic.

Works with any AI agent Deterministic, spec-driven output Typed Vitest & Jest output
From spec to tests

Business rules in, typed tests out.

Write the cases as a Markdown table; 3TG generates a deterministic Vitest or Jest suite that maps to every row — no boilerplate, no guessing.

3TG · mapping spec
isAdult.3tg.md spec · markdown
1
2
3
4
5
6
7
8
# isAdult(age: number)

| test name   | age | isAdult             |
| ----------- | --- | ------------------- |
| is NaN      | NaN | throw 'Invalid age' |
| is negative | -1  | throw 'Invalid age' |
| is zero     | 0   | false               |
| is below    | 17  | false               |
| is exactly  | 18  | true                |
| is above    | 19  | true                |
isAdult.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
import { isAdult } from './isAdult'

describe('isAdult.ts', () => {
  describe('isAdult', () => {
    it('is NaN',      () => expect(() => isAdult(NaN)).toThrow('Invalid age'));
    it('is negative', () => expect(() => isAdult(-1)).toThrow('Invalid age'));
    it('is zero',     () => expect(isAdult(0)).toBe(false));
    it('is below',    () => expect(isAdult(17)).toBe(false));
    it('is exactly',  () => expect(isAdult(18)).toBe(true));
    it('is above',    () => expect(isAdult(19)).toBe(true));
  });
});

6 specs mapped · 0 hallucinated assertions
Works natively across your stack
VS Code JetBrains Claude Code Codex Antigravity Cursor Windsurf GitHub Copilot Continue Cline TypeScript React Next.js Remix Vitest Jest Testing Library
The workflow

Three steps from no tests to a green suite.

The same workflow whether you live in VS Code, JetBrains, or talk to your agent over MCP.

01 Connect

Connect to 3TG

Install the extension from the VS Code or JetBrains Marketplace — or wire up the MCP server so your AI agent can reach 3TG directly.

02 Define

Point at a file

Open any TypeScript function .ts or React functional component .tsx file. Write your requirements naturally inside structured markdown schemas.

03 Ship

Review & merge

3TG outputs clean, perfectly typed testing setups, assertion arrays and mock stubs directly inside your local test files. Review, commit, and ship.

Before / After

The difference is the two hours you get back.

Without 3TG

  • Hand-writing endless boilerplate, test by test.
  • Brittle setups that break on minor code edits.
  • AI-only generators hallucinating fake behavior.
  • Coverage postponed under fast sprint pressure.
~2 hrs / component

With 3TG

  • Map requirements to markdown in 60 seconds flat.
  • Stable tests that track real business behavior.
  • AI output grounded by human-controlled specs.
  • Continuous protection against regressions.
~90 seconds / component
What you get on the free plan

Stack it up. Pay nothing.

Today's initial cost
Your only limit is 100 generated tests / month · No credit card required
€0
The objections we hear

But isn't this just AI slop?

Three valid developer concerns. Three concrete protections.

01 / hallucination

The AI hallucination problem

Standard code assistants guess — they read your source and replicate it, hidden bugs and all. 3TG flips that: you set the truth in Markdown, and the AI only proposes inputs and expected results. Your sign-off, not the model, has the final say.

02 / drift

Workflow & architectural drift

Most documentation lives in a disconnected web app and slowly rots. 3TG stays entirely inside your repo — behavior contracts are plain Markdown that's versioned, branched, and reviewed alongside the code it describes, so the two can never drift apart.

03 / refactoring

Brittle refactoring fatigue

Stop pinning test scripts to internal function names. 3TG assertions evaluate your defined input-to-output matrix, so you can rename, split, and rewrite internals as aggressively as you like — the safety net keeps passing as long as the observable behavior still holds.

Built for every kind of team that ships TypeScript & React
Startups Software agencies Freelancers & solo devs SaaS teams Scale-ups Enterprise engineering teams Dev consultancies Open-source maintainers Platform teams
Pricing

Free is the full product.

Paid plans just raise the generation ceiling — same engine, same extensions, same MCP. They unlock from your dashboard once you're on Free.

Start here

Free

€0/mo

The whole product — IDE extensions, MCP, the full engine. Capped at 100 generated tests per month.

Get started free

Essential

€29/mo

Built for scaling freelancers and dedicated individual apps. Up to 2,000 highly optimized generated test outputs per month.

Start free to unlock

Growth

€79/mo

Perfectly optimized for growing startup squads and collaborative pipelines. Includes up to 10,000 generated test structures.

Start free to unlock

Ultimate

€299/mo

Built for production-heavy engineering shops, outsourced agencies, and enterprise workflows. Up to 50,000 test case cycles.

Start free to unlock

There's no checkout on this page — start on Free, then activate any paid plan from your dashboard. Already signed in? Upgrade straight from there. Move up or down anytime, no separate checkout.

Need a temporary sprint burst? Purchase on-demand One-Time Boosters from €19 to lift your generation limits for 30 days dynamically.

React? Also covered

Components and hooks, render and behavior.

One spec covers what a component renders for given props and what happens when a user interacts with it — mapped straight to React Testing Library.

3TG · mapping spec
Button.3tg.md spec · markdown
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Button(props: Props) [react]

The type definition for props:
{ label: string; disabled: boolean; }

| scenario  | label    | disabled | screen.             | .to |
| --------- | -------- | -------- | ------------------- | --- |
| enabled   | 'Submit' | false    | getByText('Submit') |     |
| disabled  | 'Submit' | true     | getByText('Submit') |     |

```typescript scenario(enabled)
expect(screen.getByRole('button')).toBeEnabled();
```

```typescript scenario(disabled)
expect(screen.getByRole('button')).toBeDisabled();
```
Button.test.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import { render, screen } from '@testing-library/react'
import { Button } from './Button'

describe('Button.tsx', () => {
  describe('Button', () => {
    it('enabled', async () => {
      const props: Parameters<typeof Button>[0] = { label: 'Submit', disabled: false };
      render(<Button {...props} />);
      expect(screen.getByText('Submit')).toBeInTheDocument();
      expect(screen.getByRole('button')).toBeEnabled();
    });

    it('disabled', async () => {
      const props: Parameters<typeof Button>[0] = { label: 'Submit', disabled: true };
      render(<Button {...props} />);
      expect(screen.getByText('Submit')).toBeInTheDocument();
      expect(screen.getByRole('button')).toBeDisabled();
    });
  });
});

2 specs mapped · 2 scenarios · 0 hallucinated assertions

A spec can also set the values a test runs against — hooks and context inside the component, plus environment variables and async functions.

Your next component already has tests. It just doesn't know it yet.

Start free, then add the VS Code or IntelliJ extension — or wire 3TG into your AI agent over MCP, the most powerful way to drive it. Green suite in under five minutes.

The IDE extensions run fully deterministic with no AI. Add your own Gemini key for optional edge-case suggestions.

Specs live in your repo One-click install Free forever