testo/testo

A lightweight PHP testing framework.

Fund package maintenance!
Boosty

Installs: 157

Dependents: 1

Suggesters: 0

Security: 0

Stars: 89

Watchers: 2

Forks: 5

Open Issues: 15

pkg:composer/testo/testo

0.7.1 2026-02-01 13:26 UTC

This package is auto-updated.

Last update: 2026-02-08 19:22:50 UTC


README

TESTO

The PHP Testing Framework You Control

Documentation Support on Boosty


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.

Get Started

Installation

composer require --dev testo/testo *

PHP Latest Version on Packagist License Total Destroys

Configuration

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\Application\Config\ApplicationConfig;
use Testo\Application\Config\FinderConfig;
use Testo\Application\Config\SuiteConfig;

return new ApplicationConfig(
    suites: [
        new SuiteConfig(
            name: 'Unit',
            location: new FinderConfig(
                include: ['tests/Unit'],
            ),
        ),
    ],
);

Running Tests

To run your tests, execute:

vendor/bin/testo

Writing Your First Test

Create a test class in the configured test directory (e.g., tests/CalculatorTest.php):

<?php

declare(strict_types=1);

namespace Tests;

use Testo\Application\Attribute\Test;
use Testo\Assert;
use Testo\Assert\ExpectException;
use Testo\Retry\RetryPolicy;

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 Assert class for assertions (same, true, false, null, contains, instanceOf, etc.)
  • Testo provides multiple attributes to extend testing capabilities (retry policies, exception handling, and more)

IDE Support

Testo comes with the IDEA plugin Testo.

Version Rating Downloads