A lightweight, flexible factory library for Elixir that makes test data generation simple and intuitive.
- 🚀 Simple Setup - Define factories with minimal boilerplate
- 🔧 Flexible Data Generation - Build structs, params, or insert directly to database
- ✅ Changeset Validation - Optional validation using your schema's changesets
- 🔄 Batch Operations - Generate multiple records at once
- 🎯 Key Transformation - Support for atom, string, and camelCase keys
- 📊 Built-in Counters - Generate unique values across test runs
defmodule MyApp.UserFactory do
use QuickFactory,
schema: MyApp.User,
repo: MyApp.Repo,
changeset: :changeset
def call(params \\ %{}) do
%{
name: "John Doe",
email: "john@example.com",
age: 25,
first_name: "John",
last_name: "Doe"
}
|> Map.merge(params)
end
end
# Build a struct
user = UserFactory.build()
#=> %User{name: "John Doe", email: "john@example.com", age: 25}
# Build with custom params
user = UserFactory.build(%{name: "Jane"})
#=> %User{name: "Jane", email: "john@example.com", age: 25}
# Generate params only (great for API testing)
params = UserFactory.build_params(%{age: 30})
#=> %{name: "John Doe", email: "john@example.com", age: 30}
# Insert to database
user = UserFactory.insert!()
# Generate multiple records
users = UserFactory.insert_many!(3)
Perfect for API testing with different key formats:
# Default: atom keys
UserFactory.build_params()
#=> %{name: "John Doe", first_name: "John", last_name: "Doe"}
# String keys
UserFactory.build_params(%{}, keys: :string)
#=> %{"name" => "John Doe", "first_name" => "John", "last_name" => "Doe"}
# CamelCase string keys (great for JSON APIs)
UserFactory.build_params(%{}, keys: :camel_string)
#=> %{"name" => "John Doe", "firstName" => "John", "lastName" => "Doe"}
Add quick_factory
to your list of dependencies in mix.exs
:
def deps do
[
{:quick_factory, "~> 0.2.0", only: :test}
]
end
- Less Magic, More Control - Explicit factory definitions that are easy to understand
- Test-Focused - Built specifically for testing scenarios
- Ecto Integration - Works seamlessly with Ecto schemas and changesets
- Lightweight - Minimal dependencies and overhead
For full documentation, visit HexDocs.
Ideas / Code taken from:
- https://github.com/theblitzapp/factory_ex with simplifications and removals.
- https://github.com/beam-community/ex_machina/blob/main/lib/ex_machina/sequence.ex - nice sequence handling