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().