Меню

Php движок для тестов



Как сделать тестирование на сайте

Как сделать тестирование на сайте

В сегодняшней статье собираюсь поведать, как сделать тестирование на сайте. Данное тестирование будет аналогично тому, которое имеется на данном сайте, правда, в упрощённом виде. Сразу говорю, если Ваши знания по PHP и MySQL стремятся к нулю, то можете не читать, а лучше поищите в Интернете готовые скрипты тестов. Для тех же, кто обладает необходимым минимумом, а также хочет узнать, как реализуется тестирование на сайте, я и написал данную статью.

Привожу алгоритм, который Вам потребуется уже преобразовать в PHP+MySQL:

  1. Создать таблицу с тестами. Здесь достаточно следующих полей: id (уникальный идентификатор), title (название теста), description (описание теста). Можете также добавить количество прошедших данный тест и средний балл. Здесь всё элементарно, и Вы должны справиться с этим без проблем.
  2. Создать таблицу с вопросами. Здесь нужны следующие поля: id (уникальный идентификатор), test_id (id теста, к которому принадлежит данный вопрос), title (текст вопроса), variant_1 (текст варианта 1), variant_2 (текст варианта 2), correct (правильный ответ). Здесь Вы можете указывать любое количество вариантов, в данном случае, я поставил 2 варианта. В поле «correct» должно стоять число с правильным ответом, например, «1«.
  3. При запуске теста необходимо записать в сессию id тех вопросов, на которые будет отвечать пользователь. Для этого извлеките из базы любое количество вопросов (например, 10 случайных вопросов для выбранного теста) и запишите их id в сессию пользователя. Здесь Вам необходимо записать в сессию массив, где ключами будут id вопросов, а в значении по умолчанию пустая строка. А в будущем будет идти тот ответ, который дал пользователь.
  4. Вывести первый вопрос из массива, который не имеет ответа (то есть значение равно пустой строке).
  5. Принять от пользователя ответ и записать в массив с ключом в виде id данного вопроса, ответ, который прислал пользователь.
  6. Сделать редирект обратно на страницу с вопросами.
  7. Вернуться к пункту 4, если ещё остались вопросы без ответа. Если на все вопросы были даны ответы, то проверить массив в сессии на соответствие правильным ответам, и вывести окончательный результат.

Давайте разберём 3-й пункт с кодом:

Теперь давайте разберём 5-й пункт, так как он тоже является, возможно, не совсем понятным:

Самую суть я разобрал, а уже дальше постарайтесь этот алгоритм применить на практике самостоятельно. Ведь не секрет, что придумать алгоритм гораздо тяжелее, чем его реализовать, и Вам нужно лишь его реализовать, а это не так сложно. Не спорю, алгоритм весьма сложный, но я предупредил вначале статьи, что она не для новичков. И несмотря на то, что алгоритм сложный, в реальности он ещё сложнее может быть, если начать добавлять различные «навороты«, например, разбор вопросов в конце, а также каждый раз перемешивать варианты ответов при выводе вопроса.

Создано 06.02.2012 14:00:47

  • Михаил Русаков
  • Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

    Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
    Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

    Если Вы не хотите пропустить новые материалы на сайте,
    то Вы можете подписаться на обновления: Подписаться на обновления

    Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

    Порекомендуйте эту статью друзьям:

    Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

    Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 25 ):

    Sirojiddin AshtiSirojiddin Ashti 06.02.2012 14:29:14

    Добавьте результат этого скрипка с рисунком??

    AdminAdmin 06.02.2012 15:14:29

    Результат здесь: http://myrusakov.ru/tests.html В любой тест заходите вот и будет результат, за вычетом того, что в конце данного скрипта нет разбора вопросов.

    ScreenScreen 06.02.2012 15:01:44

    Да. Было бы не плохо, если бы появились пункты со скринами, или допустим со ссылками для переходу, где можно было бы просмотреть итог.

    yurfactyurfact 07.02.2012 15:16:12

    Ничего себе длииииинющая статья. Это рекорд. Прим. — не в обиду автору а просто хочется чтобы темы пошире раскрывались а не абстрактно

    AdminAdmin 07.02.2012 16:07:54

    Здесь люди учатся, а не занимаются копипастом. Если Вам нужен готовый скрипт, то я, помнится, написал в статье, что нужно делать в этом случае. А если Вы пришли сюда учиться, то, будьте любезны, додумайте задачу сами.

    Нур-МохмадНур-Мохмад 30.07.2012 12:00:51

    Михаил, разве тут $_SESSION[«questions»][$question_id»] не должна быть кавычка перед $question_id ?

    AdminAdmin 30.07.2012 18:37:00
    SARUMAN7SARUMAN7 17.11.2013 13:35:34

    Михаил скажите пожалуйста как мне вытащить все вопросы по определенной теме допустим где test_id=3

    alexandrdantealexandrdante 17.11.2013 13:56:32

    Уважаемый Андрей,id каждого вопроса теста не должны повторяться. Можно сделать категорию,занести в неё нужные вам тесты,задать ей id,например,3 и при помощи запроса вытащить все данные из неё.

    SARUMAN7SARUMAN7 17.11.2013 14:23:17

    Уважаемый Александр Альт если Вам не сложно помогите мне пожалуйста я php знаю на среднем уровне до темы регулярные выражения (учусь по курсу Михаила)но мне срочно нужно сделать тестирование поможете сопровождая меня советами?

    alexandrdantealexandrdante 17.11.2013 14:51:31

    Буду стараться Вот смотрите,у вас есть айди теста: — 3 в таблице с вопросами у каждого вопроса из этого теста,должен стоять идентификатор 3 в колонке test_id У Михаила разобран вывод по одному вопросу при помощи массива и так по действиям,что,в принципе и актуально для теста. Cуть примерно такая. Подключаетесь к базе данных при помощи php. Думаю у Михаила этот вопрос разобран в курсах,так что вдаваться в подробности не буду. После этого создаёте запрос к таблице и выводите данные из неё при помощи массива: $row = mysql_fetch_array(mysql_query(«SELECT * FROM таблица WHERE test_id=`3`»,$имя переменной,где задан коннект к базе данных); потом выводите результат при помощи команды echo, включив нужные вам данные в вывод. echo $row[‘title’]; Выведет название вопроса) Ну,можно вывести название,далее варианты ответов и т.д. Это как обычный вывод массива

    SARUMAN7SARUMAN7 17.11.2013 15:14:41

    все понял кроме этого момента Вот смотрите,у вас есть айди теста: — 3 в таблице с вопросами у каждого вопроса из этого теста,должен стоять идентификатор 3 в колонке test_id на данный момент я создал отдельную базу kontrol и в ней две таблицы testi с полями id и title(тема тестов) и таблицу vopros с полями id id_test title_vopros(Текст вопроса) variant_1 variant_2 variant_3 variant_4 и поле correct это чтобы Вы видели ситуацию изнутри теперь вопрос как подставить эти данные в форму (тоесть заголовок варианты и т.д) обе таблицы я заполнил по одной записи в нужных полях

    alexandrdantealexandrdante 17.11.2013 18:12:51

    Ну вот. Вытаскиваете этим запросом: $row = mysqli_fetch_array(mysqli_query(«SELECT * FROM таблица WHERE test_id=`3`»,$имя переменной,где задан коннект к базе данных); все данные из таблицы,у которых параметр test_id = 3 mysqli_fetch_array — этим вы добавили все данные из всех колонок,test_id которых равен 3,в массив =) Ну вот,а теперь выводите,создавая внешний вид теста например:echo $row[‘title_vopros’]; — текст вопроса. Следующей строчкой: echo $row[‘variant_1’]; — выведет первый вариант ответа и так далее,формируя тело отображения теста Про привязку к форме отпишу чуть позже.

    Читайте также:  Тест какая твоя субкультура

    SARUMAN7SARUMAN7 18.11.2013 12:01:13

    на данный момент я вывел из базы тему теста вопрос теста и варианты ответа вот файл testing.php а вот файл select_testing.php

    tikkiwikitikkiwiki 18.11.2013 16:33:50

    Здравствуйте Андрей. Пустое поле в таблице не как не повлияет на работу в целом. Чтобы выводился следующий вопрос из таблицы читайте внимательно пункты 2-7 и делайте по аналогии.

    SARUMAN7SARUMAN7 18.11.2013 16:50:19

    Здравствуйте а можно как то обойтись без сессий? я их еще не изучал а тупо копировать я не хочу так как потом сам же не разберусь в коде в случае чего

    tikkiwikitikkiwiki 18.11.2013 17:26:34

    Андрей, в сессиях нет ничего страшного, изучайте их так как они очень важные. Сделать это без сессий, Вам будет не возможно.

    SARUMAN7SARUMAN7 20.11.2013 15:55:38

    Скажите как сделать так чтобы при нажатии следующий вопрос выводился следуший вопрос? если можно пример пожалуйста

    tikkiwikitikkiwiki 20.11.2013 16:44:25

    Лучше реализовать одной кнопкой «Ответ» и после ее нажатия, пользователю автоматически подается следующий вопрос. Реализовать можно множеством способов, зависит от того, как у Вас работает система, можно AJAX’ом допустим.

    SARUMAN7SARUMAN7 20.11.2013 16:55:37

    нет аякс не использую можно как то по другому ? я слышал get запросом как то можно\\\подскажите код

    tikkiwikitikkiwiki 20.11.2013 17:06:04

    пример из двух файлов, форма отправки находится в файле form.php, а обработчик в файле add.php. Файлы Вы можете конечно называть как вам угодно, лишь придерживаясь правильности именования файлов и правильно указывайте путь к обработчику. Создайте form.php и добавьте следующий код: Затем, создайте add.php и в него добавьте следующее: Затем, запустите form.php и увидите результат работы передачи данных методом GET.

    SARUMAN7SARUMAN7 24.11.2013 10:02:45

    у меня все получилось но все вопросы выводятся на одной странице как это исправить?

    Источник

    12 лучших фреймворков автоматизированного тестирования PHP

    Основное различие между разработкой через тесты и разработкой через функционирование заключается в синтаксисе тестового кода: TDD использует соответствующий PHP код в файлах тестирования, в то время как BDD использует понятные человеку выражения, которые описывают поведение каждого элемента.

    Ниже приводится список из 12 лучших фреймворков автоматизированного тестирования PHP, которые помогут упростить ваш рабочий процесс.

    • Selenium
      • PHPUnit
      • Behat
      • Kahlan
      • Atoum
      • Codeception
      • SimpleTest
      • Storyplayer
      • Peridot
      • PHO
      • Mockery
      • PHP Specs

    Selenium

    Selenium автоматизирует браузеры для тестирования веб-приложений. Проект поддерживают несколько крупнейших разработчиков браузеров, предпринимающих шаги, направленные на то, чтобы сделать Selenium составляющей частью браузера. Также это также основная технология для множества других инструментов автоматизации браузеров, API и фреймворков.

    PHPUnit

    PHPUnit — это ориентированный на программистов фреймворк тестирования для PHP. Он построен на архитектуре XUnit для фреймворков модульного тестирования. PHPUnit можно управлять через командную строку, он предоставляет в наше распоряжение класс TestCase, который может быть расширен в соответствии с нашими потребностями.

    Фреймворк также позволяет разработчикам использовать заранее написанные методы подтверждения определенного поведения приложения.

    Behat

    Behat — фреймворк для тестирования PHP через функционирование ( BDD), который позволяет писать понятный человеку код, описывающий, как должно функционировать приложение.

    Источник

    Как тестировать приложения PHP с помощью PHPUnit

    В этом руководстве мы вернемся к PHP и на этот раз рассмотрим, как создавать модульные тесты. Это поможет нам создавать более надежные и менее подверженные ошибкам приложения 💪.

    Но прежде всего, и для тех, кто не имеет четкого представления о….

    Что такое модульные тесты?

    В основном это скрипты, которые мы создаем для тестирования определенных блоков кода. Тест получает данные из него и проверяет их с помощью функций, предоставляемых библиотекой, которую мы будем использовать. Таким образом, мы можем убедиться, что все хорошо, прежде чем отправить его в продакшн.

    Создадим проект, чтобы посмотреть на все более наглядно.

    Создаем структуру нашего проекта. Сначала мы создадим две папки в корневом каталоге, одну назовем app, а другую – tests. Далее создадим файл composer.json со следующим содержимым:

    После этого мы запускаем команду composer dump для создания autoload:

    Далее мы установим PHPUnit. Это будет библиотека, которую мы будем использовать для создания наших тестов.

    После этого нам нужно создать конфигурационный файл для PHPUnit. Для этого перейдем в корневой каталог нашего проекта и создадим файл phpunit.xml, который будет содержать следующий код:

    Фактически, мы передаем в атрибуте bootstrap файл загрузки класса, а в testsuite – каталог, в котором мы будем сохранять тесты, который в нашем случае будет находиться в папке tests.

    Для этого примера мы создадим класс, который будем использовать в качестве подопытного кролика для запуска наших тестов. Для этого мы переходим в каталог приложения и внутри него создаем папку Classes. После создания этой папки мы обращаемся к ней и создаем файл Calc.php, который будет содержать следующий код:

    Как вы можете видеть, это очень простой код. В нем просто есть функция, которая берет два числа и вычисляет сумму.

    После того как это сделано, пришло время создать наш первый тест. Для этого перейдем в папку tests и в ней создадим файл CalcTest.php. Очень важно, чтобы имя файла имело формат CamelCase и заканчивалось Test.php. Это способ, который использует PHPUnit для определения того, когда это тест, а когда нет. Если он не имеет такого формата, тест выполнен не будет, поэтому не забывайте об этой детали.

    После создания файла мы открываем его и добавляем следующий код:

    После создания файла мы открываем его и добавляем следующий код:

    Как вы видите, первое, что мы делаем, это добавляем библиотеку PHPUnit и наш класс Calc.

    Следующим шагом будет создание класса, который должен называться так же, как и наш файл, и который будет расширять класс TestCase. Таким образом, мы сможем использовать функциональные возможности PHPUnit для создания наших тестов.

    Внутри класса мы создадим наши тесты. В данном случае у нас есть только один под названием test_sum. Все методы, которые мы хотим запустить, должны начинаться с имени test_ и иметь формат названия snake_case, иначе PHPUnit проигнорирует их и они не будут запущены. Также каждый тест должен быть самодостаточным и не зависеть от других тестов, чтобы работать правильно.

    Внутри test_sum мы создаем экземпляр класса Calc и выполняем метод sum, который возвращает результат. Для проверки теста мы будем использовать метод assertEquals, который является методом класса TestCase и в переводе означает что-то вроде “определить, равны ли они”. В этом методе в качестве первого параметра мы передаем результат, который ожидаем получить, а во втором – результат, который мы получили, чтобы подтвердить, что все в порядке.

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

    Если все прошло успешно, мы должны получить сообщение о том, что все наши тесты успешно пройдены.

    Кроме assertEquals, у нас есть еще много типов подтверждений, как вы можете видеть в этом списке. Например, если мы хотим подтвердить, что возвращаемый результат является целым числом, мы можем использовать AssertIsInt:

    Читайте также:  Что такое внутрибольничная инфекция тест

    setUp() и tearDown()

    Иногда бывает так, что в различных тестах мы повторяем код и в начале, и в конце, что означает, что у нас много повторяющегося кода. Для решения этой проблемы у нас есть методы setUp и tearDown. Метод setUp всегда будет запускаться перед выполнением каждого теста, а метод tearDown будет запускаться каждый раз, когда один из наших тестов завершится.

    Чтобы увидеть их в действии, вернемся к классу Calc и добавим новый метод так, чтобы теперь он выглядел следующим образом:

    Затем мы возвращаемся к нашему тесту и изменяем его, чтобы добавить новый тест, а также посмотреть, как применить метод setUp():

    Как вы видите, мы добавили метод setUp, который будет создавать экземпляр класса каждый раз, когда выполняется тест. Таким образом, наши тесты будут выглядеть чище и понятнее.

    Заключение

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

    Источник

    PHP: инструменты для тестирования, отладки, защиты и мониторинга

    Продолжаем обсуждать инструменты, которые будут полезны тем, кто ведет разработку на языке PHP. Предыдущая статья была посвящена средам разработки и текстовым редакторам, в этой я расскажу об инструментах, которые используются для тестирования, отладки, защиты и мониторинга.

    Тестирование

    PHPUnit

    PHPUnit — инструмент для тестирования, похожий на JUnit (который используется для тестирования Java). Он дает возможность создавать собственные юнит-тесты и выводить результаты в нескольких форматах. Сейчас это один из самых популярных фреймворков для юнит-тестирования в PHP. PHPUnit отлично подойдет для тестирования масштабируемости.

    Selenium

    Selenium — это легковесный фреймворк для тестирования с открытым исходным кодом. Он позволяет создавать UI-тесты на любом языке программирования. Совместим с большинством браузеров и отлично работает на Windows, Linux и macOS.

    Отладка

    Xdebug

    Начиная с 2002 года (года запуска), Xdebug является одним из самых надежных инструментов PHP-разработчика. Он позволяет профилировать и отлаживать PHP-скрипты. Xdebug доступен в качестве плагина для Eclipse, PHPDesigner, а также совместим с многими другими инструментами разработки.

    DebugBar

    DebugBar — опенсорс-инструмент, который будет полезен любому разработчику, так как позволяет отслеживать в том числе ошибки в HTML и JS. Также DebugBar дает возможность мониторить сетевой трафик, оценивать качество JS-кода и инспектировать стили.

    MacGDBp

    Как понятно уже из названия, MacGDBp используется для отладки PHP на Маке. Вместе с расширением Xdebug дает возможность работать с локальными переменными и выводить стеки в интерфейсе macOS.

    Безопасность

    RIPS

    Проект изначально представлял собой утилиту с открытым исходным кодом для выявления уязвимостей в приложениях на PHP, но позже превратился в полноценный сервис мониторинга за безопасностью. Ранее существовала бесплатная версия, а сейчас можно запросить тестовый период для того, чтобы оценить функционал утилиты.

    Securimage

    Утилита имеет открытый исходный код и позволяет создавать капчу для защиты разных форм для заполнения в PHP-приложениях. Особенно полезно ее использовать для форм регистрации, она позволит отфильтровать спам и угрозы безопасности.

    Мониторинг

    Retrace

    Retrace используется для отслеживания производительности. Также имеет функцию, позволяющую оперативно отслеживать ошибки и баги. Решить, стоит ли платить за этот продукт, можно в течение бесплатного 14-дневного периода.

    New Relic APM

    New Relic похож на Retrace и тоже дает возможность отслеживать производительность вашего PHP-приложения. Помимо этого, New Relic позволяет собирать данные пользователей, которые можно использовать для улучшения UX.

    AppOptics

    Если вы когда-нибудь использовали TraceView, то быстро сможете освоить и работу с AppOptics, т.к. компания-разработчик Solarwinds приобрела TraceView и внедрила все его функции в свой собственный инструмент мониторинга. Помимо PHP, AppOprics также поддерживает Java, Python и .NET. Сервис в реальном времени показывает работу приложений, а также отслеживает все ошибки и проблемные места, которые напрямую влияют на производительность.

    Источник

    Php движок для тестов

    Продолжение статьи о модульных тестах в PHP. В этой части займемся практикой тестирования и разберемся с базовым использованием PHPUnit.

    Содержание

    Статья получилась огромная, потому разделена на 3 части. Для удобства содержание продублированно в каждой части, переходы на текущей странице выделены жирным шрифтом.

    Практика

    Тестирование средствами PHP

    Тестировать можно обычным PHP кодом, не используя дополнительные инструменты. Писать if. else , в таком духе, проверять результат выполнения метода. В PHP так же есть функция assert(), чье поведение настраивается через assert_options(). Ее тоже можно использовать для написания тестов на нативном PHP, хотя честно я не понял на примерах аля «Hello, world», как бы это реально выглядело.

    Приведу пример из книги, переведенный на PHP. Допустим, у нас есть класс SimpleParser (см. ниже), и мы хотим его протестировать. В классе есть метод ParseAndSum , который принимает строку, состоящую из нуля или более чисел, разделенных запятыми. Если чисел в строке нет, метод возвращает 0. Если есть только одно число, оно возвращается в виде int. Если чисел несколько, они складываются и возвращается сумма (хотя в настоящий момент код умеет обрабатывать только случаи нуля или одного числа).

    Тест напишем в отдельном скрипте, для вызова в консоли. Выглядит он так:

    Это тест всего одного возможного результата метода. Как я говорил выше, нужно писать тесты на проверку всех принципиально разных результатов. Тут не делаю, надеюсь, идея понятна.

    Пример сильно упрощен и понятно, что вызывать каждый скрипт в консоли для каждого метода будет неудобно. Но, не будем изобретать свой велосипед, лучше посмотрим на изобретенные до нас.

    Фреймворки для unit-тестов

    Я рекомендую PHPUnit. Признаю, я с другими не работал, но конкретно с этим разобрался быстро и он почти полностью обеспечил мои требования к unit-тестированию. Этот фреймворк можно расширять установкой дополнительных модулей, сейчас это не составляет трудностей, Composer в помощь. Какие именно модули — я расскажу ниже.

    PHPUnit — это просто удобный инструмент для тестирования по сравнении с написанием кода с нуля. Но на нем свет клином не сошелся, есть еще масса других тестовых фреймворков. Для интересующихся тут статья на английском. В тройке лидеров: PHPUnit, Codeception и Behat.

    Для информации: PHPUnit назван подобно тестовым движкам для других языков — JUnit (Java), NUnit (.NET), CUnit (C).

    Тестирование непубличных методов в PHP

    Если есть необходимость протестировать приватный метод, вероятно у вас проблема в архитектуре приложения. Однако, бывают исключения. Опять пример сборщика статики: там нет проблем в архитектуре (ну или я так думаю :)), есть всего один рабочий метод, который смотрит наружу, все остальные — непубличные, их много и все их надо протестировать. Но как?

    Решений тут несколько. Самое очевидное — объявить все тестируемые методы публичными. Это нехорошо, нарушение принципа инкапсуляции (сокрытие деталей реализации).

    Объявить их protected методами, потом от них унаследовать спец.классы с публичными методами-обертками, которые в свою очередь будут вызывать эти protected-методы. И тестировать при этом методы-обертки в промежуточных классах. Мне это решение не нравится, потому что это еще больше кода, какие-то загадочные костыли и вообще лишняя унылая писанина.

    Читайте также:  Александр второй тест с ответами

    Третий варик: использовать рефлексию, она доступна в современных версиях PHP. В процессе теста берем класс, меняем проверямому методу доступ на публичный и вызываем его. Этот вариант мне нравится. Если разработчик смотрит исходный код, он перед ним правильная видимость каждого метода, и не возникает вопросов, что можно использовать и где. Если он смотрит в тесты, максимум, что ему нужно разобрать, это вызов непубличного метода, все остальное опять же остается понятным и не вызывает лишних вопросов.

    В итоге тестируется каждый маленький метод, как и хотелось бы сделать изначально, а не только публичные методы, которые могут быть вообще фасадами и сами по себе никакой полезной работы не делают.

    Пример использования (PHPUnit):

    SUTClass — тестируемый класс
    someAction — непубличный метод в нем
    $param1 . $paramN — параметры метода, если ему нужны параметры.

    Недостаток: этот трейт не может работать с методами, которые принимают параметры по ссылке. Я не придумал красивого решения. Придется все-таки открывать такие методы в публичную видимость и ставить тег @ignore или @internal . Желающим попробовать найти решение могу предоставить свои наработки.

    Важно: PHPUnit развивается, причем без обратной соместимости. Сегодня (21.04.2017) — это версия 6.1. Приведенные тут примеры кода могут уже не соответствовать текущей версии фреймворка. Тогда вам придется лезть в документацию, чтобы найти разницу.

    Я предполагаю, что вы умеете пользоваться Composer и он есть в вашей системе.

    Обратите внимание, зависимости устанавливаем в dev-окружение, потому что на боевом сайте unit-тесты, как правило, не выполняют.

    Для дальнейшей работы создадим минимальную видимость сайта. Исходники в архиве. После скачивания, запустите в каталоге сайта composer install .

    Иерархия каталогов примерно выглядит так:

    Что стоит пояснения: корень сайта — какой угодно, можно даже домен не привязывать, сейчас это не важно. bootstrap.php — это файл инициализации специально для тестов, расскажу о нем позже; config.xml — конфиг PHPUnit, о нем так же расскажу чуть ниже.

    Тесты лежат в каталоге [tests/] . В подкаталоге [unit/] — примеры, которые можно выполнить и увидеть в живую, как они отработают. В [dummy_examples/] — примеры оформления тестов, к ним будут отсылки ниже по ходу изложения. Такие примеры выполнить не получится, потому что для них нет реального кода. Я не стал его переносить, т.к. он сильно завязан на проекты, откуда взяты тесты.

    Важно: тесты в каталоге [dummy_examples/] взяты из реальных проектов, поэтому они могут оказаться сложными для понимания, если вы новичок в модульном тестировании. В них разбираться необязательно, вы можете игнорировать отсылки в этот каталог.

    Существующее соглашение (которое в принципе можно настроить): имена тест-классов заканчиваются на слово Test, тест-методы содержат слово test. Как именно называть методы — дело ваше. Для удобства используют те же имена, что у проверяемых методов, в случае когда боевому методу соответствует всего один тест-метод.

    Простой тест в PHPUnit

    Я уже привел пример теста ранее (см. Тестирование средствами PHP), там он выполнен без использования фреймворков. В PHPUnit тот же тест выглядит так:

    Правило трех «A» — Arrange Act Assert (Подготовка Действие Утверждение) — можно рассматривать, как общую рекомендацию к описанию тест-метода. И эта рекомендация будет работать, если боевые методы пишутся с оглядкой на их тестирование. Вспомните, ранее была речь про подмену зависимостей и чистые функции.

    Хороший пример см. в [tests/dummy_examples/ProductValidatorTest.php] . Бегло взгляните на метод test_validateAttributes() . Необязательно понимать, зачем все это, важно увидеть суть оформления Arrange Act Assert. Там еще подмена зависимости в блоке Act, о ней расскажу ниже.

    В PHPUnit есть группа методов-оберток для составления утвержденией assert*() . Все они составлены по одному принципу, с полным списком можно ознакомиться в мануале.

    Новая проблема — как запустить такой тест на выполнение? Об этом несколько следующих разделов.

    Минимальная настройка тестовой среды

    Запуск без конфигурации и bootstrap (выполняем в консоли):

    Инструкция $(pwd) работает только в Linux. Используется для удобства, для PhpUnit требуется указывать абсолютный путь к файлу теста. Можно заменить эту инструкцию на хардкодный путь [/www/site/] .

    Чтобы такой запуск работал, придется прямо в тест-классе подключить autoload.php для автозагрузки классов через Composer. Любопытно, но как-то автозагрузчик Composer работает, даже если нигде явно его не подключить. Возможно он в phpunit подключается.

    Расширенная настройка тестовой среды

    bootstrap.php

    В архиве исходников откройте [tests/bootstrap.php] и [/index.php] для сравнения.

    Файл [tests/bootstrap.php] — это файл инициализации тестов. Он вызывается перед выполнением любого теста, если вы попросите это делать. Имя файла может быть другим, «bootsrtap» — это общепринятое название. В этот файл обычно пишут почти тоже самое, что вашем главном index.php или его аналоге. Т.е. код, который выполняется первым на вашем сайте, можно разместить в этом файле (с некоторыми изменениями).

    Необязательно полностью копировать в bootstrap.php какой-то скрипт боевой части сайта. Только то, без чего ваши тесты работать не смогут. Например, если у вас используются какие-то глобальные константы (описанные в index.php ), вероятно они могут потребоваться в тестах. Пишем их в bootstrap.php . Подключения сторонних библиотек, настройки даты/времени, кодировка — короче все то, что обычно требуется для любой страницы вашего сайта — можно продублировать в bootstrap.php .

    В нашем простом примере в bootsrtap.php вообще нечего прописать. Реальное содержимое таких файлов обычно определяется по ходу разработки, когда очередной тест не запускается, потому что чего-то не хватает.

    Запуск теста с использованием скрипта инициализации:

    Конкретно в текущем простом примере мы могли бы даже напрямую подключать index.php и не описывать отдельно bootstrap.php . Но на практике все-таки в них есть некоторая разница, поэтому так не делают.

    config.xml

    Файл [tests/config.xml] — это конфигурация фреймфорка PHPUnit. Имя файла может быть любым. Как вы уже видели выше, тесты прекрасно работают и без конфигурации. Данный файл позволяет более гибко управлять процессом тестирования. На примере:

    В приведенном примере конфигурации: указан файл инициализации, его уже не нужно передавать в ключе —bootstrap ; значение colors=»true» включает цветную выдачу лога тестирования в консоли; verbose ограничивает подробности выдаваемой информации в консоль.

    Элемент testsuite описывает конкретный набор тестов. У него больше необязательных параметров, чем в примере, подробности см. в мануале. Я обычно использую этот элемент для подключения тестов из разных каталогов. Так же можно вызвать конкретный набор тестов, используя ключ .

    Пример вызова с конфигом:

    Можно описывать сколько угодно конфигураций и подключать их по ситуации.

    Интеграция PHPUnit в PhpStrom

    Так подключается тестовый движок к проекту

    Обратите внимание, установив PHPUnit через Composer, указывать нужно путь к автозагрузчику, а не к самому PHPUnit.

    Добавляем тестовую конфигурацию

    Описываем детали конфигурации

    Обратите внимание, какую строку вызова собирает IDE:

    В данном случае я не описывал в настройках путь к кофигурации и файлу инициализации, они взяты из основных настроек IDE.

    Собственно, эта вся настройка. PHPStorm позволяет через свои описания конфигов тестировать: каталог, класс, метод, использовать альтернативные конфигурации.

    Источник