Примечание: раньше тут были другие условия задачи. Их можно найти в предыдущих ревизиях этого задания по ссылке https://gist.github.com/codedokode/8733007/e8e73b0255b3d899cb4e17dc9446fe694a8f5f7c
Cделать сайт TestHub, который позволяет создавать и проходить тесты (с вопросами и ответами). Их могут использовать например, преподаватели для проверки знаний студентов, работодатели для отсеивания кандидатов на вакансию, маркетологи для проведения опросов. Далее мы будем называть того, кто создает тесты, экзаменатором, а того, кто сдает, студентом, это лишь условные названия.
- Предлагаемые технологии: фреймворк (Symfony 3-4 (сложнее, но интереснее), Yii2, Laravel), MySQL или Postgres, шаблонизатор Twig, ORM Doctrine
- Время выполнения: все зависит от тебя, но я бы смотрел на 4-6 недель
- Уровень: очень продвинутый новичок
- Требуемые знания: PHP, MVC, ООП, HTML/CSS, SQL, основы JS
Для проверки, что сайт работает правильно, мы будем использовать автоматизированное тестирование (у меня есть урок на эту тему).
Так как задача большая, то ты можешь захотеть делать ее по частям. Можно выбрать такой порядок:
- создание и прохождение тестов без регистрации
- покрыть это тестами
- просмотр экзаменатором таблицы результатов сдачи тестов
- покрыть тестами
- регистрация/логин
- покрыть тестами
- продвинутая статистика, экспорт/импорт
- покрыть тестами
Вот вайрфреймы для страниц: https://gomockingbird.com/mockingbird/#l0bk13j . Дизайна пока нет, есть только такие наброски, из которых видно какие страницы должны быть на сайте и что на них расположено. Далее я опишу их подробнее:
/
- Главная. Содержит информацию о сервисе, кнопки для входа/регистрации и список из нескольких самых популярных за последний месяц тестов. Для теста выводятся теги (темы), число прошедших и число пробовавших сдать тест.
/tests
- Список тестов. Содержит список всех тестов на сайте, с постраничным отображением. Кликнув на тему, можно отобразить только тесты из этой темы (при этом она будет вписана в поле поиска). Есть поле поиска, в которое можно ввести тему или слово из названия теста, для отображения только тестов на эту тему или содержащих слово в названии (можно подумать над тем, чтобы искать не только в названии, но и в описании теста). Поле ввода поддерживает автодополнение названий тем.
/new
- Создать тест. Начальная страница для создания теста (эта же страница используется для редактирования тестов). Мы не требуем регистрации для того, чтобы создавать тесты (но регистрация дает возможность смотреть все созданные тесты и результаты их прохождения в личном кабинете). Для создания теста надо указать обязательное название, небязательные теги-темы (работает автодополнение названий тем), необязательное ограничение по времени. Можно добавить предисловие (с возможностью форматирования в wysiwyg редакторе).
Теги (темы) — можно указать любые, через запятую, при этом все введенные теги собираются в таблицу и используются для автодополнения. Регистр букв в теге не имеет значения, «физика» и «Физика» — один тег (возможно стоит их принудительно переводить в нижний регистр). Если теги различаются только знаками пунктуации, то же самое (теги могут содержать только знаки дефис, запятая, точка (не в конце названия)).
Ниже расположен редактор вопросов. Можно добавить любое число вопросов, каждый вопрос может быть одного из нескольких типов:
- один ответ из списка
- несколько вариантов из списка
- ввод числа (с указанием допустимой погрешности)
- ввод текста (можно указать несколько вариантов ответа, которые будут считаться правильными)
Для вопроса указывается число баллов за ответ на него, варианты ответа.
Вопросы можно переупорядочивать. Так как вопросы большие и таскать их неудобно, можно при попытке перетащить вопрос выводить слева уменьшенный список номеров, на который можно перетащить сам вопрос. Также, можно разрешить редактировать номер вопроса для этой цели.
Один из вопросов находится в режиме редактирования, другие вопросы просто выводятся (с указанием числа баллов и отмеченным правильным ответом). Клик по неактивному вопросу (или по кнопке "редактировать" у него) переводит его в режим редактирования.
Желательно проверять правильность заполнения полей до отправки формы на сервер, например, если не заполнено название, то клик по кнопке «Создать тест» должен прокручивать страницу к нему и выводить рядом сообщение о том, что это обязательное поле.
После нажатия кнопки «Создать тест», если все правильно, экзаменатор попадает на страницу публикации теста.
/publish/NNN
— страница публикации теста. Здесь, если пользователь не зарегистрирован, мы неназойливо рассказываем ему о преимуществах регистрации и предлагаем быструю регистрацию.
Также, предлагаем указать email для отправки уведомлений о прохождении теста (с возможностью просмотреть список ответов ). По идее, этот email надо бы подтверждать (мы не хотим рассылать письма на неподтвержденные адреса, чтобы не попасть в спамеры), но пока можно сделать без подтверждения. Если пользователь зарегистрирован, то тут выводится его email, и он может указать другой или очистить поле.
На этот email выслается напоминание со всей нужной информацией и ссылками после публикации теста, чтобы пользователь всегда мог иметь их под рукой.
Ниже выводится крупная заметная ссылка на прохождение теста, которую легко скопировать и опубликовать в соцсетях (для особо ленивых сделаны кнопки) или отправить по почте. При публикации ссылки в соцсети должно выводиться название теста, название сайта «Пройти тест «XXX» на сайте testhub», ссылка для перехода и логотип сайта (для этого есть микроразметка OpenGraph). Если не боишься трудностей, можно также (через публикацию картинки) выводить число прошедших тест и средний балл.
Также, есть ссылка «просмотреть», по которой можно увидеть как тест будет выглядеть для студента.
Еще ниже выводится специальная ссылка просмотра результатов тестов экзаменатором (если известен адрес почты экзаменатора, то она высылается в письме после публикации). Если пользователь зарегистрирован, то он всегда может увидеть результаты в своем аккаунте, а если нет то только по секретной ссылке. Ссылка дает доступ только к одному тесту, потому ей можно поделиться, например, с коллегами-экзаменаторами.
Ниже находится ссылка «перейти к списку моих тестов». Она выводится для зарегистрированных пользователей.
/register
— страница регистрации. Почти на каждой странице есть ссылка на нее. При этом надо сохранять исходный URL, откуда пришел пользователь, и после регистрации, возвращать его на ту же страницу. Также, надо перенести в аккаунт все созданные им анонимно тесты и результаты тестов.
Мы с уважением относимся к приватности, потому для регистрации требуется только логин и пароль (не разрешаем вводить слишком простые вроде 123456). Мы также рекомендуем, но не требуем, указать Email (при этом высылается письмо для подтверждения. Пока адрес не подтвержден, на него не высылаются уведомления) и имя (которое отображается на сайте). Так как пользователи забывчивы, при входе на сайт можно вводить либо email, либо логин.
Также, пользователь может зарегистрироваться через соцсети (первый вход через соцсеть и есть регистрация). Если соцсеть не отдает email пользователя, то показываем окошко или страницу с предложением его ввести (можно отказаться). У одного пользователя может быть несколько аккаунтов соцсетей (а также вход через логин + пароль), это надо предусмотреть в архитектуре БД, но делать склеивание аккаунтов пока не треуется (но можно и сделать если хочется).
Зарегистрировавшись, пользователь получает аккаунт, в котором собраны все созданные тесты, результаты их прохождения и пройденные пользователем тесты.
/login
- страница входа на сайт. Ссылка «войти с паролем», которая есть почти на каждой странице, ведет сюда (как альтернатива, можно сделать вместо перехода на страницу открытие всплывающего окна, это будет неплохо). После логина пользователь перенаправляется на ту же страницу, откуда пришел. Пользователь может ввести как логин, так и email (различить их можно по наличию символа @
).
Стоит предусмотреть защиту от перебора паролей ограничением попыток ввода пароля с одного IP в одну единицу времени.
Также, войти можно через соцсети, при этом первый вход по сути является регистрацией.
Если пользователь забыл пароль, он может ввести email и получить ссылку. Пользователь, у которого нет пароля и который вошел через соцсети, может таким способом задать пароль (если конечно он указал email при регистрации). Пользователь, который не указал email, не может восстановить пароль.
/test/NNNN
— входная страница теста. На ней выводится название, описание теста, правила его сдачи и краткая статистика, а ниже находится кнопка «Начать тест». По нажатию на нее начинается тест и отсчет времени.
/test/NNN/question
- страница вопроса теста. Показывается сколько осталось времени, текущий вопрос и дается возможность ответить на него. Можно возвращаться к предыдущим вопросам. Можно не отвечать на вопрос. Контроль времени должен вестись на сервере, чтобы его нельзя было обойти.
/test/NNN/result
— страница результатов теста. Показывает число набранных баллов. Если пользователь не зарегистрирован, то предлагается ввести имя, под которым он будет виден в таблице результатов у преподавателя. Также, тут находится возможность быстро загрегистрироваться.
Если экзаменатор при создании теста разрешил это, можно перейти на страницу просмотра списка неправильных и правильных ответов.
Для зарегистрированных пользователей доступен личный кабинет, в котором можно смотреть созданные тесты, результаты их прохождения, результаты прохождения других тестов. Для незарегистрированных пользователей доступны только результаты прохождения созданных ими тестов по специальной ссылке.
Результаты и списки отображаются в виде таблиц. Таблицы можно сортировать по доступным колонкам и фильтровать с помощью строки поиска.
Таблицу можно экспортировать (скачать) в форматах CSV, XLS, XML, JSON, TXT (просто текстовый список). При этом они будут отсортированы и отфильтрованы так же, как отсортирована таблица на экране (об этом должно выводиться предупреждение).
В меню справа цифры вроде (+2)
показывают число новых (с момента последнего просмотра результатов) результатов тестов. Выводятся несколько тестов с наибольшим числом новых результатов.
Должна быть ссылка для выхода из личного кабинета.
/stat/result/NNN
— результаты сдачи теста. Выводится список учеников, сдавших тест, дата, число попыток, набранные баллы. По умолчанию сортируется по убыванию даты. Для каждого результата можно просмотреть подробности (список отвеченных/неотвеченных вопросов и потраченное время), аннулировать результаты, дать дополнительные попытки.
Результаты можно фильтровать по имени (выводятся все имена, содержащие введенную строку), числу баллов (выводятся все результаты с равным или выше указанного числа баллов или ниже, если введено число в форме < 200
) или дате (при вводе конструкций вроде 2014-01-01
, > 01.12.2014
).
Надо подумать, как рассказать пользователю о возможностях фильтра. Можно показывать подсказку при установке курсора в поле, можно выводить кнопки «до даты», «после даты», вставляющие нужные конструкции в поле.
Таблицу можно сортировать по дате, имени, числу баллов, числу попыток.
/stat/passed
— сданные мной тесты. Выводится список сданных ранее тестов, по умолчанию сортируется по убыанию даты. Для каждого теста можно просмотреть подробности, если преподаватель это разрешил.
Фильтровать можно по названию, дате, числу баллов.
/stat/results
— список созданных мной тестов. Отображается список тестов и число новых непросмотренных результатов. По умолчанию список сортируется по числу новых результатов, а далее по дате последней сдачи теста.
Дополнительные задачи:
Cделать импорт тестов из популярных форматов Moodle XML и Moodle GIFT. Moodle — это популярная open source платформа для создания электронных курсов. Это позволит нам переманить преподавателей, которые уже сделали тесты в этой системе.
Ссылки:
- формат Moodle XML (англ) https://docs.moodle.org/28/en/Moodle_XML_format
- формат GIFT (англ) https://docs.moodle.org/23/en/GIFT_format
- формат GIFT (рус) http://www.edu.ru/moodle/help.php?module=quiz&file=formatgift.html
- пример файла GIFT: http://www.edu.ru/moodle/question/format/gift/examples.txt
- пример Moodle XML: http://moodle.net/pluginfile.php/23214/mod_data/content/1348/Identifying%20oxidising%20and%20reducing%20agents.xml
- архив тестов: http://moodle.net/mod/data/view.php?id=3
Сделать импорт из WebCT: http://glow.williams.edu/help.php?file=formatwebct.html&module=quiz
Сделать экспорт тестов в форматах Moodle XML, GIFT, DOC, TXT. Последние 2 нужны на случай когда преподаватель хочет послать тест например на утверждение. В них должно быть название теста, описание, время на прохождение и макс. число баллов, вопросы, варианты ответов, прямоугольники для ввода/выбора ответа (в случае если файл распечатать).
Можно дополнительно добавить еще экспорт в PDF.
Печать теста. Преподаватель может захотеть распечатать тест для заполнения ручкой. Стоит сделать тест компактным (бумагу надо экономить). Вывести на странице необходимо название, опичание теста, время на прохождение, максю число баллов, вопросы, варианты, поля для заполнения.
Печать результатов теста (или любой другой таблицы из личного кабинета). Надо скрыть лишние элементы страницы, оставив только таблицу с данными. Постарайся сделать ее компактной, чтобы не тратить бумагу. При этом таблица дложна быть отсортирована и отфильтрована в соответствии с выбранными настройками (об этом должно быть выведено предупреждение).
Сделать возможность редактировать имя, email, менять пароль.
Возможность оформлять текст вопроса в редакторе, добавлять картинки перетаскиванием из папки в браузер, а также прикладывать аудио/видео.
Сделать поддержку MathML + редактор для вставки формул в вопросы и варианты ответов. Сделать поддержку какого-нибудь языка разметки для химических формул.
Сделать верстку для удобного просмотра сайта на маленьких (мобильных) экранах.
Возможность после прохождения теста запостить результаты в соцсеть.
Все формы (а также ссылки вроде разлогинивания) должны быть защишены от CSRF токеном.
Старайся максимально использовать возможности фреймворка, а не писать велосипед. Например, формы, гриды, защиту от CSRF, модели, миграции БД.
На странице списка тестов можно использовать jQuery UI Autocomplete для автодополнения тем (а может быть и названий тестов?).
Для поиска тестов достаточно использовать SQL запрос вроде name LIKE '%квантовая%' AND name LIKE '%физика%'
, если тестов будет немного, если много (и тебе хочется сделать посложнее), то стоит сделать полнотекстовый поиск или подключить Sphinx.
Реализовать редактор вопросов можно разными способами. Можно попробовать обойтись HTML формой + дополнительными JS-скриптами. Например, для перетаскивания вопросов попробовать jQuery UI Sortable или jQuery UI draggable. Сама информация в вопросах сохраняется в видимых или скрытых полях и отправляется на сервер как обычная форма. Проверку правильности надо сделать как на клиенте, яваскриптом, так и на сервере. Желательно, чтобы описания полей брались из одного источника, а не дублировались.
Реализовать переход вопроса из редактируемого в обычное состояние можно за счет средств CSS, стилизовать поля ввода и textarea в неактивном вопросе так, чтобы они выглядели как обычный текст.
Другой вариант - написать мини-приложение для редактирования вопросов на каком-нибудь JS фреймворке вроде Vue, React, Angular, Knockout итд. С сервером оно может общаться через AJAX API. API желательно документировать в формате вроде Swagger или OpenAPI. Тогда список вопросов будет загружаться и сохраняться на сервер в виде JSON-массива, но я не уверен что это будет проще. Это потребует хороших знаний JS, но даст возможность сделать более мощный редактор.
В базе данных логично сделать одну таблицу для тестов, одну для вопросов и может быть еще одну для вариантов ответов и связать их внешними ключами.
Поля ввода, которые позволяют вводить форматированный текст, надо реализовать на основе какого-нибудь (желательно нетяжелого) wysiwyg-редактора. Если редактор состоит из кучи мелких файлов, надо изучить докуменатцию и освоить автоматическую их сборку, иначе страница будет грузиться очень медленно. Естественно, HTML который вводится в это поле, может содержать что угодно, потому на сервере надо его очистить от опасных конструкций. Для этого можно использовать мощную библиотеку HTMLPurifier или встроенный в Yii (если он используется) HTML-фильтр.
Как реализовать доступ экзаменатора к тестам и результатам их сдачи без регистрации? Один из вариантов - генерировать для каждого теста специальный код доступа. Его можно встроить в ссылку и выслать ссылку на почту, если она известна. Также, после создания теста можно добавить пользователю куку для доступа к нему с того же компьютера. Что лучше - использовать одну куку для всех созданных тестов, или новую куку на каждый тест - это отдельный вопрос. Опционально можно подумать, как добавить в аккаунт ранее созданные анонимно тесты. Один из вариантов - это предложить пользователю ввести секретную ссылку для подтверждения, что у него есть доступ к тесту.
Раньше у меня была еще такая идея: для переноса созданных анонимно тестов в аккаунт после регистрации можно выдавать каждому гостю сайта уникальный id в куках. Как только он создает или проходит тест, мы создаем анонимного пользователя в таблице и привязываем к нему тест или результаты. Соответственно, когда он зарегистрируется, мы просто добавляем этому анонимному пользователю имя и возможность логиниться на сайт, а все тесты остаются в аккаунте. Таким образом нам удается с одной стороны отказаться от обязательной регистрации, с другой не терять созданные тесты.
Этот подход имеет тот недостаток, что создает путаницу. Ну например, один человек на компьютере создал тест, другой позже завел аккаунт и ему приписался этот тест. Также, непонятно что делать, если человек сначала создал тест анонимно, а потом залогинился. А потом разлогинился. Добавится ли тест в аккаунт? Останется ли доступ к нему после выхода? Такие вещи неочевидны для пользователей, никак не отображаются на сайте и будут их путать.
Отдельная тема — регистрация. Вот какие особенности стоит учесть:
- у пользователя может быть не указан email (если он вошел через соцсеть или не захотел его указывать)
- у пользователя может не быть пароля, при этом войти через форму логина невозможно
- у пользователя может быть несколько аккаунтов соцсетей + вход через пароль (хотя возможности пока такой нет, но предусмотреть это стоит)
Для реализации этого стоит сделать 2 таблицы: пользователи и внешние аккаунты.
Для реализации входа через соцсети надо иметь аккаунт и зарегистрировать там приложение. Если ты не хочешь их заводить, проще всего реализовывать вход через twitter — там вроде ничего кроме email не требуется, в facebook/vk придется подтвердить телефон.
Если соцсеть отдает больше данных, чем нам требуется, стоит сохранить их на будущее (вдруг завтра мы добавим аватарки?).
Не указывай секретные токены и id приложений в коде или конфигах, которые ты выгружаешь в репозиторий.
Когда ты будешь реализовывать вход через внешние сети, постарайся сделать все в стиле ООП, например, HTTP-клиент сделать в виде отдельного объекта, а не встраивать в код, и писать так, чтобы без изменений систему входа можно было перенести на любой другой сайт. Тогда тестировать эту систему потом будет гораздо легче.
Многие сервисы сейчас используют протокол OAuth (или OAuth 2) для входа через них, но каждый немного по-своему. Это упрощает жизнь разработчикам. Если соцсеть предоставляет возможность получить email, не забудь его попросить. Есть готовые библиотеки для реализации входа через соцсети, например, SocialConnect/auth, HybridAuth, HWIOAuthBundle, knpuniversity/oauth2-client-bundle. Этот список, конечно, может устареть со временем.
Ссылки на описание API:
- Twitter: https://dev.twitter.com/web/sign-in/implementing (англ.)
- Vk: http://vk.com/dev/auth_sites (у вконтакте еще есть их собственное OpenAPI, рекомендую его не использовать)
- Facebook: https://developers.facebook.com/docs/reference/dialogs/oauth?locale=ru_RU (англ.)
- Ok: http://apiok.ru/wiki/pages/viewpage.action?pageId=42476652
Также, раньше был еще протокол OpenID, который позволял пользователю хранить информацию о себе не в соцсетях, а на своем сервере и авторизовываться через id вроде user@server.example.com, но он как я понимаю, так и не взлетел, используется мало где, а люди предпочли сдать свои данные соцсетям.
Статьи:
- http://habrahabr.ru/company/mailru/blog/115163/ (про OAuth 2)
- http://geektimes.ru/post/77648/
- http://habrahabr.ru/post/145988/
- http://geektimes.ru/post/117211/
Также, есть сервисы вроде ulogin, которые предосталвяют простой вход через соцсети добавлением скрипта на страницу. Не используй их. Во-первых, так ты ничему не научишься, во-вторых, они следят за твоими посетителями (даже если они не логинятся), и подгружают кучу сомнительных ифреймов в страницу (найди какой-нибудь сайт с такой системой и посмотри сам инспектором).
Для взаимодействия с API нужно отправлять HTTP-запросы. Используй какую-нибудь готовую библиотеку, например Guzzle сейча популярен.
На фейсбуке ты можешь для тестов входа через сайт создавать специальных фейковых пользователей — это удобно.
Для вывода таблиц с результатами в твоем фреймворке наверняка что-то есть. В Yii есть grid, в Symfony 2 есть какой-нибудь сторонний плагин.
Для работы с XML при экспорте/импорте стоит использовать DOM XML или SimpleXML. При экспорте давай нормальные имена файлам, например Основы физики.txt
или Результаты теста Основы физики (c фильтром).xls
, а не бессмысленный набор цифр. Сам подумай, удобно ли когда у тебя полная папка файлов типа test_sdas4d423asd.txt?
Для экспорта в XLS стоит использовать https://github.com/PHPOffice/PHPExcel (там еще есть библиотека для чтения/записи DOC https://github.com/PHPOffice/PHPWord ).
Для экспорта в PDF можно использовать либо wkhtmltopdf (он конвертирует HTML в PDF) либо DOMPDF: http://habrahabr.ru/post/190364/
Если ты не писал раньше тесты, у меня есть урок по ним и по используемым для этого инструментам: https://gist.github.com/codedokode/a455bde7d0748c0a351a .
Разумеется, такой сложный сайт надо покрыть тестами (иначе как проверить что все работает? Вручную прокликивать десятки кнопок и ссылок?). Чтобы помочь тебе, я составил примерный план тестирования. Он большой и сложный, но как иначе научиться тестировать? У тебя же есть голова, подумай как сделать это с минимумом усилий.
- Проверить что число баллов при сдаче теста считается правильно
- Проверить что «самые популярные за месяц» тесты считаются правильно
- Создание теста (так как тут используется JS то некоторые тесты возможно надо писать c его поддержкой)
- Проверить добавление одного нового вопроса
- Проверить переключение типа вопроса
- Проверить что при переключении типа вопроса варианты ответа не теряются
- Проверить добавление/удаление/перемещение вариантов ответа
- Попробовать неправильно заполнить свойства теста
- Попробовать неправильно заполнить свойства вопроса
- Проверить что удаление вопроса работает
- Проверить что изменение порядка вопросов работает
- Проверить работу кнопок «добавить предисловие», «убрать ограничение времени»
- Проверить сохранение теста с вопросами всех возможных типов
- Проверить сохранение тегов
- Проверить автодополнение тегов
- Редактирование теста
- Проверить что можно открыть редактирование теста из БД
- Проверить удаление/добавление/перемещение вопросов с сохранением
- Проверить удаление/добавление/перемещение вариантов ответа с сохранением
- Проверить изменение свойств вопроса с сохранением
- Проверить изменение типа вопроса с сохранением
- Проверить изменение свойств теста с сохранением
- Публикация теста
- Проверить для зарегистрированного пользователя подставляется его email и выводится ссылка «мои тесты», а для гостя нет
- Проверить что введенный email (а также пустой email) сохраняется
- Проверить что выводится рабочая ссылка на тест и просмотр резуьтатов
- Проверить что работает ссылка на предпросмотр теста
- Проверить что кнопки шаринга не вызывают JS-ошибок и вызывают появление окон или еще чего-нибудь
- Проверить что работает кнопка быстрой регистрации
- Проверить что преподаватель получает email уведомление со ссылками
- Входная страница теста
- Проверить что выводится название, описание, автор теста
- Проверить что выводится верная статистика по тесту
- Проверить кнопку «Начать тест»
- Сдача теста
- Проверить что вопросы показываются
- Проверить что ответы сохраняются
- Проверить что можно перемещаться вперед/назад не теряя введенных ответов
- Проверить что время учитывается
- Проверить что нет JS ошибок
- Результат теста
- Проверить что показывается число набранных баллов
- Проверить что можно ввести и сохранить имя
- Проверить что для авторизованного пользователя имя не спрашивается и нельзя сохранить даже прямой отправкой аякс-запроса
- Проверить работу кнопки быстрой регистрации
- Проверить что если разрешено, показана ссылка просмотра ошибок
- Проверить что если запрещено, просмотреть ошибки в тесте нельзя
- Главная
- Проверить что выводится список популярных за последний месяц тестов
- Тесты
- Проверить что можно искать тесты по тегу
- Проверить что можно искать тесты по части названия
- Проверить постраничную навигацию в сочетании с поиском
- Регистрация
- Проверить что регистрация возможна
- Проверить ввод неправильных данных в форму
- Проверить что после регистрации пользователь залогинен
- Проверить что после регистрации пользователь перенаправляется на исходную страницу
- Проверить что тесты и результаты сдачи переносятся в аккаунт пользователя
- Проверить что высылается письмо со ссылкой подтверждения email
- Проверить что ссылка подтверждения работает
- Логин
- Проверить логин при вводе правильных данных
- Проверить форму логина на неправильных данных
- Проверить что после логина пользователь перенаправляется на исходную страницу
- Проверить что кнопка вход через соцсети открывает нужное окно
- Проверить вход через соцсети если возможно сделать это с заглушкой
- Проверить если возможно что первый вход через соцсети работает как регистрация
- Проверить если возможно что email спрашивается если соцсеть его не отдала
- Проверить разлогинивание
- Восстановление пароля
- Проверить можно выслать письмо со ссылкой
- Проверить ввод неправильного email
- Проверить что ссылка восстановления пароля работает
- Проверить что ссылка восстановления пароля работает ограниченное время
- Проверить что ссылка восстановления пароля работает только один раз
- Личный кабинет
- Проверить что неавторизованный пользователь не может попасть в ЛК
- Проверить что неавторизованный пользователь может смотреть результаты своего теста по ссылке
- Проверить что выводится список сдавших тест
- Проверить постраничную навигацию в сочетании с сортировкой и фильтром (что фильтр/сортировка не сбрасывается)
- Проверить что сортируется список сдавших тест
- Проверить что фильтруется список
- Проверить что экспортируется список с учетом фильтра и сортировки
- Проверить вывод дополнительной информации в сайдбаре
- Smoke тесты
- Обойти страницы и проверить отстутвие битых ссылок
- Обойти страницы и проверить отсутствие JS ошибок
- Обойти страницы и проверить отсутствие JS ошибок при нажатии любых кнопок, установки курсора в поле, ввода любых символов, отправке форм
Сайт использует внешние сервисы (соцсети). Нехорошо в тестах взаимодействовать с ними без надобности, надо подумать как заменить их (и отправляемые ими данные) заранее заготовленными заглушками.
Пока не сделан. Вот наброски:
- создание теста http://i.imgur.com/LUwoqvH.png
- регистрация http://i.imgur.com/ajJXtZC.png
- ЛК http://i.imgur.com/OBBKmbJ.png
Интересно изучить, как сделать, чтобы сайт мог выдержать большой поток посетителей? Тогда надо наполнить базу сущностями, и протестировать его с помощью Apache Benchmark или, что лучше, Siege. Возможно, где-то стоит запрос оптимизировать, где-то кеш добавить.
Если тебе станет грустно смотреть на полупустой сайт, или захочется проверить, а как он поведет себя если добавить много данных, можно написать генератор данных для создания преподавателей, студентов, тестов, вопросов, ответов, результатов.
Я вижу примерно такой вариант:
yiic fill students:90 teachers:5 tests:7 questions:200 results:35
Синтаксис можно поменять. Должны генерироваться и связываться между собой все указанные сущности в нужном числе.
Источники данных для генератора:
UPD: есть библиотека faker https://github.com/fzaninotto/Faker которая все это умеет генерировать (в случае использования Doctrine — сразу заполнять сущности), так что списки ниже тебе наверно не понадобятся.
Имена:
- можно попробовать сгенерировать и получить список здесь: http://www.fakenamegenerator.com/order.php
- Можно взять отсюда (здесь с синонимами): http://web.archive.org/web/20120615234550/http://kovtun-andrei.narod2.ru/habr/synonym_name.txt
- Можно отсюда (большой годный список): http://www.gramota.ru/slovari/info/petr/imsm/
Фамилии:
- http://ru.wikipedia.org/wiki/Список_общерусских_фамилий
- http://pppz.wordpress.com/2012/08/19/база-фамилий-скачать/
- http://www.familytree.ru/ru/dbf.htm
email — можно сгенерировать в fakenamegenerator или как-нибудь самому, из имен например.
Попробуй сделать списки (не знаю, в каком формате — можно txt файл с значениями на отдельных строках, или json) исходных данных и прикрутить генератор. Совсем сильно заморачиваться не надо, главное чтобы мы могли заплнить базу правдоподобными значениями.
Вот пример моего генератора случайных текстов: https://github.com/codedokode/board-test-scripts
алло