☁️VoltTest Cloud closed beta is now openJoin the waitlist
Skip to main content

PHPUnit Integration

Run performance tests inside your PHPUnit test suite with automatic server management and performance assertions.

Setup

Extend PerformanceTestCase instead of the standard Laravel TestCase:

<?php

namespace Tests\Performance;

use App\VoltTests\LoginTest;
use VoltTest\Laravel\Testing\PerformanceTestCase;

class LoginPerformanceTest extends PerformanceTestCase
{
public function test_login_performance(): void
{
$result = $this->runVoltTest(new LoginTest(), [
'virtual_users' => 10,
'duration' => '30s',
]);

$this->assertVTSuccessful($result);
$this->assertVTMaxResponseTime($result, 2000);
}
}

Running Tests

Execute a VoltTestCase

$result = $this->runVoltTest(new CheckoutTest(), [
'virtual_users' => 20,
'duration' => '1m',
'ramp_up' => '10s',
]);

Options

KeyTypeDefaultDescription
virtual_usersint5Number of concurrent VUs
durationstringnullTest duration (e.g., 30s, 2m)
ramp_upstringnullRamp-up time
stagesarraynullStaged load profile (overrides VUs/duration)
streamboolfalseStream output to console
http_debugboolfalseEnable HTTP debug output

Staged Load in PHPUnit

$result = $this->runVoltTest(new ApiTest(), [
'stages' => [
['duration' => '30s', 'target' => 10],
['duration' => '2m', 'target' => 10],
['duration' => '30s', 'target' => 0],
],
]);

Quick Helpers

Load Test a URL

$result = $this->loadTestUrl('http://localhost:8000/api/health', [
'virtual_users' => 50,
'duration' => '30s',
]);

$this->assertVTSuccessful($result);
$this->assertVTP95ResponseTime($result, 500);

Load Test an API Endpoint

$result = $this->loadTestApi('/api/users', 'GET', [], [
'virtual_users' => 20,
'duration' => '1m',
]);

$this->assertVTMinimumRPS($result, 100);
$result = $this->loadTestApi('/api/users', 'POST', [
'name' => 'John',
'email' => 'john@example.com',
], [
'virtual_users' => 10,
]);

Server Management

PerformanceTestCase can automatically start and stop php artisan serve for your tests.

Enable Auto Server

class ApiPerformanceTest extends PerformanceTestCase
{
protected static bool $enableServerManagement = true;
protected static ?int $preferredPort = 8000;
}

The server starts in setUpBeforeClass() and stops in tearDownAfterClass(). If the preferred port is busy, an available port is found automatically.

Custom Base URL

class ExternalApiTest extends PerformanceTestCase
{
protected function setUp(): void
{
parent::setUp();
$this->setBaseUrl('https://staging.example.com');
}
}

Debug Server

$this->debugServer(); // Print server info
$stats = $this->getServerStats(); // Get registry statistics

Complete Example

<?php

namespace Tests\Performance;

use App\VoltTests\CheckoutTest;
use VoltTest\Laravel\Testing\PerformanceTestCase;

class CheckoutPerformanceTest extends PerformanceTestCase
{
protected static bool $enableServerManagement = true;
protected static ?int $preferredPort = 8000;

public function test_checkout_under_load(): void
{
$result = $this->runVoltTest(new CheckoutTest(), [
'virtual_users' => 50,
'duration' => '2m',
'ramp_up' => '15s',
]);

$this->assertVTSuccessful($result, 95.0);
$this->assertVTAverageResponseTime($result, 500);
$this->assertVTP95ResponseTime($result, 1500);
$this->assertVTMinimumRPS($result, 20);
}

public function test_health_endpoint(): void
{
$result = $this->loadTestUrl($this->getBaseUrl() . '/api/health', [
'virtual_users' => 100,
'duration' => '30s',
]);

$this->assertVTSuccessful($result, 99.0);
$this->assertVTMaxResponseTime($result, 1000);
}
}

Run with PHPUnit:

php artisan test --filter=CheckoutPerformanceTest
# or
vendor/bin/phpunit tests/Performance/CheckoutPerformanceTest.php