Проверка работоспособности PHP 5 проектов: практические руководства
Основные способы проверки PHP 5 кода
Как организовать среду для тестирования PHP 5 изолированно от основной системы?
Наиболее эффективное решение - использование Docker с официальным образом PHP 5.6 и запуск тестов в контейнере. Это позволяет избежать конфликтов версий и быстро переключаться между разными версиями.
# Dockerfile для тестирования на PHP 5.6
FROM php:5.6-cli
RUN curl -L -o /usr/local/bin/phpunit https://phar.phpunit.de/phpunit-5.7.phar && chmod +x /usr/local/bin/phpunit
COPY . /app
WORKDIR /app
CMD ["phpunit", "--colors"]
Пояснение шагов:
- Берётся официальный образ PHP 5.6 CLI.
- Устанавливается PHPUnit версии 5.7, совместимый с PHP 5.6.
- Код копируется в контейнер и указывается рабочая директория.
- Команда запускает юнит-тесты.
Типичные проблемы:
- Версия PHPUnit должна строго соответствовать версии PHP: для PHP 5.6 - PHPUnit 5.7, для PHP 5.5 - 4.8. Использование более новой версии вызовет ошибку
Call to undefined method .... - Отсутствие расширений (например, PDO, MySQL) в образе - требуется добавлять их через
docker-php-ext-install. - Различие в часовых поясах или настройках
php.ini- лучше примонтировать свой конфиг.
Как протестировать совместимость с PHP 5 на CI сервере?
Использование матрицы версий в Travis CI или GitHub Actions позволяет запускать тесты одновременно на нескольких версиях PHP. Для PHP 5.6 необходимо указать старый дистрибутив Ubuntu (например, Xenial или Bionic).
# .travis.yml для PHP 5.6
language: php
php:
- 5.6
dist: xenial
before_install:
- composer self-update --1
- composer install
script:
- vendor/bin/phpunit
Цель: проверка совместимости при пул-реквестах. Подходит для open-source проектов.
В Travis CI образы для PHP 5.6 могут быть недоступны на новых дистрибутивах. Используйте dist: trusty или Xenial. Также Composer версии 2 может не поддерживаться, поэтому self-update --1 обязателен.
Как использовать SimpleTest для юнит-тестирования PHP 5?
SimpleTest - один из старейших фреймворков, поддерживающий PHP 5. Он прост и не требует установки через Composer.
require_once 'simpletest/autorun.php';
class TestCalculator extends UnitTestCase {
public function testSum() {
$calc = new Calculator();
$this->assertEqual(4, $calc->sum(2, 2));
}
}
SimpleTest не обновляется с 2014 года, нет поддержки mock-объектов и продвинутых ассертов. Для больших проектов лучше выбрать PHPUnit.
Как выполнить ручное функциональное тестирование PHP 5?
Написание простого скрипта, который эмулирует запросы к страницам и проверяет вывод.
<?php
$_SERVER['REQUEST_URI'] = '/test.php';
$_SERVER['REQUEST_METHOD'] = 'GET';
ob_start();
include 'app.php';
$output = ob_get_clean();
if (strpos($output, 'Ожидаемый текст') !== false) {
echo "Тест пройден\n";
} else {
echo "Тест не пройден\n";
}
?>
Цель: быстрая проверка страниц без установки дополнительных инструментов. Подходит для небольших проектов.
Отсутствие автоматизации и изоляции: переменные окружения могут перекрываться, глобальное состояние влияет на тесты. Рекомендуется использовать это только для разовых проверок.
Как проверить совместимость кода с PHP 5 без запуска тестов?
Статический анализатор PHPStan или PHPLint с конфигурацией под PHP 5. Например, PHPStan в режиме совместимости.
composer require --dev phpstan/phpstan:0.12.100
vendor/bin/phpstan analyse src --level=0 --php-version=50600
Цель: выявить использование неподдерживаемого синтаксиса (например, скалярные типы, declare(strict_types)) до выполнения тестов.
Старые версии PHPStan не обновляются, новые могут не поддерживать флаг --php-version. Альтернатива - использование php -l для синтаксической проверки.
Расширенные примеры тестирования PHP 5
Пример 1: Тестирование класса с использованием mock-объектов в PHPUnit 5.7
<?php
use PHPUnit\Framework\TestCase;
class UserServiceTest extends TestCase {
public function testCreateUserSavesToDatabase() {
$mockDb = $this->getMockBuilder('Database')
->setMethods(['save'])
->getMock();
$mockDb->expects($this->once())
->method('save')
->with($this->anything())
->willReturn(true);
$service = new UserService($mockDb);
$result = $service->createUser(['name' => 'Alice']);
$this->assertTrue($result);
}
}
?>
PHPUnit 5.7.27 by Sebastian Bergmann. . 1 / 1 (100%) Time: 0.01 seconds, Memory: 4.00MB OK (1 test, 2 assertions)
Пояснение: PHPUnit 5 использует PHPUnit\Framework\TestCase, а не PHPUnit_Framework_TestCase. Метод getMockBuilder позволяет создавать заглушки без указания конструктора.
Пример 2: Тестирование базы данных с SQLite в памяти (PHP 5)
<?php
class DatabaseTest extends PHPUnit_Extensions_Database_TestCase {
private static $pdo;
public function getConnection() {
if (self::$pdo === null) {
self::$pdo = new PDO('sqlite::memory:');
}
return $this->createDefaultDBConnection(self::$pdo, ':memory:');
}
public function getDataSet() {
return $this->createFlatXMLDataSet('data/users.xml');
}
public function testCountUsers() {
$this->assertEquals(2, $this->getConnection()->getRowCount('users'));
}
}
?>
PHPUnit ... OK (1 test, 1 assertion)
Для работы требуется расширение php_pdo_sqlite. XML датасет должен быть в формате <dataset><table name="users"><column>id</column>...</table></dataset>.
Пример 3: Использование phpt-тестов (для расширений PHP)
--TEST--
Test strlen() behavior
--FILE--
<?php
echo strlen("hello");
?>
--EXPECT--
5
Запуск: php -r run-tests.php tests/. phpt-тесты встроены в PHP и позволяют тестировать функции без фреймворка.
Пример 4: Тестирование функциональности curl на PHP 5 без установки расширения
<?php
if (!function_exists('curl_init')) {
die('cURL extension not available');
}
$ch = curl_init('http://example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
if ($data === false) {
echo 'cURL error: ' . curl_error($ch);
} else {
echo 'Success: ' . strlen($data) . ' bytes';
}
curl_close($ch);
?>
Success: 1256 bytes
Проверка наличия функции перед использованием - обязательное условие для PHP 5, где многие расширения не включены по умолчанию.