Test Data Generation
Table of Contents
Overview
Test data generation creates realistic, consistent, and maintainable test data for automated testing. Well-designed test data reduces test brittleness, improves readability, and makes it easier to create diverse test scenarios.
When to Use
- Creating fixtures for integration tests
- Generating fake data for development databases
- Building test data with complex relationships
- Creating realistic user inputs for testing
- Seeding test databases
- Generating edge cases and boundary values
- Building reusable test data factories
Quick Start
Minimal working example:
// tests/factories/userFactory.js
const { faker } = require("@faker-js/faker");
class UserFactory {
static build(overrides = {}) {
return {
id: faker.string.uuid(),
email: faker.internet.email(),
firstName: faker.person.firstName(),
lastName: faker.person.lastName(),
age: faker.number.int({ min: 18, max: 80 }),
phone: faker.phone.number(),
address: {
street: faker.location.streetAddress(),
city: faker.location.city(),
state: faker.location.state(),
zip: faker.location.zipCode(),
country: "USA",
},
role: "user",
isActive: true,
createdAt: faker.date.past(),
...overrides,
};
}
// ... (see reference guides for full implementation)
Reference Guides
Detailed implementations in the references/ directory:
| Guide |
Contents |
| Factory Pattern for Test Data |
Factory Pattern for Test Data |
| Builder Pattern for Complex Objects |
Builder Pattern for Complex Objects |
| Fixtures for Integration Tests |
Fixtures for Integration Tests |
| Realistic Data Generation |
Realistic Data Generation |
Best Practices
✅ DO
- Use faker libraries for realistic data
- Create reusable factories for common objects
- Make factories flexible with overrides
- Generate unique values where needed (emails, IDs)
- Use builders for complex object construction
- Create fixtures for integration test setup
- Generate edge cases (empty strings, nulls, boundaries)
- Keep test data deterministic when possible
❌ DON'T
- Hardcode test data in multiple places
- Use production data in tests
- Generate truly random data for reproducible tests
- Create overly complex factory hierarchies
- Ignore data relationships and constraints
- Generate massive datasets for simple tests
- Forget to clean up generated data
- Use the same test data for all tests
1---
2name: test-data-generation
3description: >
4 Generate realistic, consistent test data using factories, fixtures, and fake
5 data libraries. Use for test data, fixtures, mock data, faker, test builders,
6 and seed data generation.
7---
8
9# Test Data Generation
10
11## Table of Contents
12
13- [Overview](#overview)
14- [When to Use](#when-to-use)
15- [Quick Start](#quick-start)
16- [Reference Guides](#reference-guides)
17- [Best Practices](#best-practices)
18
19## Overview
20
21Test data generation creates realistic, consistent, and maintainable test data for automated testing. Well-designed test data reduces test brittleness, improves readability, and makes it easier to create diverse test scenarios.
22
23## When to Use
24
25- Creating fixtures for integration tests
26- Generating fake data for development databases
27- Building test data with complex relationships
28- Creating realistic user inputs for testing
29- Seeding test databases
30- Generating edge cases and boundary values
31- Building reusable test data factories
32
33## Quick Start
34
35Minimal working example:
36
37```javascript
38// tests/factories/userFactory.js
39const { faker } = require("@faker-js/faker");
40
41class UserFactory {
42 static build(overrides = {}) {
43 return {
44 id: faker.string.uuid(),
45 email: faker.internet.email(),
46 firstName: faker.person.firstName(),
47 lastName: faker.person.lastName(),
48 age: faker.number.int({ min: 18, max: 80 }),
49 phone: faker.phone.number(),
50 address: {
51 street: faker.location.streetAddress(),
52 city: faker.location.city(),
53 state: faker.location.state(),
54 zip: faker.location.zipCode(),
55 country: "USA",
56 },
57 role: "user",
58 isActive: true,
59 createdAt: faker.date.past(),
60 ...overrides,
61 };
62 }
63// ... (see reference guides for full implementation)
64```
65
66## Reference Guides
67
68Detailed implementations in the `references/` directory:
69
70| Guide | Contents |
71|---|---|
72| [Factory Pattern for Test Data](references/factory-pattern-for-test-data.md) | Factory Pattern for Test Data |
73| [Builder Pattern for Complex Objects](references/builder-pattern-for-complex-objects.md) | Builder Pattern for Complex Objects |
74| [Fixtures for Integration Tests](references/fixtures-for-integration-tests.md) | Fixtures for Integration Tests |
75| [Realistic Data Generation](references/realistic-data-generation.md) | Realistic Data Generation |
76
77## Best Practices
78
79### ✅ DO
80
81- Use faker libraries for realistic data
82- Create reusable factories for common objects
83- Make factories flexible with overrides
84- Generate unique values where needed (emails, IDs)
85- Use builders for complex object construction
86- Create fixtures for integration test setup
87- Generate edge cases (empty strings, nulls, boundaries)
88- Keep test data deterministic when possible
89
90### ❌ DON'T
91
92- Hardcode test data in multiple places
93- Use production data in tests
94- Generate truly random data for reproducible tests
95- Create overly complex factory hierarchies
96- Ignore data relationships and constraints
97- Generate massive datasets for simple tests
98- Forget to clean up generated data
99- Use the same test data for all tests