Иногда возникает ситуация, когда необходимо убедиться, что созданный Вами код будет одинаково корректно работать в разных версиях окружения. Ниже я изложу простой вариант решения этой проблемы с помощью Docker. В наш прогрессивный век для решения этой проблемы прекрасно подойдет Travis. Но таки если есть необходимость сделать локальный прогон тестов, то читаем дальше.
PHPUnit
Для начала нужно понять, что для прогона тестов нам понадобится версия PHPUnit, которая однозначно будет работать на любой версии php от 5.3 до 7.0, такой версией на данный момент является 3.7.*
Соответственно в composer.json стоит добавить именно эту версию
"require-dev": {
"phpunit/phpunit": "3.7.*"
},
...
Docker
Чтобы не городить зоопарк из версий php на рабочей машине воспользуемся контейнерами. К черту подробности, вот сниппет:
echo "$(tput setaf 16)$(tput setab 2)Run test for PHP 5.4$(tput sgr 0)"
docker run --rm -v "$PWD":/opt -w /opt php:5.4 php bin/phpunit
echo "$(tput setaf 16)$(tput setab 2)Run test for PHP 5.5$(tput sgr 0)"
docker run --rm -v "$PWD":/opt -w /opt php:5.5 php bin/phpunit
echo "$(tput setaf 16)$(tput setab 2)Run test for PHP 5.6$(tput sgr 0)"
docker run --rm -v "$PWD":/opt -w /opt php:5.6 php bin/phpunit
echo "$(tput setaf 16)$(tput setab 2)Run test for PHP 7.0$(tput sgr 0)"
docker run --rm -v "$PWD":/opt -w /opt php:7.0 php bin/phpunit
Этот сниппет можно закинуть в $PATH и вызывать в директории с тестируемым кодом.
Ну а теперь немного подробностей. Собственно в сниппете последовательно создаются контейнеры с необходимой версией php, которые после вызова phpunit благополучно удаляются из системы благодаря ключу —rm. Данный подход безусловно хорош тем, что после прогона тестов в системе не останется никакого мусора, ну за исключением образов, которые будут скачаны при первом запуске.
Я намеренно не затрагиваю вопрос установки Docker, так как в сети и без того полно статей на эту тему, впрочем контейнерная виртуализация тема довольно обширная и интересная, так что to be continued…