The Testing module provides test fixtures, generators, and utilities for the Codomyrmex test suite. It includes two submodules: fixtures for test fixture management and generators for test data generation.
Test fixture management and setup utilities.
Test data generation utilities.
Enumeration of fixture scopes.
from codomyrmex.testing.fixtures import FixtureScope
# Values
FixtureScope.FUNCTION # Per-function scope
FixtureScope.CLASS # Per-class scope
FixtureScope.MODULE # Per-module scope
FixtureScope.SESSION # Per-session scopeData class representing a fixture definition.
from codomyrmex.testing.fixtures import FixtureDefinition
definition = FixtureDefinition(
name="db",
factory=create_test_db,
scope=FixtureScope.MODULE,
cleanup=lambda db: db.close(),
dependencies=["config"]
)Attributes:
name: str- Fixture namefactory: Callable[[], Any]- Factory function to create fixturescope: FixtureScope- Fixture scope (default: FUNCTION)cleanup: Optional[Callable[[Any], None]]- Cleanup functiondependencies: List[str]- List of dependent fixture names
Data class representing an instantiated fixture.
from codomyrmex.testing.fixtures import FixtureInstance
# Attributes
instance.name # str: Fixture name
instance.value # Any: The fixture value
instance.scope # FixtureScope: The scope
instance.created_at # datetime: When createdManages test fixtures with dependency resolution and cleanup.
from codomyrmex.testing.fixtures import FixtureManager
fixtures = FixtureManager()
# Register fixtures
fixtures.register("db", lambda: create_test_db())
fixtures.register(
"user",
lambda: create_test_user(),
cleanup=lambda u: u.delete()
)
# Use fixtures
with fixtures.use("db") as db:
# test with db
pass
# Manual get/cleanup
value = fixtures.get("db")
fixtures.cleanup("db")
fixtures.cleanup_all()
# List fixtures
names = fixtures.list_fixtures()Methods:
register(name, factory, scope, cleanup, dependencies)- Register a fixtureget(name) -> Any- Get or create fixture instancecleanup(name)- Clean up specific fixturecleanup_all()- Clean up all fixturesuse(name)- Context manager for fixture usagelist_fixtures() -> List[str]- List registered fixture names
Pre-defined data fixture with filtering capabilities.
from codomyrmex.testing.fixtures import DataFixture
users = DataFixture([
{"id": 1, "name": "Alice", "active": True},
{"id": 2, "name": "Bob", "active": False},
])
# Access
assert users[0]["name"] == "Alice"
assert len(users) == 2
# Filter
active = users.filter(active=True)
bob = users.find(id=2)
all_users = users.all()
# Iterate
for user in users:
print(user["name"])Methods:
__getitem__(index) -> Dict[str, Any]- Access by index__len__() -> int- Get count__iter__()- Iterate over recordsfilter(**kwargs) -> List[Dict[str, Any]]- Filter by field valuesfind(**kwargs) -> Optional[Dict[str, Any]]- Find first matchall() -> List[Dict[str, Any]]- Get all records
Loads fixtures from JSON files with caching.
from codomyrmex.testing.fixtures import JSONFixtureLoader
loader = JSONFixtureLoader("tests/fixtures")
users = loader.load("users") # Loads users.json
loader.clear_cache()Methods:
load(name) -> DataFixture- Load fixture by nameclear_cache()- Clear loaded fixture cache
Fluent builder for creating fixture data.
from codomyrmex.testing.fixtures import FixtureBuilder
user = (FixtureBuilder("user")
.with_field("id", 1)
.with_field("name", "Test User")
.with_field("active", True)
.build())
# Or multiple fields at once
item = (FixtureBuilder("item")
.with_fields(a=1, b=2, c=3)
.build())
# Build many with incremental IDs
users = (FixtureBuilder("user")
.with_field("name", "User")
.build_many(10)) # Creates 10 users with id=1..10Methods:
with_field(key, value) -> FixtureBuilder- Add single fieldwith_fields(**kwargs) -> FixtureBuilder- Add multiple fieldsbuild() -> Dict[str, Any]- Build single fixturebuild_many(count, id_field="id") -> List[Dict[str, Any]]- Build many with IDs
Enumeration of data types for generation.
from codomyrmex.testing.generators import DataType
# Values
DataType.STRING
DataType.INTEGER
DataType.FLOAT
DataType.BOOLEAN
DataType.DATE
DataType.EMAIL
DataType.UUID
DataType.NAME
DataType.ADDRESS
DataType.PHONESpecification for a generated field.
from codomyrmex.testing.generators import FieldSpec, DataType
spec = FieldSpec(
name="age",
data_type=DataType.INTEGER,
nullable=False,
unique=True,
min_value=18,
max_value=100
)Base class for all data generators.
from codomyrmex.testing.generators import Generator
class MyGenerator(Generator):
def generate(self) -> Any:
return "custom_value"
gen = MyGenerator()
value = gen.generate()
values = gen.generate_many(10)Generates random strings.
from codomyrmex.testing.generators import StringGenerator
gen = StringGenerator(
min_length=5,
max_length=20,
charset="abc123" # Optional custom charset
)
result = gen.generate()Generates random integers.
from codomyrmex.testing.generators import IntegerGenerator
gen = IntegerGenerator(min_value=0, max_value=1000)
result = gen.generate()Generates random floats with precision control.
from codomyrmex.testing.generators import FloatGenerator
gen = FloatGenerator(
min_value=0.0,
max_value=100.0,
precision=2
)
result = gen.generate() # e.g., 42.57Generates random booleans with configurable probability.
from codomyrmex.testing.generators import BooleanGenerator
gen = BooleanGenerator(true_probability=0.7)
result = gen.generate()Generates random dates within a range.
from codomyrmex.testing.generators import DateGenerator
from datetime import datetime
gen = DateGenerator(
start_date=datetime(2020, 1, 1),
end_date=datetime(2025, 12, 31)
)
result = gen.generate()Generates random email addresses.
from codomyrmex.testing.generators import EmailGenerator
gen = EmailGenerator()
result = gen.generate() # e.g., "xkjfh@example.com"Generates UUID-like strings.
from codomyrmex.testing.generators import UUIDGenerator
gen = UUIDGenerator()
result = gen.generate() # e.g., "a1b2c3d4-e5f6-g7h8-i9j0-k1l2m3n4o5p6"Generates random full names.
from codomyrmex.testing.generators import NameGenerator
gen = NameGenerator()
result = gen.generate() # e.g., "Alice Smith"Generates random choice from a list.
from codomyrmex.testing.generators import ChoiceGenerator
gen = ChoiceGenerator(["red", "green", "blue"])
result = gen.generate() # e.g., "green"Generates structured records with multiple fields.
from codomyrmex.testing.generators import (
RecordGenerator,
NameGenerator,
EmailGenerator,
IntegerGenerator
)
gen = RecordGenerator()
gen.add_field("name", NameGenerator())
gen.add_field("email", EmailGenerator())
gen.add_field("age", IntegerGenerator(18, 65))
record = gen.generate()
records = gen.generate_many(100)Methods:
add_field(name, generator) -> RecordGenerator- Add field generatorgenerate() -> Dict[str, Any]- Generate single recordgenerate_many(count) -> List[Dict[str, Any]]- Generate multiple records
Generates complete datasets with multiple columns.
from codomyrmex.testing.generators import (
DatasetGenerator,
UUIDGenerator,
NameGenerator,
BooleanGenerator
)
dataset = DatasetGenerator("users")
dataset.add_column("id", UUIDGenerator())
dataset.add_column("name", NameGenerator())
dataset.add_column("active", BooleanGenerator())
data = dataset.generate(rows=1000)
csv = dataset.generate_csv(rows=100)
columns = dataset.columns # ["id", "name", "active"]Methods:
add_column(name, generator) -> DatasetGenerator- Add column generatorcolumns -> List[str]- Get column namesgenerate(rows=100) -> List[Dict[str, Any]]- Generate datasetgenerate_csv(rows=100) -> str- Generate as CSV string
from codomyrmex.testing.fixtures import FixtureManager, FixtureScope
# Set up fixture manager
fixtures = FixtureManager()
# Register database fixture with module scope
fixtures.register(
"db",
lambda: connect_to_test_db(),
scope=FixtureScope.MODULE,
cleanup=lambda db: db.close()
)
# Register user fixture depending on db
fixtures.register(
"test_user",
lambda: create_user(fixtures.get("db")),
dependencies=["db"],
cleanup=lambda u: u.delete()
)
# Use in tests
def test_user_creation():
with fixtures.use("test_user") as user:
assert user.id is not Nonefrom codomyrmex.testing.generators import (
DatasetGenerator,
UUIDGenerator,
NameGenerator,
EmailGenerator,
IntegerGenerator,
BooleanGenerator,
DateGenerator
)
# Create user dataset generator
users = DatasetGenerator("users")
users.add_column("id", UUIDGenerator())
users.add_column("name", NameGenerator())
users.add_column("email", EmailGenerator())
users.add_column("age", IntegerGenerator(18, 80))
users.add_column("active", BooleanGenerator(true_probability=0.9))
users.add_column("created", DateGenerator())
# Generate 1000 test users
test_data = users.generate(rows=1000)
# Or export as CSV for external tools
csv_data = users.generate_csv(rows=1000)from codomyrmex.testing.fixtures import JSONFixtureLoader
# Load fixtures from tests/fixtures directory
loader = JSONFixtureLoader("tests/fixtures")
# Load users.json
users = loader.load("users")
# Filter and find
admins = users.filter(role="admin")
alice = users.find(name="Alice")__all__ = [
"FixtureScope",
"FixtureDefinition",
"FixtureInstance",
"FixtureManager",
"DataFixture",
"JSONFixtureLoader",
"FixtureBuilder",
]__all__ = [
"DataType",
"FieldSpec",
"Generator",
"StringGenerator",
"IntegerGenerator",
"FloatGenerator",
"BooleanGenerator",
"DateGenerator",
"EmailGenerator",
"UUIDGenerator",
"NameGenerator",
"ChoiceGenerator",
"RecordGenerator",
"DatasetGenerator",
]