Authors test-data factories using Faker: the Python `faker` library, the `@faker-js/faker` JS port, and the `faker-ruby` gem. Owns the library mechanics end to end: install per language, the provider catalogue (person / internet / location / date / finance / lorem), locale selection and multi-locale mode, and seed-based determinism for reproducible runs. Scope is generating fresh values for tests that start from nothing, not replacing values inside an existing dataset that already holds real records, which raises referential-integrity and re-identification concerns this skill does not address. Prefer this skill when the codebase already uses the Faker family or when cross-language consistency across Python, JS, and Ruby matters; use mimesis-data only when deeper Python locale coverage is the primary requirement. Use when authoring fixtures or factories that need realistic-looking field values.
75
94%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
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:
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() # 'walker.travis@example.com'
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(); // 'walker.travis@example.com'
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 # 'walker.travis@example.com'
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-tool-selector -
dispatcher that picks the right Faker port per language.