Проверка работоспособности кода на множестве версий PHP

    Всем доброго времени суток. На днях понадобилось проверить работоспособность 4 вариантов кода на разных версиях PHP (в сумме около 20). Причём изначально было понятно что 4 экземплярами дело не ограничится — в будущем подобных тестов предвидится больше. Вручную всё это делать очень утомительно, поэтому было написано 2 скрипта, которыми я бы хотел с вами поделиться.

    Весь рабочий процесс с ними происходит следующим образом. Вы скачиваете в одну папку все необходимые версии PHP, распаковывайте их и собираете. Нужно чтоб получилась следующая структура:
    /some_dir/.
    /some_dir/php-5.1.6
    /some_dir/php-5.2.17
    /some_dir/php-5.3.1
    /some_dir/...

    Где php-5.1.6, php-5.2.17 и т. д. — директории с соответствующими версиями интерпретатора. Далее туда же кладёте 2 скрипта. Первый — run.php
    <?php
    # Строка, выводимая при успешном выполнении теста.
    # Должна совпадать с аналогичной строкой из test.php.
    define('TEST_DONE_STR', 'TEST DONE');
    
    define('TEST_PATH', dirname(__FILE__));
    define('CLI_PATH', 'sapi/cli/php');
    
    # Ищем директории PHP в текущей папке
    $dirs = array();
    foreach(scandir('./') as $item) {
        if(preg_match("#^php-#", $item) AND is_dir($item)) {
            if(file_exists($item . "/sapi/cli/php"))
                $dirs[] = $item;
            else 
                print "$item - php-cli not found\n";
        }
    }
    
    # В каждой из них запускаем test.php
    foreach($dirs as $dir) {
        $output = array();
        exec(TEST_PATH . "/$dir/" . CLI_PATH . " " . TEST_PATH . "/test.php", $output);
        
        print "$dir - " . (implode("", $output) == TEST_DONE_STR ? "OK" : "FAILED") . "\n";
    }
    

    Как видно из исходников, он сперва обнаружает соседствующие с ним директории PHP по сигнатуре «php-», а затем с помощью cli/php каждой из них выполняет скрипт test.php. Если после выполнения тестового скрипта в stdout падает строчка из константы «TEST_DONE_STR» — тест пройден и run.php выведет «php-*.*.* — OK». В ином случае — «php-*.*.* — FAILED».
    test.php должен содержать код, который вам необходимо проверить. Он может быть в любом виде. Главное, чтоб в случае успешной отработки выводилась вышеописанная строка. Для примера выкладываю содержимое одного из моих тестов:
    <?php
    # Строка, выводимая при успешном выполнении теста.
    # Должна совпадать с аналогичной строкой из run.php.
    define('TEST_DONE_STR', 'TEST DONE');
    
    # Код теста
    ob_start();
    include("/etc/passwd/../passwd");
    $result = ob_get_contents();
    ob_end_clean();
    
    # Проверяем верно ли завершился тест
    if(substr_count($result, 'root:'))
        print TEST_DONE_STR;
    

    Пример вывода run.php:
    user@comp:~/php$ php run.php
    php-4.3.1 — php-cli not found
    php-5.2.16 — php-cli not found
    php-5.2.17-suhosin — php-cli not found
    php-4.3.10 — OK
    php-4.4.9 — OK
    php-5.0.5 — OK
    php-5.1.6 — OK
    php-5.1.6-suhosin — FAILED
    php-5.2.0 — OK
    php-5.2.17 — OK
    php-5.2.2 — OK
    php-5.2.3 — OK
    php-5.2.4 — OK
    php-5.2.9 — OK
    php-5.3.0 — FAILED
    php-5.3.1 — FAILED
    php-5.3.10 — FAILED
    php-5.3.20 — FAILED
    php-5.3.5 — FAILED


    Надеюсь они будут вам полезны. Мне уже сэкономили кучу времени :)
    • –1
    • 7.6k
    • 8
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 8

      +16
      Статья — капитанство 80 lvl.

      Ну и
      ... scandir('./') as $item) ...
      if(preg_match("#^php-#", $item) AND is_dir($item)) ...
      

      =

      glob(__DIR__ . '/php-*', GLOB_ONLYDIR))
      
        +2
        Тестом это сложно назвать… вот если бы для каждого PHP был свой phpunit, которыми по очереди запускались именно тесты проекта, то это уже тестирование.
        правда тут окажется, что проще было поставить какой-нибудь jenkins
          0
          Вот кстати то, что мне давно уже надо сделать для собственного проекта, но всё что то руки не доходят… надо взять виртуалочку, насобирать туда разных версий и правда потестить.
            0
              +1
              Это, конечно же, хорошо, но только вот если нужно будет проверить 100k файлов, то тогда что, будете по одному загружать на сайт?
                0
                отличная штука, спасибо!
                  +1

                  Only users with full accounts can post comments. Log in, please.