Strategie danych testowych i fixtures
Twój zestaw testów używa 500-liniowego pliku seed skopiowanego z produkcji trzy lata temu. Połowa testów zależy od istnienia “John Doe” z emailem “john@test.com” i user ID 1. Gdy ktoś doda unique constraint na email, czterdzieści testów się psuje. Gdy schemat się zmienia, plik seed wymaga ręcznej aktualizacji zajmującej pół dnia. Dane testowe są fundamentem Twojej infrastruktury testowej — a większość zespołów traktuje je jako rzecz drugorzędną.
Czego się nauczysz
Dział zatytułowany „Czego się nauczysz”- Implementację wzorca factory generującą spójne, realistyczne dane testowe na żądanie
- Strategie zarządzania fixtures dla różnych warstw testowych (unit, integracyjne, E2E)
- Generowanie danych zgodne z prywatnością naśladujące wzorce produkcyjne bez prawdziwych PII
- Workflow seedowania bazy danych dla testów integracyjnych i E2E
- Prompty do generowania fabryk danych testowych specyficznych dla domeny
Wzorzec factory
Dział zatytułowany „Wzorzec factory”Fabryki zastępują zahardkodowane dane testowe konfigurowalnymi generatorami produkującymi świeże, unikalne dane dla każdego testu.
@src/lib/db/schema.tsGenerate test data factories for every entity in our database schema:
For each table, create a factory at /tests/factories/{entity}.factory.ts that:1. Uses @faker-js/faker for realistic data generation2. Has build() - returns a plain object (for unit tests, no DB)3. Has create(db) - inserts into the database and returns the record4. Has buildList(count) - generates an array of objects5. Has createList(db, count) - inserts multiple records6. Supports overrides: build({ email: 'specific@test.com' })7. Supports traits: build('admin'), build('suspended')8. Handles foreign keys: OrderFactory.create() auto-creates a User if needed9. Generates UNIQUE values (no collisions even with 1000 records)
Create a factory index at /tests/factories/index.ts that exports all factories.Follow our Drizzle ORM patterns for database insertions.claude "Read our database schema at /src/lib/db/schema.ts and generatetest data factories for every entity.
Save to /tests/factories/ with one file per entity.Each factory must:- Use faker.js for data generation- Support build() and create() patterns- Handle foreign key relationships automatically- Generate unique values per invocation- Support overrides and traits
After creating factories, verify they work by:1. Building 100 of each entity (no collisions)2. Creating 10 of each in the test database (relationships resolve)3. Running existing tests to verify compatibility"Generate test data factories for all database entities:1. Read the database schema2. Create factory files with build/create patterns3. Handle entity relationships and foreign keys4. Verify factories produce valid data5. Create a PR with the factory infrastructureStrategie fixtures według warstwy testowej
Dział zatytułowany „Strategie fixtures według warstwy testowej”Testy jednostkowe: buduj, nie twórz w bazie
Dział zatytułowany „Testy jednostkowe: buduj, nie twórz w bazie”Testy jednostkowe nigdy nie powinny dotykać bazy danych. Użyj build() do tworzenia czystych obiektów.
// Dobrze: czyste obiekty, bez bazy danychconst user = UserFactory.build({ role: 'admin' });const result = authService.checkPermission(user, 'delete_users');expect(result).toBe(true);Testy integracyjne: tworzenie z izolacją
Dział zatytułowany „Testy integracyjne: tworzenie z izolacją”Testy integracyjne potrzebują rekordów w bazie danych, ale nie mogą wylewać stanu między testami.
Testy E2E: stabilne dane referencyjne
Dział zatytułowany „Testy E2E: stabilne dane referencyjne”Testy E2E potrzebują przewidywalnych danych utrzymujących się przez cały przebieg testu.
Generowanie danych zgodne z prywatnością
Dział zatytułowany „Generowanie danych zgodne z prywatnością”Dane produkcyjne bez prawdziwych PII
Dział zatytułowany „Dane produkcyjne bez prawdziwych PII”Gdy coś się zepsuje
Dział zatytułowany „Gdy coś się zepsuje”“Testy failują, bo fabryki generują dane naruszające reguły biznesowe.” Twoje fabryki potrzebują wiedzy domenowej. Dodaj walidację do fabryki: jeśli produkt jest “outOfStock”, stock musi być 0. Jeśli zamówienie jest “delivered”, musi mieć datę shipped_at przed delivered_at. Koduj reguły biznesowe w fabryce, nie tylko losowe dane.
“Tworzenie danych testowych jest wolne z powodu łańcuchów kluczy obcych.” Wstawiaj masowo zamiast tworzenia jednego rekordu na raz. Tworzenie współdzielonych danych referencyjnych (kategorie, role) raz w hooku beforeAll. Tworzenie danych specyficznych dla encji tylko per test.
“Plik seed ciągle rozjeżdża się ze zmianami schematu.” Generuj fabryki ze schematu, nie ręcznie. Gdy schemat się zmienia, przegeneruj: “Read the updated schema and update all factories to match. Add default values for new required columns.”
“Potrzebujemy danych produkcyjnych do debugowania, ale nie możemy ich użyć z powodu PII.” Użyj podejścia generowania zgodnego z prywatnością. Tworzenie syntetycznych danych odpowiadających rozkładom produkcyjnym. Do reprodukcji konkretnych bugów zanonimizuj rekord produkcyjny ręcznie: zamień email na faker email, imię na faker imię, ale zachowaj dane strukturalne reprodukujące buga.