php tests/run.php, optionally with a filter. A test file returns an array of name => callable and passes if it does not throw. Clean up what you create, in a finally.
php tests/run.php            # everything
php tests/run.php Gallery    # just files matching Gallery

A file in tests/Modules/ returns an array:

return [
    'a draft is not live' => static function (): void {
        assertFalse($service->isLive($draft));
    },
];

Helpers are assertTrue, assertFalse, assertSame and assertThrows.

🚨 Tests run against a real database and share it. Mark everything you create with a distinctive prefix, and clean up in a finally so a failing assertion does not leave rows behind for the next test to trip over.

🚨 Do not depend on ambient data. A test that counts rows matching widget-person also matched widget-person-name, and passed only while the site had fewer than fifteen members. Importing a real site broke it.

Sign in to say whether this helped.