Проверка работоспособности PHP 5 проектов: практические руководства

Раздел: Разработка на PHP -> Тестирование версий PHP

Основные способы проверки 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, где многие расширения не включены по умолчанию.

Тестирование PHP 5 - comments

En
Php 5 test (php)