Php как сделать тест

Содержание
  1. Php как сделать тест
  2. Пишем простой тест на PHP
  3. Как написать скрипт для проведения собственного тестирования на PHP?
  4. Как сделать тестирование на сайте
  5. Комментарии ( 25 ):
  6. Юнит-тестирование на PHP в примерах
  7. Содержание
  8. Тестовые дубли
  9. Заглушки (Stub)
  10. Имитатор (Dummy)
  11. Фальшивка (Fake)
  12. Заглушка (Stub)
  13. Моки (Mock)
  14. Шпион (Spy)
  15. Мок (Mock)
  16. Наименования
  17. Шаблон AAA
  18. Мать объекта
  19. Параметризированный тест
  20. Две школы юнит-тестирования
  21. Классическая (Детройтская школа)
  22. Моковая (Лондонская школа)
  23. Зависимости
  24. Моки и заглушки
  25. Три стиля юнит-тестирования
  26. Результат
  27. Состояние
  28. Взаимодействие
  29. Функциональная архитектура и тесты
  30. Наблюдаемое поведение и подробности реализации
  31. Единица поведения
  32. Шаблон humble
  33. Бесполезный тест
  34. Хрупкий тест
  35. Исправления тестов
  36. Общие антипаттерны тестирования
  37. Раскрытие приватного состояния
  38. Утечка подробностей о предметной области
  39. Мокинг конкретных классов
  40. Тестирование приватных методов
  41. Время как непостоянная зависимость
  42. Не гонитесь за полным покрытием

Php как сделать тест

БлогNot. Пишем простой тест на PHP

Пишем простой тест на PHP

Этот учебный скрипт на PHP показывает, как можно описать некий тест в виде единственного массива вопросов и ответов. Поскольку типов вопросов может быть несколько (выбор «да»-«нет», выбор одного из нескольких вариантов, ввод числа или строки в качестве ответа), нам понадобится не просто массив, а массив массивов, каждый элемент которого будет описывать всё, что нужно для вывода и проверки очередного вопроса. Это будут записи со следующими ключами:

  • ‘q’ — отображаемый текст вопроса;
  • ‘t’ — тип вопроса, соответствующий нужному тегу HTML: ‘checkbox’ для галочек «да/нет», ‘text’ для строки или числа в качестве ответа, ‘select’ — для списка, в котором нужно выбрать одно значение из нескольких. Выбор более одного значения реализуем придуманным нами элементом ‘multiselect’ , представляющим из собой группу вместе обрабатываемых checkbox’ов. На самом деле, стандартный список с атрибутом multiple тоже позволяет решить эту задачу, но не хотелось бы загружать пользователя необходимостью помнить, что множественный выбор из списка делается при зажатой клавише Ctrl;
  • ‘a’ — правильный ответ, для checkbox это значение ‘1’ или ‘0’ (нужно ли включать галочку), для text — строка с ответом (длину поля будем генерировать равной длине строки с правильным ответом, так что контроль лишних разделителей и проч. опустим), для select — номер варианта в списке, который является правильным ответом (варианты нумеруются с нуля!), для multiselect — строка из единиц и нулей, разделённых символом » | «, показывающая, какие по порядку чекбоксы нужно включить, а какие не нужно;
  • ‘i’ — элементы списка, нужные только для типов вопроса select и multiselect , значение содержит строки, разделённые символом » | » (элементы списка или варианты утверждений).

За каждый правильный ответ, в том числе, выбор всех «правильных» чекбоксов в ‘multiselect’, будет начисляться 1 балл, а в конце скрипт выдаст резюме о количестве и проценте правильных ответов.

В отличие от простого конвертера, в этом скрипте мы не ставили задачи сохранить пользовательский ввод, поэтому ссылка «Ещё раз!» на странице с результатами позволяет просто пройти тест повторно, введя все результаты и отметив все чекбоксы заново. Несмотря на это, программке понадобилось 2 дополнительных функции:

  • error_check проверяет, всё ли хорошо с очередным элементом массива $test , и, если что-то не так, завершает выполнение скрипта. Это может пригодиться при отладке;
  • strlwr_ переводит в нижний регистр строки, введённые пользователем в качестве ответов. Предполагается кодировка Windows-1251, но можно, конечно, вставить текст скрипта в файл с другой кодировкой и поменять мета-тег кодировки в заголовке.

Вот полный исходник приложения, содержащий тест всех 4 типов вопросов:

Ниже показан вид теста и результат его прохождения.

Скрипт-пример в работе

Источник

Как написать скрипт для проведения собственного тестирования на PHP?

В этой статье речь пойдет о реализации простого тестирования при помощи PHP .

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

В нашем тесте будут разные вопрос, с различными вариантами ответов — выбор одного правильного ответа из группы, запись ответа в текстовое поле, выбор нескольких вариантов в ответе.

Сам тест будет хранить у нас в index.html , как форма со всеми её элементами. А проверка тестирования будет проходить в файле test.php .

Подготовим тест и напишем разметку нашей страницы:

Здесь стоит отметить то, что в атрибутах name лучше задавать понятные названия, с которыми вам потом придется оперировать в PHP файле. Так же мы советуем вам в атрибутах value так же задавать понятные значения, чтобы не приходилось оперировать непонятными цифрами(именно это значения сохраняется и отправляется в обработчик).

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

Читайте также:  Как сделать растяжку шеи

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

Код проверки так же снабжён множеством комментариев, которые смогут помочь вам разобраться.

Проверить работоспособность примера можно тут:

Источник

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

В сегодняшней статье собираюсь поведать, как сделать тестирование на сайте. Данное тестирование будет аналогично тому, которое имеется на данном сайте, правда, в упрощённом виде. Сразу говорю, если Ваши знания по 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-й пункт, так как он тоже является, возможно, не совсем понятным:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Читайте также:  Как сделать сушеную тыкву

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

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

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

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

    Ну вот. Вытаскиваете этим запросом: $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’]; — выведет первый вариант ответа и так далее,формируя тело отображения теста Про привязку к форме отпишу чуть позже.

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

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

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

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

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

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

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

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

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

    Источник

    Юнит-тестирование на PHP в примерах

    Содержание

    Тестовые дубли

    Это фальшивые зависимости, используемые в тестах.

    Заглушки (Stub)

    Имитатор (Dummy)

    Имитатор — всего лишь простая реализация, которая ничего не делает.

    Фальшивка (Fake)

    Фальшивка — это упрощённая реализация, эмулирующая нужное поведение.

    Заглушка (Stub)

    Заглушка — это простейшая реализация с прописанным в коде поведением.

    Моки (Mock)

    Шпион (Spy)

    Шпион — реализация для проверки конкретного поведения.

    Мок (Mock)

    Мок — сконфигурированная имитация для проверки вызовов взаимодействующих объектов.

    ! Для проверки входящий взаимодействий используйте заглушку, а для проверки исходящих взаимодействий — мок. Подробнее об этом в главе Моки и заглушки.

    Наименования

    Явно указывайте, что вы тестируете.

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

    Описание поведения важно при тестировании предметных сценариев. Если ваш код утилитарный, то это уже не так важно.

    Читайте также:  Рыбалка как сделать воблера

    Почему важно, чтобы непрограммисты могли читать юнит-тесты? Если в проекте сложная предметная логика, то эта логика должна быть очевидна для всех, а для этого тесты должны описывать подробности без технических терминов, чтобы вы могли говорить с представителями бизнеса на том же языке, что используется в тестах. Освободите от терминов и весь код, связанный с предметной областью, иначе непрограммисты не смогут понять эти тесты. Не надо писать в комментариях «возвращает null», «бросает исключение» и т.д. Такая информация не относится к предметной области.

    Шаблон AAA

    Также известен как «Given, When, Then».

    Выделяйте в тестах три этапа:

    • Arrange: приведите тестируемую систему к нужному состоянию. Подготовьте зависимости, аргументы, и создайте SUT.
    • Act: извлеките тестируемый элемент.
    • Assert: проверьте результат, финальное состояние или взаимодействие с другими объектами.

    Мать объекта

    Этот шаблон помогает создавать конкретные объекты, которые можно использовать в нескольких тестах. Благодаря этому этап «arrange» получается кратким, а весь тест — более удобочитаемым.

    Параметризированный тест

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

    Две школы юнит-тестирования

    Классическая (Детройтская школа)

    • Модуль — это единица поведения, может состоять из нескольких взаимосвязанных классов.
    • Все тесты должны быть изолированы друг от друга. Должна быть возможность вызывать их параллельно или в произвольном порядке.

    Моковая (Лондонская школа)

    • Модуль — это один класс.
    • Модуль должен быть изолирован от взаимодействующих объектов.

    Классический подход лучше позволяет избегать хрупких тестов.

    Зависимости

    Моки и заглушки

    • Проверочные взаимодействия с заглушками приводят к хрупким тестам.

    Три стиля юнит-тестирования

    Результат

    • Наилучшая сопротивляемость рефакторингу.
    • Наилучшая точность.
    • Меньше всего усилий по сопровождению.
    • Если возможно, применяйте этот вид тестов.

    Состояние

    • Хуже сопротивляемость рефакторингу.
    • Хуже точность.
    • Сложнее в сопровождении.

    Взаимодействие

    • Худшая сопротивляемость рефакторингу.
    • Худшая точность.
    • Сложнее всего в сопровождении.

    Функциональная архитектура и тесты

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

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

    Наблюдаемое поведение и подробности реализации

    У первой модели подписки плохая архитектура. Для вызова одной бизнес-операции нужно вызывать три метода. Также не рекомендуется использовать методы-получатели (геттеры) для проверки операции. В данном примере пропущена проверка изменения modifiedAt . Возможно, указание конкретного modifiedAt в ходе операции renew можно протестировать с помощью бизнес-операции устаревания. Для modifiedAt метод-получатель не требуется. Конечно, есть ситуации, в которых очень трудно найти способ избежать использования методов-получателей только для тестов, но их нужно избегать всеми силами.

    Единица поведения

    Не пишите код 1:1: один класс — один тест. Это приводит к хрупким тестам, что затрудняет рефакторинг.

    Шаблон humble

    Как правильно выполнять юнит-тестирование такого класса?

    Нужно разбить чрезмерно усложнённый код на отдельные классы.

    Однако ApplicationService , вероятно, нужно проверить с помощью интеграционного теста с моком FormApiInterface .

    Бесполезный тест

    Тестировать код, не содержащий какой-либо сложной логики, не только бессмысленно, но и приводит к хрупким тестам.

    Хрупкий тест

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

    Исправления тестов

    • Лучше избегать использования общего для нескольких тестов состояния.
    • Чтобы повторно использовать элементы в нескольких тестах применяйте:

    Общие антипаттерны тестирования

    Раскрытие приватного состояния

    Внесение дополнительного production-кода (например, метода-получателя getCustomerType() ) только ради проверки состояния в тестах — плохая практика. Состояние нужно проверять другим важным предметным значением (в этом случае — getPercentageDiscount() ). Конечно, иногда трудно найти другой способ проверки операции, и мы можем оказаться вынуждены внести дополнительный production-код для проверки корректности тестов, но нужно стараться избегать этого.

    Утечка подробностей о предметной области

    Не дублируйте в тестах production-логику. Проверяйте результаты с помощью прописанных в коде значений.

    Мокинг конкретных классов

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

    Тестирование приватных методов

    Тесты должны проверять только публичный API.

    Время как непостоянная зависимость

    Время является непостоянной зависимостью из-за своего недетерминизма. Каждый вызов даёт другой результат.

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

    Не гонитесь за полным покрытием

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

    Источник

    Поделиться с друзьями
    Ответ и точка