TestSeed
Datos sintéticos realistas, seguros y reproducibles para pruebas de software.
English version → README.en.md
TestSeed genera usuarios, nombres, correos, identificadores y fechas ficticios para tests, demos, desarrollo local y cursos. Hace tres promesas concretas:
- Reproducible: la misma versión + la misma configuración + la misma semilla devuelven exactamente los mismos datos, en cualquier sistema operativo y versión de Python.
- Seguro por defecto: los correos solo usan dominios reservados para pruebas (
.test), y los identificadores llevan el prefijoTS-para que no se confundan con documentos reales. - Sin dependencias: solo la biblioteca estándar de Python, sin llamadas de red.
Estado: alpha (0.1.0). La API puede cambiar antes de 1.0; los cambios se anotan en el CHANGELOG.
Instalación
Requiere Python 3.11 o superior.
# Desde el código fuente (modo desarrollo)
git clone https://github.com/javzdev/TestSeed.git
cd TestSeed
python -m venv .venv
# Windows: .venv\Scripts\activate | Linux/macOS: source .venv/bin/activate
pip install -e ".[dev]"
Todavía no está publicado en PyPI. Cuando lo esté:
pip install testseed.
Uso rápido
from testseed import TestSeed
seed = TestSeed(locale="es_CR", seed=123)
usuario = seed.user()
print(usuario.full_name) # Carolina Porras Herrera
print(usuario.email) # carolina.porras25@pruebas.test
print(usuario.id) # TS-USR-TV0JJ5C14J
usuarios = seed.users(count=100)
fecha = seed.date_between("2024-01-01", "2024-12-31")
Como diccionario o JSON
import json
datos = [u.to_dict() for u in seed.users(count=3)]
print(json.dumps(datos, ensure_ascii=False, indent=2))
to_dict() devuelve fechas en ISO 8601 y siempre las mismas claves, en este orden:
id, first_name, last_name, full_name, email, username, birth_date, created_at, locale.
En tus pruebas con pytest
import pytest
from testseed import TestSeed
@pytest.fixture
def datos() -> TestSeed:
return TestSeed(locale="es_CR", seed=2024)
def test_registro(datos: TestSeed) -> None:
for usuario in datos.users(count=50):
assert usuario.email.endswith(".test")
Más ejemplos en examples/.
API
| Llamada | Devuelve |
|---|---|
TestSeed(locale="en", seed=None, *, reference_date=None, email_domains=None) |
Generador |
seed.user(*, min_age=18, max_age=80) |
User |
seed.users(count, *, min_age=18, max_age=80) |
list[User] |
seed.first_name() / seed.last_name() / seed.full_name() |
str |
seed.email(first_name=None, last_name=None) |
str, p. ej. ana.mora07@correo.test |
seed.fake_id(prefix="ID") |
str, p. ej. TS-ID-7K3M9QX2AB |
seed.date_between(start, end) |
datetime.date (límites incluidos) |
seed.datetime_between(start, end) |
datetime.datetime en UTC |
seed.reset() |
Reinicia la secuencia desde el principio |
seed.seed, seed.locale, seed.reference_date, seed.email_domains |
Configuración en uso |
available_locales() |
("en", "es_CR") |
User es una dataclass inmutable con id, first_name, last_name, full_name,
email, username, birth_date, created_at (UTC) y locale.
Las fechas aceptan datetime.date o texto "AAAA-MM-DD".
Locales
| Código | Descripción |
|---|---|
en (por defecto) |
Inglés neutro, un apellido |
es_CR |
Español de Costa Rica, dos apellidos (Mora Vargas), dominios correo.test, ejemplo.test, pruebas.test |
Se aceptan variantes como "es-CR". Un locale no soportado lanza
UnsupportedLocaleError: TestSeed nunca cambia de locale en silencio.
Reproducibilidad
a = TestSeed(locale="es_CR", seed=42).users(count=10)
b = TestSeed(locale="es_CR", seed=42).users(count=10)
assert a == b
Garantías:
- Igual versión de TestSeed + igual
locale,seed,reference_date,email_domains+ igual secuencia de llamadas ⇒ mismos datos, en cualquier SO y Python ≥ 3.11. users(10)es siempre el prefijo deusers(100).- Cada método tiene su propia secuencia: llamar a
first_name()no cambia el siguienteuser(). - Las edades se calculan contra una fecha de referencia fija (2025-01-01 por defecto), no contra la fecha de hoy. Así los datos no cambian según el día en que corran tus tests.
- Si no indicas
seed, se elige una al azar; léela conseed.seedpara repetir la ejecución.
Las versiones de parche (0.1.x) nunca cambian los datos generados. Antes de 1.0, una
versión menor puede cambiarlos, siempre anotado en el CHANGELOG bajo
Reproducibility changes.
Privacidad y seguridad
- Correos: solo dominios reservados por la IETF (
*.test,*.example,*.invalid,*.localhost,example.com/.net/.org). Si pasas otro dominio enemail_domainsse lanzaUnsafeEmailDomainError. - Identificadores: formato
TS-<PREFIJO>-<10 caracteres>con letras y números. No generamos cédulas, pasaportes, números fiscales ni tarjetas de pago, ni siquiera con formato válido. - Nombres: se combinan al azar a partir de listas de nombres comunes. Una combinación puede coincidir con una persona real; no la trates como dato de nadie.
- Sin red: todo se genera localmente.
- No es criptografía: no uses TestSeed para generar contraseñas, tokens ni secretos.
- Unicidad: los correos e IDs son únicos dentro de una instancia. Entre instancias o semillas distintas no hay garantía.
Detalles en docs/PRIVACY.md.
Limitaciones (MVP)
- Solo dos locales:
enyes_CR. - Solo usuarios, nombres, correos, IDs y fechas. Sin direcciones, teléfonos, productos ni pedidos.
- Sin relaciones entre entidades, sin CLI y sin exportadores (usa
to_dict()+json/csv). - Las listas de nombres son cortas (≈40–50 por locale).
Lo que viene está en docs/ROADMAP.md.
Desarrollo
pip install -e ".[dev]"
ruff check . # lint
ruff format . # formato
mypy # tipos (modo estricto)
pytest --cov # pruebas + cobertura
./scripts/check.sh # todo lo anterior (Windows: .\scripts\check.ps1)
python -m build # construir wheel y sdist en dist/
Lee CONTRIBUTING.md antes de abrir un PR. Diseño técnico: docs/DESIGN.md. Publicación: docs/RELEASING.md.
Licencia
MIT.
Metadata
Release files for testseed 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| testseed-0.1.0.tar.gz | 33.7 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| testseed-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 54.0 kB
Release files / testseed-0.1.0.tar.gz
| Download URL | testseed-0.1.0.tar.gz |
|---|---|
| Size | 33.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fcae15dcbadc969320a40e7392440fe4722f837563c3565efbae3cf69c3fc5fb
|
|
BLAKE2b-256 checksum How to use checksums |
cacc553cc25602a06a12b11a8081c85098229b6662965d257812c9732611629b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.
Transparency logRelease files / testseed-0.1.0-py3-none-any.whl
| Download URL | testseed-0.1.0-py3-none-any.whl |
|---|---|
| Size | 20.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7300fb85521ac1bb52b4d16caee0dc6e5e843bd1f3034ef4efc0f9eff98870ee
|
|
BLAKE2b-256 checksum How to use checksums |
96e614a46ce6f53a838b9a0de4e5028f9b795cb3e7a8a0639408b21ee800734f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.
Transparency logSecurity for testseed 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for testseed-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.