Суть задания заключается в реализации API к базе данных проекта «Форумы» по документации к, собственно, этому API, т.е. эдакий реверс-инжиниринг. Таким образом, на входе:
- документация к API
На выходе:
- поднятый и настроенный MySQL
- БД где будет хранится информация об основных сущностях системы
- вэб-сервер, который будет отвечать на внешние запросы, обращаясь к БД
После написания API правильность реализации будет проверяться с помощью автоматического функционального тестирования. Методика тестирования:
- запускается скрипт на python, который будет проводить тестирование
- он опрашивает все методы, определенные в API, по шаблону http://{{student_ip}}/db/api//{{entity}}/{{method}}/ с заранее заданными\случайными параметрами, корректными относительно документации (в POST-запросах передается json, GET - как обычно)
- ответы вашей системы сравниваются с эталонами
- если код http ответа не 200, то тест считается проваленным
- если в ответе не хватает каких-то полей или значение каких-то полей не совпадает, то тест считается проваленным
- если нет ни одного неправильного ответа, то тест считается пройденным
- результат тест отправляется вам на почту
##FAQ
- Что нужно ответить, если создаваемый объект\связь уже существует?
- Нужно ответить этим уже созданным объектом для всех сущностей, кроме юзера. В случае юзера вернуть ошибку (см. п. 4 и 2)
- Что такое code в ответах на запросы?
- Код возврата:
- 0 — ОК,
- 1 — запрашиваемый объект не найден,
- 2 — невалидный запрос (например, не парсится json),
- 3 — некорректный запрос (семантически),
- 4 — неизвестная ошибка.
- 5 — такой юзер уже существует
- Юзер может несколько раз голосовать за один и тот же пост или тред?
- Да
- Что отвечать в случае ошибки?
- {"code": code, "response": error message}
- Что делать при удалении треда\поста?
- Сущность помечается, как isDeleted. Для поста помечается только он сам, для треда - все его внутренности. При этом удаленные сущности не учитываются при подсчете, например, количества постов в треде, но передаются в теле ответа.
- Уникален ли username?
- Нет, уникален email
- Уникален ли name у Forum?
- да, как и shortname
- Что такое related user у Forums.details?
- Показать полную информацию о создателе форума (вместо просто его email-а)
- Что за типы сортировок для постов ['flat', 'tree', 'parent_tree']?
- Есть три вида сортировок с пагинацией, они оказываются очень интересными:
- по дате (flat), комментарии выводятся простым списком по дате,
- древовидный (tree), комментарии выводятся отсортированные в дереве по N штук,
- древовидные с пагинацией по родительским (parent_tree), на странице N родительских комментов и все комментарии прикрепленные к ним, в древвидном отображение,
У всех вариантов есть asc и desc сортировки. Подробнее тут: https://tech-mail.ru/blog/database/2027.html 10. Как запускать тесты локально?
- python func_test.py -l --address=127.0.0.1:5000 . Другие опции смотри по ключу -h
- Как провести нагрузочное тестирование локально?
- python perf_test.py -l --address=127.0.0.1:5000 заполнит вашу базу согласно опциям из конфига (см. test.conf) и создаст файлик me_httperf_scenario. Его нужно подавать на вход httperf так: httperf --hog --client=0/1 --server=127.0.0.1 --port=5000 --uri=/ --send-buffer=4096 --recv-buffer=16384 --add-header='Content-Type:application/json\n' --wsesslog=100,0.000,me_httperf_scenario . Запускать на 5 минут, смотреть на Reply rate -> avg
#API Documentation
##Общие
##Forum
##Post
##User
##Thread