Я пишу CRUD-приложение на Python, которое экспонирует веб-API. Сначала я написал функции для взаимодействия с БД и написал тесты для этих функций.
def crud():
# do something with db
def test_crud():
crud()
# check crud tables now have all required rows
Затем я написал функции для маршрутов API, которые делают некоторую проверку ввода, а затем просто вызывают соответствующую грубую функцию. Все, что делают API функции, это вызывают crud
функции внутри себя и возвращают результат. Тесты для них выглядят следующим образом:
def api():
# do some api stuff
return crud()
def test_api():
resp = api()
# check response body has what we expect
# check crud tables now have all required rows (1)
Здесь (1)
это уже было для меня звоночком, но неважно.
Затем мне пришлось добавить новый module
, который что-то делает с DB, вызывает какую-то crud
функцию и должен использоваться в api
функции вместо crud
функции.
def module():
# do some stuff
crud()
# do some stuff
def api():
# do some api stuff
return module()
Итак, теперь тесты выглядят следующим образом:
def test_crud():
crud()
# check crud tables now have all required rows
def test_module():
module()
# check module tables now have all required rows
# check crud tables now have all required rows
def test_api():
resp = api()
# check response body has what we expect
# check module tables now have all required rows
# check crud tables now have all required rows (1)
Меня беспокоит то, что я проверяю одно и то же в трех местах, и в случае каких-то изменений мне придется трижды редактировать по сути один тест. Я не думаю, что мне следует удалять, например, проверки из test_api()
, связанные с побочными эффектами вызываемых изнутри функций, потому что меня волнует как ответ API, так и эти эффекты.
Я читал похожие вопросы типа "нужно ли тестировать только публичные методы или приватные тоже?", где, в общем, ответ был "тестируйте публичные методы, но не приватные". Применимо ли это к моей ситуации, нужно ли мне удалить тесты для crud
и module
и оставить только test_api
, который тестирует все то, что делают первые два?
Концепция, которая всегда оставалась со мной в разговоре с группой пользователей о тестировании, заключается в следующем:
Таким образом, все тесты в вашем примере могут быть ценными, но каждый из них должен проверять определенный уровень абстракции, а не просто утверждать одно и то же. Для каждого уровня учитывайте: