Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Запустить PHPUnit тесты из docker контейнера через PhpStorm

#php #phpstorm #composer #docker #phpunit


Что есть:


Docker-контейнер с PHP и набором юнит-тестов. Можно запустить контейнер, и внутри
через консоль запускать любые тесты - phpunit /test/test_1.php
хостовая машина с установленным PhpStorm 9
папка с проектом, где лежат в том числе юнит-тесты. Эта папка залинкована в докер-контейнер.


Проблема:

PhpStorm удобно менеджерит тесты, и позволяет запускать локальные или удаленные тесты
(посредством SSH). Но с докером работать не умеет, не получается обьяснить IDE как
запускать тесты, лежащие в докере.

Что нужно:

Как поднастроить докер или PhpStorm, чтобы через GUI можно было запускать тесты.

Дополнения:


по ssh работает сейчас, но хотелось бы обойтись без него.
пробовал создать bash-скрипт, который проксирует все запросы в контейнер. Вот такой
скрипт docker run --rm php:cli php $@. Таким образом начинает работать команда php
-v запущенная с хостовой машины. Но тесты используют аргументы файлы. Усложнил баш-скрипт:

#!/bin/sh

args=''
for arg
do
   if [ -f $arg ]; then
        arg=/mnt$( realpath $arg )
   fi
   args="$args $arg"
done
env > /tmp/docker-env
sed -i s/idekey=.*/idekey=PHPSTORM/ /tmp/docker-env
docker run -e "PHP_IDE_CONFIG=serverName=phpunit-docker" \
   --net=host --env-file /tmp/docker-env --rm \
   -v /:/mnt -v /var/www:/var/www app php $args

Это решает несколько проблем


можно создать php.sh с этим кодом, и положить в любое место, например в /usr/local/bin,
и обращаться с ним вроде это настоящий php
phpstorm вызывая тесты создает /tmp/ide-phpunit.php который принимает env переменные
которые настраиваются в самой ide, поэтому я использую /tmp/docker-env
настройка --net=host решает все проблемы с сетью, например nslookup раньше выпадал
с ошибкой

Это не решает проблемы


явного указания idekey=PHPSTORM и PHP_IDE_CONFIG

Но всё равно PHPUnit тесты не запускаются, ругается composer


  PHP Fatal error:  Cannot redeclare    composerRequire7a368ac394ae1d2e857becf2a235ebaa()
(previously declared in    [APP_ROOT]/vendor/composer/autoload_real.php:56) in    [APP_ROOT]/vendor/composer/autoload_real.php
on line 59


Я подозреваю что это происходит потому что /tmp/ide-phpunit.php вызывает composer/autoload
для нахождения phpunit, и при запуске тесты тоже запускают этот же

    


Ответы

Ответ 1



В PhpStorm можно настроить запуск тестов через SSH. Ниже инструкция, как запустить SSH-сервер в debian/ubuntu контейнере (docker image php:cli - это debian). Зайдите в контейнер. Допустим, он называется phpapp docker exec -it phpapp bash Устанавливаем SSH-сервер apt-get update; apt-get install openssh-server Запускаем SSH-сервер. Почему-то нужно указывать полный путь. /usr/sbin/sshd Если будет ругаться, возможно, ему нужно создать какой-то каталог перед запуском mkdir /var/run/sshd Добавляем пользователя adduser test Выходим из контейнера - Ctrl+D Пробрасываем 22-й порт контейнера на какой-то из локальных портов, например, 127.0.0.1:10022 (вместо 10022 можно выбрать любое число 1025-65535). Если запускаете на Windows через VirtualBox/Vagrant/docker-machine, то пробрасывайте на 0.0.0.0:10022 и в VirtualBox настройте проброску локального порта 10022 на порт 10022 в вашем VirtualBox. Логинимся в контейнер - ssh test@127.0.0.1:10022, где test - это пользователь, которого вы создали. Устанавливать SSH в Docker считается плохим тоном, но пока в PhpStorm простая и красивая интеграция с PHPUnit (не просто консоль, а список тестов и coverage) работает только через SSH. На production так не делайте.

Ответ 2



Почему не установить phpunit на хостовую машину? зачем так переусложнять себе жизнь? Сорсы ведь на локальной машине и залинкованы внутрь докер-контейнера.Прогоняйте тесты вне докера, просто используйте аналогичную версию phpunit на хостовой машине. Это рабочий, проверенный мной вариант.

Комментариев нет:

Отправить комментарий