Testing Module - API Specification
Overview
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.
Submodules
fixtures
Test fixture management and setup utilities.
generators
Test data generation utilities.
fixtures Submodule
Classes
FixtureScope
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 scope
FixtureDefinition
Data 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
FixtureInstance
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 created
FixtureManager
Manages 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
DataFixture
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
JSONFixtureLoader
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
FixtureBuilder
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..10
Methods:
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
generators Submodule
Classes
DataType
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.PHONE
FieldSpec
Specification 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
)
Generator (Abstract Base)
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)
StringGenerator
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()
IntegerGenerator
Generates random integers.
from codomyrmex.testing.generators import IntegerGenerator
gen = IntegerGenerator(min_value=0, max_value=1000)
result = gen.generate()
FloatGenerator
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.57
BooleanGenerator
Generates random booleans with configurable probability.
from codomyrmex.testing.generators import BooleanGenerator
gen = BooleanGenerator(true_probability=0.7)
result = gen.generate()
DateGenerator
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()
EmailGenerator
Generates random email addresses.
from codomyrmex.testing.generators import EmailGenerator
gen = EmailGenerator()
result = gen.generate() # e.g., "xkjfh@example.com"
UUIDGenerator
Generates UUID-like strings.
from codomyrmex.testing.generators import UUIDGenerator
gen = UUIDGenerator()
result = gen.generate() # e.g., "a1b2c3d4-e5f6-g7h8-i9j0-k1l2m3n4o5p6"
NameGenerator
Generates random full names.
from codomyrmex.testing.generators import NameGenerator
gen = NameGenerator()
result = gen.generate() # e.g., "Alice Smith"
ChoiceGenerator
Generates random choice from a list.
from codomyrmex.testing.generators import ChoiceGenerator
gen = ChoiceGenerator(["red", "green", "blue"])
result = gen.generate() # e.g., "green"
RecordGenerator
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
DatasetGenerator
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
Usage Examples
Creating Test Fixtures
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 None
Generating Test Data
from 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)
Loading JSON Fixtures
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")
Module Exports
fixtures
__all__ = [
"FixtureScope",
"FixtureDefinition",
"FixtureInstance",
"FixtureManager",
"DataFixture",
"JSONFixtureLoader",
"FixtureBuilder",
]
generators
__all__ = [
"DataType",
"FieldSpec",
"Generator",
"StringGenerator",
"IntegerGenerator",
"FloatGenerator",
"BooleanGenerator",
"DateGenerator",
"EmailGenerator",
"UUIDGenerator",
"NameGenerator",
"ChoiceGenerator",
"RecordGenerator",
"DatasetGenerator",
]