From qa-test-data
Authors test-data factories using Faker - covering the Python `faker` library, the `@faker-js/faker` JS port, and the `faker-ruby` gem - to generate names, emails, addresses, phone numbers, dates, and locale-aware variants. Configures seed-based determinism for reproducible runs and selects providers (person / internet / location / date / finance / lorem) per language. Use when authoring fixtures or factories that need realistic-looking field values.
How this skill is triggered — by the user, by Claude, or both
Slash command
/qa-test-data:faker-dataThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Faker is a family of libraries (Python / JS / Ruby / Java / .NET / PHP)
Faker is a family of libraries (Python / JS / Ruby / Java / .NET / PHP) that generate realistic synthetic field values - names, emails, addresses, dates, etc. - for test fixtures. The three most common ports in this skill's scope:
| Language | Library | Reference |
|---|---|---|
| Python | faker | faker-py |
| JS / TS | @faker-js/faker | faker-js |
| Ruby | faker-ruby/faker | faker-rb |
For .NET, see bogus-data. For
Python-specifically with stronger locale coverage, also see
mimesis-data.
'foo' / 'bar' pattern produces tests that miss real
bugs around long names, Unicode, edge-case formats).de_DE, ja_JP,
ar_SA, etc.).pip install Faker
(Per faker-py.)
npm install --save-dev @faker-js/faker
(Per faker-js.)
# Gemfile
gem 'faker', group: :test
(Per faker-rb.)
from faker import Faker
fake = Faker()
fake.name() # 'Margaret Boehm'
fake.email() # '[email protected]'
fake.address() # '123 Main St, Apt 4B\nSpringfield, IL 62701'
fake.phone_number() # '+1-555-867-5309'
fake.date_of_birth(minimum_age=18, maximum_age=65)
fake.text(max_nb_chars=200)
(Per faker-py.)
Common provider modules: person (name, prefix), address,
internet (email, url, ipv4), phone_number, date_time,
lorem (paragraphs, sentences, words), company, credit_card,
job (faker-py).
import { faker } from '@faker-js/faker';
faker.person.fullName(); // 'Margaret Boehm'
faker.internet.email(); // '[email protected]'
faker.location.streetAddress(); // '123 Main St'
faker.phone.number(); // '+1-555-867-5309'
faker.date.past({ years: 30 });
faker.lorem.paragraphs(2);
(Per faker-js.)
Module organization mirrors the Python ports but uses the module-
namespace form: faker.person.*, faker.internet.*,
faker.location.*, faker.date.*, faker.finance.*,
faker.commerce.* (faker-js).
require 'faker'
Faker::Name.name # 'Margaret Boehm'
Faker::Internet.email # '[email protected]'
Faker::Address.full_address
Faker::PhoneNumber.cell_phone
Faker::Date.birthday(min_age: 18, max_age: 65)
Faker::Lorem.paragraphs(number: 2)
(Per faker-rb.)
The most common test-stability mistake is letting Faker generate non-deterministic values across runs. Always seed in tests so a failure can be reproduced.
from faker import Faker
# Class-level — sets the default RNG for all subsequent Faker() calls
Faker.seed(4321)
fake = Faker()
# Instance-level — useful when multiple Faker instances need different seeds
fake.seed_instance(4321)
(Per faker-py.)
import { faker } from '@faker-js/faker';
faker.seed(123);
// All faker.* calls until the next seed() are deterministic.
(Per faker-js.)
require 'faker'
Faker::Config.random = Random.new(42)
For test frameworks: place the seed in beforeEach / setup so
each test starts with the same baseline; for paired runs, persist
the seed used per failing test (similar to the
flake-pattern-reference
Pattern 8 randomness guidance).
fake = Faker('it_IT') # Italian
fake = Faker(['en_US', 'fr_FR', 'ja_JP']) # Multi-locale (random per call)
fake.name() # generates per the configured locale(s)
(Per faker-py.)
import { fakerDE } from '@faker-js/faker';
import { fakerJA } from '@faker-js/faker';
fakerDE.person.fullName(); // German name
fakerJA.address.city(); // Japanese city
(Per faker-js; 70+ locales available.)
Faker::Config.locale = :ja
Faker::Name.name # Japanese name
(Per faker-rb.)
Faker generates field values; for referential integrity (a
factory that creates a User with a related Order), use a factory
library that wraps Faker:
| Language | Factory library | Skill |
|---|---|---|
| Python | factory_boy | (consider mimesis-data for locale-rich pure mimesis pattern) |
| JS / TS | fishery / factory.ts | hand-rolled with Faker as engine |
| Ruby | FactoryBot | factory-bot-data |
| .NET | Bogus | bogus-data |
Faker alone won't enforce that order.user_id == user.id; the
factory library handles that.
| Anti-pattern | Why it fails | Fix |
|---|---|---|
| Calling Faker without a seed in tests | A failure on CI doesn't reproduce locally; flake-investigation guesswork. | Seed once per test or per suite (Faker.seed(...)). |
Using fake.email() with a real domain (example.com is shared) | Spam concerns; some validators reject example.com. | Faker's defaults use safe RFC-2606 domains; never override to a real domain in tests. |
| Hardcoding generated values into snapshots | Snapshot bound to a Faker version's PRNG sequence; library bump breaks the snapshot. | Snapshot the shape of the data; assert types and patterns rather than literal values. |
| Generating names with the wrong locale | A test asserting "name has at least one space" fails on :ja (Japanese) where names use ・. | Match the locale to the assertion; or relax the assertion to be locale-aware. |
| Using Faker for security testing payloads | Faker generates "realistic" data, not malicious. SQL injection / XSS won't happen by chance. | Use malicious-payload-bank for adversarial input. |
v18 vs v19. Pin the version in CI
for deterministic tests.en_US is the most complete; less-
common locales fall back to defaults silently. Test the locales
you care about; don't assume completeness.+-tagged); your
validation may reject it. Match Faker's domain provider to your
validator's regex.@faker-js/faker (modules, seed, 70+ locales).faker-ruby/faker (modules, seed, locale).mimesis-data - Python alternative
with stronger locale coverage.factory-bot-data - Ruby factory
library that uses Faker as engine.bogus-data - .NET counterpart.synthetic-data-toolkit -
dispatcher that picks the right Faker port per language.Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Searches MemPalace before answering questions about past work, people, projects, or prior decisions. Returns verbatim stored content instead of guessing from model memory.
npx claudepluginhub testland/qa --plugin qa-test-data