Skip to main content
Version: Unreleased

Building Action Trees

Paramixel composes tests from action classes under org.paramixel.api.action. Each configurable action type is built through a Builder; terminal action types use static factory methods. The result is an immutable Action that can be nested into a larger execution tree.

See Built-in Actions and When to Use Them for the complete list of 13 built-in action subtypes.

Fixture access​

Context exposes fixture instances by type where an Instance action provides the fixture:

import org.paramixel.api.Context;
import static org.paramixel.api.action.Step.step;

var verify = step(
"verify fixture",
Context.withInstance(MyFixture.class, fixture -> fixture.verify()));

Use context.instance(Type.class) for an Optional or context.requireInstance(Type.class) when the fixture is required.

Data-driven subtrees​

Each is a utility class in org.paramixel.api.action for generating action subtrees from iterable inputs. It is not an Action subtype; it is a factory that produces action trees ready for composition.

import java.util.List;
import org.paramixel.api.action.Action;
import org.paramixel.api.action.Each;
import static org.paramixel.api.action.Sequential.sequential;
import static org.paramixel.api.action.Step.step;

var users = List.of("ada", "grace", "linus");

Action spec = Each.sequential("user checks", users,
user -> sequential("check " + user)
.child(step("load", ctx -> loadUser(user)))
.child(step("verify", ctx -> verifyUser(user))))
.build();
user checks
├── check ada
│ ├── load
│ └── verify
├── check grace
│ ├── load
│ └── verify
└── check linus
├── load
└── verify

See Data-Driven Testing for details on Each.sequential() and Each.parallel().