Как организовать тесты 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 из ФАР?

Я надеюсь, что приведение этого примера сделало мои вопросы более ясными. Спасибо за чтение, и я ищу хорошие советы

Author: Community, 2014-11-16

2 answers

Чувак, какой важный вопрос. :) Хорошо, давайте рассмотрим некоторые проблемы.

  1. PHPUnit Скелген проверяет неправильный путь

    Это определенно не зеркально симметрично

    Верно. Это странная (и я думаю, нерешенная) проблема пути со скелгеном.

    Просто переместите сгенерированные *Тестовые файлы в соответствующие папки.

    Тот же вопрос здесь: PHPUnit, Netbeans и Symfony2 и неправильные тесты местоположение

  2. Структура папок для вашего проекта

    Да, это структура папок для работы:

    src/
       … my code
    tests/
       … my tests 
    vendor/
       … third-party code
    
  3. Проблема с автоматической загрузкой :

    (Без композитора): ваш загрузчик живет где-то в src. Во время начальной загрузки приложения вам это потребуется, после этого будет настроена автоматическая загрузка для папки src. Все классы в папке src с этого момента загружаются автоматически.

    Теперь перейдем к тестам: во время в тестовую загрузочную программу вы включаете автозагрузчик из src и добавляете src и test. Это делает все классы в src и tests загружаемыми автоматически.

    (с композитором): Вся эта проблема не возникает, если вы работаете с композитором. У Composer есть разделы require и require-dev для определения зависимостей от поставщика. Автоматическая загрузка генерируется автоматически, вы просто включаете файл автоматической загрузки Composer и выполняете (одно включение во время начальной загрузки src и одно включение во время тестовой загрузки). Если проект установлен с зависимостями разработки, тогда они будут частью автоматической загрузки, если нет, они не появятся.

  4. Никаких намеков на PHPUnit в NetBeans

    Да, PHAR не анализируется и не извлекается, поэтому Netbeans не будет знать имена классов PHPUnit.

    Решение 1: Извлеките PHAR.

    Решение 2. Добавьте PHP с именами классов в качестве псевдонимов для руководства Netbeans. Я не знаю, есть ли кто-нибудь поблизости. Но это довольно распространенная проблема, велика вероятность, что кто-то уже создал его.

    Решение 3: Позвольте мне снова предложить Composer: просто добавьте phpunit в свой проект в качестве зависимости от require-dev. Путь к поставщику сканируется Netbeans, и имена классов будут разрешены.

 2
Author: Jens A. Koch, 2017-05-23 12:03:04

Ответ Йенса А. Коха был очень полезен. Но я хотел бы написать, как это сработало для меня.

Задача

Напишите и запустите тесты 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/

  1. Выберите пункт меню Инструменты -> Параметры,
  2. Выберите PHP и выберите PHPUnit вкладка
  3. Набор сценариев:
    • Скрипт PHPUnit: MY_PATH\phpunit-4.7.7.phar
    • МОЙ ПУТЬ\phpunit-4.7.7.phar
  4. Скрипт генератора скелетов: MY_PATH\phpunit-скелген-1.2.1.phar

2. Установите каталог для тестов

  1. Щелкните правой кнопкой мыши на названии проекта, выберите Свойства из контекстного меню
  2. Категории: Источники
    • Тестовая папка изначально пуста
    • Кнопка просмотра
    • Создайте tests каталог внутри каталога проекта и используйте его в качестве теста Папка

3. Поставщик набора тестов

  1. Щелкните правой кнопкой мыши имя проекта, выберите Свойства из контекстного меню
  2. Категории: Тестирование
    • Поставщики тестирования: проверьте PHPUnit

4. Создание тестовых классов

  1. Щелкните правой кнопкой мыши файл класса (например, Bar.php ), выберите Инструменты ->Создать тесты из контекстного меню

5. Устанавливать зависимости

  1. Щелкните правой кнопкой мыши имя проекта, выберите Композитор ->Установить (разработка) из контекстного меню

, который достигает двух целей: - создайте автозагрузчик, чтобы позволить тестовым классам использовать классы src - добавьте библиотеку PHPUnit в проект для целей подсказки

6. Установить файл начальной загрузки

Файл начальной загрузки выполняется перед тестированием. Для этого проекта vendor/autoload.php этого достаточно.

  1. Щелкните правой кнопкой мыши название проекта, выберите Свойства из контекстного меню
  2. Категории: Тестирование/PHPUnit
    • проверка Использование начальной загрузки
    • Начальная загрузка: PROJECT_MAIN_DIR\vendor\autoload.php

Структура проекта

Тестовые классы поставлены на неправильный путь

enter image description here

Я могу перемещать их вручную

enter image description here

Тесты выполняются в любом случае.

Проблемы

Пхпунит 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

 2
Author: mwloda, 2015-09-16 09:30:46