Black-box tests
Test the real thing.
A real browser against the real app: no mocks, no hooks, no access to your source code. Scenarios that capture what your product does for customers, written as Playwright code you own.
01 · No mocks
Tests click, type, and read the screen against your deployed app, with its real backend, database, and third parties. They don't need your code, so they work for any stack.
| Unit | Empirical | |
|---|---|---|
| Imports code | yes | no |
| Needs your repo | yes | no |
| Mocks network | often | never |
| Runs against | a harness | your URL |
02 · Scenarios that matter
Each test is a product scenario: the inputs a customer gives and the outcome they pay for. A red test reads as a broken promise to a customer, not a broken function.
- Guest checks out with a coupon code
- New user signs up with Google and lands on onboarding
- Admin invites a teammate who accepts from email
- Customer downgrades plan and keeps their data
03 · An asset for big changes
Rewrite the backend, swap the framework, move auth providers. The suite describes what users do, not how the code does it, so it stays put and tells you the change is safe to ship.
API · Node → Rust 0 changed
Vue → React 0 changed
REST → GraphQL 0 changed
Auth0 → Clerk 3 changed
04 · We ship tests as code
Every test is Playwright in TypeScript, in a git repo you can clone. Run it on your laptop or your CI with no Empirical in the loop. Leave whenever you like and keep the suite.
$ cat tests/checkout/coupon.spec.ts test("guest checks out with a coupon code", async ({ page }) => { await page.getByLabel("Coupon").fill("WELCOME10"); await page.getByRole("button", { name: "Pay now" }).click(); await expect(page.getByText("Order confirmed")).toBeVisible(); }); $ npx playwright test ✓ 212 passed (4.1m)