The PHP Testing Framework You Control
Testo is an extensible testing framework built on a lightweight core with a middleware system. It gives you full control over your testing environment while keeping the familiar PHP syntax you already know.
composer require --dev testo/testo *By default, if no configuration file is provided, Testo will run tests from the tests folder.
To customize the configuration, create a testo.php file in the root of your project:
<?php
declare(strict_types=1);
use Testo\Config\ApplicationConfig;
use Testo\Config\SuiteConfig;
use Testo\Config\FinderConfig;
return new ApplicationConfig(
suites: [
new SuiteConfig(
name: 'Unit',
location: new FinderConfig(
include: ['tests/Unit'],
),
),
],
);To run your tests, execute:
vendor/bin/testoCreate a test class in the configured test directory (e.g., tests/CalculatorTest.php):
<?php
declare(strict_types=1);
namespace Tests;
use Testo\Assert;
use Testo\Attribute\Test;
use Testo\Attribute\RetryPolicy;
use Testo\Attribute\ExpectException;
final class CalculatorTest
{
#[Test]
public function dividesNumbers(): void
{
$result = 10 / 2;
Assert::same(5.0, $result);
Assert::notSame(5, $result); // Types matter!
}
#[Test]
#[RetryPolicy(maxAttempts: 3)]
public function flakyApiCall(): void
{
// Retries up to 3 times if test fails
$response = $this->makeExternalApiCall();
Assert::same(200, $response->status);
}
#[Test]
#[ExpectException(\RuntimeException::class)]
public function throwsException(): void
{
throw new \RuntimeException('Expected error');
}
}What to note:
- Use the
#[Test]attribute to mark test methods - Test classes don't need to extend any base class
- Use
Assertclass for assertions (same,true,false,null,contains,instanceOf, etc.) - Testo provides multiple attributes to extend testing capabilities (retry policies, exception handling, and more)
Testo comes with the IDEA plugin Testo.