CtrlK
BlogDocsLog inGet started
Tessl Logo

testland/synthetic-data-toolkit

Umbrella for the synthetic test data generators beyond plain Faker - FactoryBot (Ruby factories with traits, associations, and build / create / build_stubbed strategies), Mimesis (fast type-hinted Python generator with the Schema/Field bulk pattern and 46 locales), and Bogus (.NET typed `Faker<T>` builders with `.RuleFor` / `StrictMode` / `UseSeed`). Picks the right generator by language and job, shows side-by-side equivalents of the same fixture across all four ecosystems, and carries each tool's full workflow in references/ (factory-bot.md, mimesis.md, bogus.md). faker-data stays the default for plain field values in Python / JS / Ruby; use this skill when the project needs typed factory orchestration, .NET fixtures, or a documented "which tool should I use" decision.

72

Quality

91%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Passed

No findings from the security scan

Overview
Quality
Evals
Security
Files

mimesis.mdreferences/

Mimesis (Python) - full workflow

Reference detail for synthetic-data-toolkit. Mimesis is a Python test-data generator that's "widely recognized as the fastest data generator among Python solutions" with full type hints for editor autocompletion (mimesis-readme).

The library supports 46 locales (mimesis-readme) and exposes both per-provider methods (Person.full_name()) and a schema-based generator for typed-dict shapes.

When to use

  • The project is Python and the team values mimesis's speed (~10-100x faster than Faker on bulk generation, per the upstream benchmarks).
  • Type hints matter - mimesis exposes typed return values that show up in IDE autocomplete.
  • The project needs strong locale coverage - mimesis ships 46 locales; Faker ships 70+ but many are Faker-thin (only a few providers populated).
  • Schema-based generation is a fit - mimesis's Schema / Field pattern produces typed dicts directly.

If the team is already standardized on Faker, switching is rarely worth it - see faker-data. If the team needs factory orchestration with referential integrity, pair mimesis with factory_boy (or use FactoryBot - see factory-bot.md - in Ruby projects).

Install

pip install mimesis

(Per mimesis-readme.)

Authoring

Per-provider usage

from mimesis import Person, Address, Internet, Datetime
from mimesis.locales import Locale

person = Person(Locale.EN)
person.full_name()                 # 'Brande Sears'
person.email(domains=['example.com'])   # 'roccelline1878@example.com'
person.gender()
person.title()

address = Address(Locale.EN)
address.full_address()             # '123 Main St, Springfield, IL 62701'
address.city()
address.country()

internet = Internet()
internet.url()
internet.ip_v4()
internet.user_agent()

dt = Datetime()
dt.datetime()
dt.date()
dt.formatted_datetime()

(Adapted from mimesis-readme.)

Generic - one entry point per locale

from mimesis import Generic
from mimesis.locales import Locale

g = Generic(Locale.EN)
g.person.full_name()
g.address.city()
g.internet.email()

Generic aggregates every provider under one instance - preferred when a fixture needs values from multiple providers; avoids constructing one provider per type.

Schema-based - typed-dict generation

from mimesis import Field, Schema, Locale

field = Field(Locale.EN)

# Build one row's worth of data
def schema():
    return {
        "id": field("uuid"),
        "name": field("person.full_name"),
        "email": field("person.email"),
        "created_at": field("datetime.datetime"),
        "address": {
            "city": field("address.city"),
            "zip": field("address.postal_code"),
        },
    }

# Generate a list of rows
generator = Schema(schema=schema, iterations=1000)
data = generator.create()    # → list of 1000 dicts

(Adapted from mimesis-readme schema documentation.)

The schema/field pattern is mimesis's distinguishing feature - it produces typed-dict shapes without per-field method calls, which makes it convenient for bulk fixture generation (e.g. seeding a test DB with 10k rows).

Locale support

from mimesis import Person
from mimesis.locales import Locale

Person(Locale.EN).full_name()    # 'Brande Sears'
Person(Locale.JA).full_name()    # '広橋 美月'
Person(Locale.RU).full_name()    # 'Анастасия Иванова'
Person(Locale.DE).full_name()    # 'Klaus Müller'

Per mimesis-readme, 46 locales are supported. Full list at mimesis.name/latest/locales.html.

Seeding for determinism

from mimesis import Generic
from mimesis.locales import Locale

g = Generic(Locale.EN, seed=12345)
g.person.full_name()    # deterministic based on seed

Pass seed= at provider construction; subsequent calls are deterministic. Same as faker-data, seed in tests so failures reproduce locally.

Pairing with factory_boy

Mimesis can be the value engine for factory_boy:

from factory import Factory, LazyFunction
from mimesis import Person, Locale
from myapp.models import User

person = Person(Locale.EN, seed=42)

class UserFactory(Factory):
    class Meta:
        model = User

    name  = LazyFunction(person.full_name)
    email = LazyFunction(lambda: person.email())

LazyFunction ensures each factory instantiation re-calls the mimesis method - getting a new value per fixture, not a single shared one.

Anti-patterns

Anti-patternWhy it failsFix
Constructing one provider per attributePerson() per field is N times the constructor cost; slows bulk generation.Use Generic once; access providers as attributes.
Hardcoding seed= literally to a value the test depends onBrittle: a mimesis update changes the PRNG sequence; the test fails next upgrade.Pin mimesis version; OR assert patterns (matches a regex), not literal values.
Using mimesis for security payloadsMimesis generates realistic-looking data; SQL injection / XSS won't appear.Use malicious-payload-bank.
Schema with 100k iterations in pytestMemory-bound; slow.Generate to disk (Schema.to_csv, Schema.to_json) and seed the DB outside the test.
Mixing mimesis + Faker in the same projectTwo PRNGs to seed; two doc surfaces; two upgrade cadences.Pick one; if migrating, do it in a single PR.

Limitations

  • Smaller community than Faker. Fewer Stack Overflow answers, fewer third-party providers.
  • PRNG sequence varies across major versions. Pin the version in CI for deterministic tests across runs.
  • No native factory orchestration. You still need factory_boy (or hand-rolled equivalents) for referential integrity.

References

SKILL.md

tile.json