Инструкция по применению. Для примера будем использовать Travis CI
и пробник PHPStorm
а, так как для него я нашёл статью о
тестировании с помощью Docker
а.
Последнее оказалось полезным при создании первичного набора тестов с поиском ошибок в самих тестах.
Окружение для докера было взято такое же, как то, в котором будет работать код.
Используем phpunit.xml.dist
для определения поведения PHPUnit
- как в контейнере докера так и на travis-ci.org
<?xml version="1.0" encoding="utf-8"?>
<phpunit bootstrap="./tests/bootstrap.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
stopOnFailure="false">
<testsuites>
<testsuite name="Test Suite">
<directory>./tests</directory>
</testsuite>
</testsuites>
</phpunit>
Также в .gitignore
добавлен phpunit.xml
в котором локально можно переопределить некоторые моменты, если понадобится.
Указаны следующие моменты - начальная загрузка ./tests/bootstrap.php
и рабочая папка ./tests
С указанным выше phpunit.xml.dist
будут просмотрены все файлы, заканчивающиеся на *Test.php
, и использованы все
найденные в этих файлах классы, названия которых заканчиваются на *Test
.
Примерно оценить список классов, которые будут задействованы, можно так:
find tests/ -type f -name *Test.php -print0 |
xargs -0 grep --color 'class .*Test '
Самый простой вид теста представляет собой...
Метод класса, начинающийся на test
,
в классе, заканчивающемся на Test
,
и наследующем от \PHPUnit\Framework\TestCase
.
<?php
use PHPUnit\Framework\TestCase;
class ExampleTest extends TestCase {
public function testExample() {
$this->assertTrue(true);
}
}
Воспользумся примером официльных расширений, например yiisoft/yii2-redis
. Скопируем и изменим следующие файлы:
tests/bootstrap.php
- начальная загрузка. Тут определяем все константы окружения тестов, подключаем автозагрузчикcomposer
а и вызываем "главный файл" фреймворка;
добавляем несколько алиасов: на папкуsrc
соотносим алиас с именем расширения - как если бы использовалось из приложения;
добавляем алиас соответствующий неймспейсу для тестов, например@bscheshirwork/redis/tests/unit
(В оригинале используетсяyiisoftunit/extensions/gii
для классов тестов):
Yii::setAlias('@yiiunit/extensions/gii', __DIR__); // для тестов
Yii::setAlias('@yii/gii', dirname(__DIR__)); // алиас такой же, как после парсера вендоров
-
tests/compatibility.php
- Нужен для обратной совместимости PHPUnit (в 6й версии поломали BC) -
tests/TestCase.php
- Основной класс, определяющий как будут создаватсяyii2
приложения.
От него наследуются тесты как непосредственно, так и с использованием ещё одного уровня вложения.
Для TestCase
не забываем использовать выбраный для тестов неймспейс.
В качестве примера послужит тест соединения: tests/RedisConnectionTest.php
- его также помещаем в выбраный немспейс для тестов.
Конфиурация представлена двумя файлами tests/data/config.php
а также добавленного в .gitignore
tests/data/config.local.php
, переопределяющего элементы для использования в локальном тестировании посредством Docker
а
<?php
$config['databases']['redis']['hostname'] = 'redis';
Выжимка из документации, адаптированная, тезисная.
-
Необходимо завести аккаунт на
https://travis-ci.org/
(так как у насopen source
). Аккаунт создаём, естественно, используя github oauth, так как будем использовать интеграцию. При таком методе создания все хуки создаются автоматически. -
Указать какой нужен репозиторий, например
bscheshirwork/yii2-resis-session
-
Добавить инструкции в файл для тревиса в файле
.travis.yml
.
Данный файл был взят от родительскогоyiisoft/yii2-кувшы
, т.к. тестироватся будет (в том числе и) надстройки над gii
language: php
php:
- 7.1
- 7.2
sudo: false
services:
- redis-server
# cache vendor dirs
cache:
directories:
- $HOME/.composer/cache
- $HOME/.bin
install:
- travis_retry composer self-update && composer --version
- export PATH="$HOME/.composer/vendor/bin:$PATH"
- travis_retry composer install --prefer-dist --no-interaction
script:
- phpunit --verbose $PHPUNIT_FLAGS
Отличия: тесты на php 7 и выше; Удалено всё лешнее.
Настройки через файл закончены, можно проверить.
-
Первый запуск тестов необходимо провести обязательно
push
ем (требованияtravis-ci.org
). -
Профит.
При настройках по умолчанию репозитория наtravis-ci.org
будут проверятся как главная так и остальные ветки.
Эту и другие настройки можно поменять на сайте, выбрав шестерёнку около репозитория.
Вы можете просматривать все билды с своей страницы travis-ci.org. Вывод будет наподобие такого:
bscheshirwork / yii2-redis-session
build:passed
Current
Branches
Build History
Pull Requests
master some fix
Commit 0975aa6
Compare bb8dd6d..0975aa6
Branch master
bscheshirwork authored and committed
#2 passed
Ran for 48 sec
Total time 1 min 30 sec
about 6 hours ago
Отлично, но что делать, если тесты не запускаются с полпинка? Лучше, конечно, иметь возможность проверить сначала локально.
По этой ссылке размещена инструкция для владельцев
PHPStorm, попробуйте её.
Вольный перевод далее (некоторые места в новых версиях отличаются от опубликованого)
Пока что же пример файла композиции (с комментариями), который будет использоватся:
# Local run unit tests
# for docker-compose CLI like this manual https://blog.jetbrains.com/phpstorm/2016/11/docker-remote-interpreters/
# run directly:
# docker-compose -f ./tests/docker-compose.yml run --rm --entrypoint bash php
# and run `composer install` before first time use
version: '2'
services:
php:
image: bscheshir/codeception:php7.2.1-fpm-alpine-yii2 #contain phpunit
volumes:
- ..:/var/www/html #src and tests shared to container
- ~/.composer/cache:/root/.composer/cache
environment:
TZ: Europe/Moscow
XDEBUG_CONFIG: "remote_host=192.168.0.83 remote_port=9002 remote_enable=On"
PHP_IDE_CONFIG: "serverName=codeception"
depends_on:
- redis
redis:
image: redis:4.0.7-alpine
restart: always
ports:
- "6379"
- Вы можете добавить новый интерпритатор, выбрав в настройках (File->Settings...)
Languages & Frameworks
, главную веткуPHP
(не раворачивая), на этой странице кликните кнопку […] после выпадающего спискаCLI interpreter
.
После чего нажмите зелёный плюс [+] и выбирете удалённый (From Docker, Vagrat, VM, Remote).
На данной странице выберетеDocker
либоDocker-compose
В появившемия меню, во-первых, выберете подключение к службе Docker, к примеру это будет unix socket
.
Уже после этого будет появлятся встроенные инструменты для работы с докером (по умолчанию - внизу, возле отладки, контроля версий, терминала)
Тепрь выберете образ, который будет использоватся для создания контейнера с PHP и, при необходимости, путь к установке PHP
Для образа, основаного на официальном docker/php это было не нужно (просто использовать php
).
Вместо выбора образа удобно использовать файл композиции (приведён выше, добавлен в старших относительно инструкции версиях),
так как его можно собрать из аналогичного - для работы с приложениями на основе шаблонов yii2, к примеру от
bscheshirwork/docker-yii2-app-advanced-redis
Указываем расположение ./tests/docker-compose.yml
- будет взято относительно корня проекта.
Нажатие стрелочек "обновить" рядом с PHP executable
= php
даст информацию о версии php. Применяем изменения и следуем далее.
PHPStorm
создаст свой собственный контейнер на основании предоставленных данных, названый набодобие /phpstorm_helpers_PS-172.3968.35
Для проверок также будут созданы контейнеры /tests_php_run_1
../tests_php_run_n
либо /c178145a759e_tests_php_1
которые, как не странно, копятся.
Это отлично видно в этом самом встроенном инструменте контроля докера.
- Далее в опциях (File->Settings...) находим фреймворки тестирования
Languages & Frameworks
,PHP
веткаTest Frameworks
В ней добавляемPHPUnit by remote interpreter
, используя кнопку зелёного плюса [+] и выпадающее меню.
Указываем тип, созданный в предыдущем пункте, переходем к следующим настройкам:
Важно! Указываем путь ВНУТРИ контейнера к тому месту, где установлен PHPUnit либо к автозагрузчику composer
а,
его содержащего. Для используемого образа этот путь равен /repo/vendor/autoload.php
Применяем изменения и возвращаемся в главное окно IDE.
- Настройка запуска осуществляется через меню (Run->Edit configurations...)
Вы можете добавить новую конфигурацию используя кнопку плюс [+] и выбрав PHPUnit (в конце списка).
В данном меню выберем необходимый нам файл конфигурации для тестов. Выберем использование альтернативного файла конфигурации соответствующей галочкой В данном меню выбор происходит относительно машины разработчика, не относительно контейнера.
Применяем изменения и возвращаемся в главное окно IDE.
Наконец-то можно подтвердить изменения и запустить тесты с помощью кнопки с изображением зелёного треугольника...
Но сначала нужно установить зависимости того кода, который мы будем тестировать. Для установки зависимостей composer
а
воспользуемся всё тем же образом и композицеей, которые использовали для создания образа тестов.
Запустим в контейнере composer update
:
$ docker-compose -f ./tests/docker-compose.yml run --rm --entrypoint composer php update -vvv
Напоминаю, что ими будет считатся методы, начинающиеся на test
классов-наследников \PHPUnit\Framework\TestCase
в файлах *Test.php
папки tests
.
Все они будут выполнены по порядку.
Например, вывод может выглядить так:
Testing started at 13:10 ...
docker-compose://[/home/dev/projects/yii2-redis-session/tests/docker-compose.yml]:php/php /repo/vendor/phpunit/phpunit/phpunit --configuration /var/www/html/phpunit.xml.dist --teamcity
PHPUnit 6.5.1 by Sebastian Bergmann and contributors.
Time: 108 ms, Memory: 8.00MB
OK (26 tests, 52 assertions)
Process finished with exit code 0