Zero-Dependency Test Layout
Rather than pull in PHPUnit or Pest, Zero CMS ships a small custom test runner. There is no root tests/ directory — every test file lives directly alongside the code it tests: component tests under src/<Component>/Tests/*Test.php (e.g. src/Core/Tests/, src/Database/Tests/), module tests under src/Modules/<Module>/Tests/*Test.php, and cross-cutting tests that don't belong to one component under src/Integration/Tests/.
Minimal Test File
<?php
// src/Modules/Blog/Tests/PostSlugTest.php
require dirname(dirname(dirname(__DIR__))) . '/Support/TestBootstrap.php'; // 3 levels for module Tests/
$post = new \App\Modules\Blog\Models\Post(['title' => 'Hello World']);
assert_test($post->slug === 'hello-world', 'Post slug should be auto-generated from title');
Execution Model
bin/test recursively scans src/ for every *Test.php file and hands each one to Zero\Support\TestRunner, which runs it in its own isolated PHP subprocess via proc_open — never sequential exec(). A small pool of TEST_TOKEN worker slots (sized to detected CPU cores, capped at 8) is reused across the queue, so several subprocesses run concurrently, each against its own isolated test database ({db}_test_{token}). [PASS]/[FAIL] lines print in completion order, not queue order, followed by a final summary box and a GRAND STATUS: SUCCESS/FAILURE banner.
Running the Suite
docker exec -w /data/misc/zero php83 bin/test