Как организовать тесты PHPUnit и автоматическую загрузку с помощью IDE NetBeans
Существуют правила для автоматической загрузки (http://www.php-fig.org/psr/psr-0 /) и тестирование PHPUnit (https://phpunit.de/manual/current/en/organizing-tests.html ). По отдельности их легко реализовать, но их объединение - нет.
Я также прочитал тему рекомендации PHPUnit по организации тестов, но применение ответа для меня не очевидно. При написании собственного проекта у меня возникло несколько проблем, которые, вероятно, имеют одинаковое происхождение в коде организация. Жаль, что у меня нет рецептов для действительно простого примера. Поэтому я делаю свой вопрос довольно большим.
Пример проекта
Я использую IDE NetBeans 7.4, потому что она поддерживает PHPUnit, SVN и Doxygen (но у меня нет опыта использования этой IDE).
Проект Свойства являются
- Папка проекта : C:\xampp\htdocs\myapps\PhpProject1
- Исходная папка : C:\xampp\htdocs\myapps\PhpProject1
- Тестовая папка : C:\xampp\htdocs\myapps\PhpProject1\tests
Есть первая проблема. NetBeans блокирует зеркальную структуру src/тестов с самого начала. Нет кнопки Обзор для Исходной папки. Тестовая папка должна отличаться от исходной папки .
Я использую PHPUnit и skelgen из файлов PHAR, расположенных за пределами проект. (Инструменты->Параметры->PHP/PHPUnit)
- Скрипт PHPUnit: C:\xampp\phar\phpunit.phar
- Сценарий генератора скелетов: C:\xampp\phar\phpunit-skelgen-1.2.1.phar
У меня есть следующая структура файлов в каталоге проекта
index.php
src/
Client.php
srcAutoload.php
MyPack/
Foo/
Bar.php
Quu/
Baz.php
Где src
не является пространством имен, так как
- файл
src/MyPack/Foo/Bar.php
содержит классMyPack\Foo\Bar
- файл
src/MyPack/Quu/Baz.php
содержит классMyPack\Qoo\Baz
- файл
src/Client.php
содержит классClient
srcAutoload.php
содержит измененную реализацию автоматической загрузки PSR-0 из https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md . Разница в том, что перед выполнением require()
имя файла PSR-0 имеет префикс src/
$fileName = 'src' . DIRECTORY_SEPARATOR . $fileName;
Проблема с генерацией тестов и автоматической загрузкой
Я использовал Инструменты/Создание тестов (из контекстного меню) для классов Bar
и Baz
, и в итоге я получил следующую структуру
index.php
src/
Client.php
srcAutoload.php
MyPack/
Foo/
Bar.php
Quu/
Baz.php
tests/
src/
BarTest.php
BazTest.php
MyPack/
Foo/
Quu/
Что определенно не является зеркально симметричным. Более того, сгенерированные тесты не знают, как загружать классы, которые они тестируют.
Fatal error: Class 'MyPack\Foo\Bar' not found in C:\xampp\htdocs\myapps\PhpProject1\tests\src\BarTest.php on line 20
Мой обходной путь для автоматической загрузки
Как указывалось ранее, рабочий каталог тестировщика отличается от рабочего каталога проекта. Таким образом, загрузчик для тестирования должен создать другое полное имя файла. Я продублировал автозагрузчик PSR-0, сохранил его как tests/srcAutoloadFromTests.php
и добавил еще один префикс
/// after PSR-0 implementation code
/// I have PSR-0 $fileName
/* Escaping from tests subfolder by "../" prefix*/
$fromTests = '..' . DIRECTORY_SEPARATOR;
/* Prefixing full filename with "src/" */
$fileName = $fromTests . 'src' . DIRECTORY_SEPARATOR . $fileName;
if (is_file($fileName)) {
require $fileName;
}
После этого я добавил Использовать начальную загрузку (Проект Свойства ->Тестирование/PHPUnit). Файл tests/bootstrap.php
содержит:
require_once 'srcAutoloadFromTests.php';
Это решение заставляет PHPUnit выполнять тесты, но выглядит для меня уродливо.
Более конкретные вопросы
Почему зеркальное отображение src/
в tests/
не помогает при автоматической загрузке?
Я вручную создал зеркальную структуру, создав правильные папки и переместив файлы:
index.php
src/
Client.php
srcAutoload.php
MyPack/
Foo/
Bar.php
Quu/
Baz.php
tests/
bootstrap.php
srcAutoloadFromTests.php
MyPack/
Foo/
BarTest.php
Quu/
BazTest.php
В соответствии с https://phpunit.de/manual/current/en/organizing-tests.html PHPUnit может автоматически обнаруживать и запускать тесты путем рекурсивного обхода каталога тестов. Это не работает для меня. Без моего srcAutoloadFromTests.php
я получаю ту же ошибку, что и для прежней незеркальной структуры.
Fatal error: Class 'MyPack\Foo\Bar' not found in C:\xampp\htdocs\myapps\PhpProject1_1\tests\MyPack\Foo\BarTest.php on line 20
Как насчет дублирования кода автоматической загрузки
Поскольку NetBeans не позволяет использовать исходную папку в качестве тестовой папки, у меня должно быть два загрузчика для одного и того же класса. Я не уверен, что это хорошая практика.
Автоматическая загрузка не должна беспокоить других программистов работаю над одним и тем же проектом. Я ищу что-то более общее.
Кроме того, в будущем я мог бы использовать сторонний код. Будут ли их автопогрузчики также нуждаться в дублировании?
Должны ли папки src/
и tests/
быть верхнего уровня, как vendor/
Некоторое время назад я изучал правила автоматической загрузки. Теперь я узнаю, что PSR-0 помечен как устаревший В соответствии с PSR-4 src/
и tests/
должен быть помещен где-то в середине путь.
Но существует практика помещать сторонний код в папку верхнего уровня vendor/
. Не следует ли размещать папки src/
и tests/
на одном уровне.
src/
… my code
tests/
… my tests
vendor/
… third-party code
Это делает всю структуру более в стиле PSR-0.
Никаких намеков на PHPUnit в NetBeans
При написании кода Baztest и BARTEST среда IDE NetBeans не содержит намеков на методы PHPUnit
, хотя оба класса расширяются \PHPUnit_Framework_TestCase
namespace MyPack\Foo;
class BarTest extends \PHPUnit_Framework_TestCase { /* ... */ }
Это потому, что я использую PHPUnit из ФАР?
Я надеюсь, что приведение этого примера сделало мои вопросы более ясными. Спасибо за чтение, и я ищу хорошие советы
2 answers
Чувак, какой важный вопрос. :) Хорошо, давайте рассмотрим некоторые проблемы.
-
PHPUnit Скелген проверяет неправильный путь
Это определенно не зеркально симметрично
Верно. Это странная (и я думаю, нерешенная) проблема пути со скелгеном.
Просто переместите сгенерированные *Тестовые файлы в соответствующие папки.
Тот же вопрос здесь: PHPUnit, Netbeans и Symfony2 и неправильные тесты местоположение
-
Структура папок для вашего проекта
Да, это структура папок для работы:
src/ … my code tests/ … my tests vendor/ … third-party code
-
Проблема с автоматической загрузкой :
(Без композитора): ваш загрузчик живет где-то в
src
. Во время начальной загрузки приложения вам это потребуется, после этого будет настроена автоматическая загрузка для папкиsrc
. Все классы в папкеsrc
с этого момента загружаются автоматически.Теперь перейдем к тестам: во время в тестовую загрузочную программу вы включаете автозагрузчик из
src
и добавляетеsrc
иtest
. Это делает все классы вsrc
иtests
загружаемыми автоматически.(с композитором): Вся эта проблема не возникает, если вы работаете с композитором. У Composer есть разделы require и require-dev для определения зависимостей от поставщика. Автоматическая загрузка генерируется автоматически, вы просто включаете файл автоматической загрузки Composer и выполняете (одно включение во время начальной загрузки src и одно включение во время тестовой загрузки). Если проект установлен с зависимостями разработки, тогда они будут частью автоматической загрузки, если нет, они не появятся.
-
Никаких намеков на PHPUnit в NetBeans
Да, PHAR не анализируется и не извлекается, поэтому Netbeans не будет знать имена классов PHPUnit.
Решение 1: Извлеките PHAR.
Решение 2. Добавьте PHP с именами классов в качестве псевдонимов для руководства Netbeans. Я не знаю, есть ли кто-нибудь поблизости. Но это довольно распространенная проблема, велика вероятность, что кто-то уже создал его.
Решение 3: Позвольте мне снова предложить Composer: просто добавьте phpunit в свой проект в качестве зависимости от require-dev. Путь к поставщику сканируется Netbeans, и имена классов будут разрешены.
Ответ Йенса А. Коха был очень полезен. Но я хотел бы написать, как это сработало для меня.
Задача
Напишите и запустите тесты PHPUnit для PHP-проекта с помощью IDE NetBeans 7.4.
Проект
Структура проекта
composer.json
index.php
src/
Client.php
MyPack/
Foo/
Bar.php
Где
-
src/Client.php
содержит класс, определенный в глобальном пространстве имен -
src/MyPack/Foo/Bar.php
содержит класс, определенный в пространстве именMyPack\Foo
-
composer.json
объявляет требования, т. е. PHPUnit, PHPUnit Генератор скелетов и автоадаптеры для классов, определенных в каталогахsrc/
иtests/
composer.json
{
"name": "vendor/php-project-with-tests",
"autoload": {
"psr-4": {
"": ["src/", "tests/"]
}
},
"require": {},
"require-dev": {
"phpunit/phpunit": "4.7.7",
"phpunit/phpunit-skeleton-generator": "2.0.1"
}
}
Шаги
1. Набор инструментов
Сообщите NetBeans, где содержится PHPUnit. Я использую файлы PHAR, загруженные с https://phar.phpunit.de/
- Выберите пункт меню Инструменты -> Параметры,
- Выберите PHP и выберите PHPUnit вкладка
- Набор сценариев:
- Скрипт PHPUnit: MY_PATH\phpunit-4.7.7.phar МОЙ ПУТЬ\phpunit-4.7.7.phar
- Скрипт генератора скелетов: MY_PATH\phpunit-скелген-1.2.1.phar
2. Установите каталог для тестов
- Щелкните правой кнопкой мыши на названии проекта, выберите Свойства из контекстного меню
-
Категории: Источники
- Тестовая папка изначально пуста
- Кнопка просмотра
- Создайте
tests
каталог внутри каталога проекта и используйте его в качестве теста Папка
3. Поставщик набора тестов
- Щелкните правой кнопкой мыши имя проекта, выберите Свойства из контекстного меню
-
Категории: Тестирование
- Поставщики тестирования: проверьте PHPUnit
4. Создание тестовых классов
- Щелкните правой кнопкой мыши файл класса (например, Bar.php ), выберите Инструменты ->Создать тесты из контекстного меню
5. Устанавливать зависимости
- Щелкните правой кнопкой мыши имя проекта, выберите Композитор ->Установить (разработка) из контекстного меню
, который достигает двух целей: - создайте автозагрузчик, чтобы позволить тестовым классам использовать классы src - добавьте библиотеку PHPUnit в проект для целей подсказки
6. Установить файл начальной загрузки
Файл начальной загрузки выполняется перед тестированием. Для этого проекта vendor/autoload.php этого достаточно.
- Щелкните правой кнопкой мыши название проекта, выберите Свойства из контекстного меню
-
Категории: Тестирование/PHPUnit
- проверка Использование начальной загрузки
- Начальная загрузка: PROJECT_MAIN_DIR\vendor\autoload.php
Структура проекта
Тестовые классы поставлены на неправильный путь
Я могу перемещать их вручную
Тесты выполняются в любом случае.
Проблемы
Пхпунит 4.8 не работает
PHPUnit версий 4.8.0 и 4.8.6 не работает. Я получаю сообщение
unrecognized option --run
Поэтому я должен использовать PHPUnit 4.7.7
Генератор скелетов PHPUnit 2.0.1 не работает
Генератор скелетов PHPUnit 2.0.1 не может генерировать тесты. Я получаю сообщение [Исключение недопустимого аргумента] Запятые "Mypack\Foo\Bar" не определены
Поэтому я должен использовать генератор скелетов PHPUnit 1.2.1