Skip to content
cccskills
FreePublished on GitHub

test-database-seeding

Use when a test needs a database - spin up a dedicated, disposable test database (Testcontainers) seeded with known data, never a shared or production database

The English summary is being prepared. Showing the original description.

Works withPostgreSQL
See how to install

Files included (1)

  • SKILL.md3.6 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

Test Database Seeding

Overview

Automated tests need a database that is real (same engine as production), isolated (no shared state), and seeded with known data. The answer is a disposable, per-run database — Testcontainers spins up a real Postgres in a container, migrated and seeded, torn down after.

Core principle: Real engine, disposable instance, known seed. Never point tests at a shared dev or production database, and never use an in-memory substitute whose SQL differs from production.

Why not the alternatives

ApproachProblem
Shared dev/staging DBFlaky: other work mutates it; tests collide and depend on order
Production DBNever — data risk, and tests would mutate real records
In-memory (H2/SQLite)Dialect gaps: queries pass in H2, fail on Postgres → bugs ship
Disposable real DB (Testcontainers)✅ real engine, isolated, reproducible

The Pattern

  1. Start a real DB container for the suite (Testcontainers): postgres:<same-major-as-prod>.
  2. Run the real migrations against it — the same migration files the app uses, so the schema is production-accurate.
  3. Seed known fixtures: insert the exact rows the scenario needs (a project, N tasks, a user with a role). Keep fixtures small and explicit — a test asserting "3 tasks" seeds exactly 3.
  4. Isolate per test: each test either runs in a transaction rolled back at the end, or truncates/reseeds between tests. No test sees another's data.
  5. Point the app/config at the container's connection string for the run.
  6. Tear down automatically when the suite ends.

Worked Example

@Testcontainers
class TaskExportIT {
    @Container static PostgreSQLContainer<?> db =
        new PostgreSQLContainer<>("postgres:16");

    @BeforeAll static void migrate() { Flyway.configure().dataSource(db.getJdbcUrl(),
        db.getUsername(), db.getPassword()).load().migrate(); }   // real migrations

    @BeforeEach void seed() {
        // exactly the rows this scenario needs
        insertProject("p1", "Demo");
        insertTasks("p1", 3);
    }

    @Test void export_returns_all_tasks() {
        var csv = export("p1");
        assertEquals(3, csvRows(csv));   // asserts against the known seed
    }
}

Same idea in Go (Testcontainers-Go), Node (testcontainers), etc. — a real Postgres, real migrations, explicit seed.

Rules

  • The container's engine and MAJOR version match production. No dialect gambling.
  • Migrations come from the app, not a hand-written schema — a stale test schema hides real migration bugs.
  • Seeds are explicit and minimal; assertions reference the seeded values.
  • Each test is independent (transaction rollback or reseed) and order-independent.
  • Combine with test-doubles-wiremock: real DB, stubbed external HTTP.

Common Mistakes

  • Pointing tests at a shared dev database → collisions and flakiness.
  • H2/SQLite instead of the real engine → dialect bugs ship green.
  • Hand-maintained test schema that drifts from the real migrations.
  • Tests that leave data behind and only pass in a specific order.

Red Flags

  • A test fails when run alone but passes in the suite (or vice versa) → shared/leftover state.
  • The test DB schema was created by a script other than the app's migrations.
  • Query passes in tests but fails in production → you tested a different engine.

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

Use when writing acceptance criteria for a task - express each as an observable Given/When/Then that QA can execute, including negative cases

The English summary is being prepared. Showing the original description.

makifbaysal/tasktrooper118Updated Oct 21, 2026

Use when the diff adds or changes an endpoint, resolver, RPC, job or query that takes an object id, a role check, a request binding or a tenant filter - BOLA/IDOR, function-level authorization, mass assignment and tenant scoping

The English summary is being prepared. Showing the original description.

makifbaysal/tasktrooper118Updated Oct 21, 2026

Use on every UI change - semantic HTML, labels for controls, keyboard-navigable dialogs/menus, visible focus, and never color as the only signal

The English summary is being prepared. Showing the original description.

makifbaysal/tasktrooper118Updated Oct 21, 2026

Use when a task changes any screen, form, dialog, menu or control - Lighthouse/axe scan of the changed screens, a keyboard walk, and the thresholds that fail a task

The English summary is being prepared. Showing the original description.

makifbaysal/tasktrooper118Updated Oct 21, 2026

How to work a task returned with review, QA or UAT findings. Use when a task is in need_revision or PR review comments are in your context.

The English summary is being prepared. Showing the original description.

makifbaysal/tasktrooper118Updated Oct 21, 2026

Use when the repository keeps its alerting in code, or a person asks for alerts outside TaskTrooper - PrometheusRule YAML, a Cloud Monitoring alert policy in Terraform, a Datadog monitor, each routed to TaskTrooper's alert ingest URL so it opens an incident here

The English summary is being prepared. Showing the original description.

makifbaysal/tasktrooper118Updated Oct 21, 2026

See all skills by makifbaysal

Report a problem with this skill