Тестирование декоратора, который оборачивает маршруты API

Я создаю API для отдыха, прокладывал маршруты для API и наткнулся на проблему. Я использую flask restplus для создания API и зефира для проверки json, отправленного клиентом.

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

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

Моя единственная проблема заключается в том, что я понятия не имею, как это модуль протестировать. Я написал тесты для конкретных схем json зефира, чтобы проверить, вызывают ли они правильные ошибки проверки, когда им передаются недопустимые данные. Однако теперь мне нужно протестировать маршруты API, чтобы проверить, возвращают ли они ошибки проверки, вызванные схемами. Это похоже на большое количество повторений модульных тестов, потому что я проверяю одни и те же ошибки при тестировании схем и снова, когда я тестирую маршруты/декоратор API.

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

Заранее спасибо.


person Yang K    schedule 14.02.2019    source источник


Ответы (1)


Это может быть вопрос мнения.

Я не думаю, что полезно тестировать все схемы, если только они не включают какой-то пользовательский код, такой как настраиваемые поля, валидаторы и т. д. Нет необходимости тестировать сам зефир, так как он уже широко покрыт собственными тестами. Таким образом, тестирование схемы зефира будет служить только для проверки того, что вы ввели правильные имена полей и валидаторы. Это было бы довольно многословно для низких пособий, ИМХО.

Я бы протестировал декоратор: создал фиктивный тестовый маршрут, украсил его, проверил, возвращается ли правильная ошибка.

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

Кто-то возразит, что, наоборот, их волнует только сам API и им нужно только тестировать маршруты. Но это означает тестирование всех случаев на всех маршрутах, так что это много дублирования. И я не думаю, что это квалифицируется как модульное тестирование, скорее как интеграционное тестирование.

Обратите внимание, что вы можете попробовать использовать webargs (поддерживаемый командой marshmallow) для замены вашего декоратора, но я не знаю, насколько легко его интегрировать в flask-restplus.

person Jérôme    schedule 15.02.2019
comment
Что делать, если у вас есть собственные валидаторы для схем зефира. Разве все еще не стоит проводить модульное тестирование каждой схемы или хотя бы каждого валидатора? - person Yang K; 15.02.2019
comment
Да, конечно. Протестируйте код, который принадлежит вам, и предположите, что библиотека покрыта собственными тестами. (Зефир имеет обширные тесты.) - person Jérôme; 15.02.2019
comment
Как убедиться, что пользовательские валидаторы, которые я создал для схем зефира, действительно работают, не создавая для них модульные тесты? - person Yang K; 15.02.2019
comment
Итак, вы говорите, что я должен тестировать пользовательские валидаторы, которые я создал для зефира, потому что это мой код, но не беспокоиться о тестировании встроенных валидаторов? Кроме того, я должен протестировать декоратор, чтобы убедиться, что он работает правильно, и проверяю ли я каждый маршрут API исключительно на основе мнений? Это ты правильно говоришь? @Жером - person Yang K; 15.02.2019
comment
Да. Точно. Я отредактировал свой ответ, чтобы, надеюсь, прояснить это. - person Jérôme; 15.02.2019