Как тестировать API, если состояние приложения меняется?
Хочу научиться тестировать API, но не понимаю как это сделать.
Чтобы что-то тестировать нужен сервер, на котором приложение развернуто. В момент отправки запроса состояние сервера изменится и во время следующей прогонки тестов тот же самый запрос зафейлится.
Т.е. меня интересует не то как писать сами тесты (используя postman или что-то еще), а то как быть с состоянием приложения.
Тестировать придется сразу и сервер и клиент, откатывая перед запуском теста и в процессе состояние сервера до некого стартового/требуемого для соответствующего теста.
Если это не ваш сервер, то сочувствую. Придется тестировать с учетом этой особенности. К тому же нормальные системы предлагают тестовые сервера, чтобы, к примеру, если для теста требуются к примеру деньги на депозите (тестирование финансовых сервисов, да просто покупки)
1) Есть сервер с развернутым приложением
2) Есть тестироващик, который использует, например, Postman
Я не думаю, что тестировщик должен иметь доступ к серверу и иметь возможность "сбрасывать" состояние приложения к некоему дефолтному состоянию. Или должен?
Нужен специальный тестовый сервер и окружение (например локальный dns, подменяющий адрес рабочего сервера или отдельные конфиги самого приложения, направляющие его на тестовый сервер) который должен уметь устанавливать свое состояние по команде юнит тестов.
Наполнение тестовой базы данных, отдельный не простой разговор. Синтетические данные хороши, быстры (их можно сделать мало), но могут не учесть всей специфики пользовательской задачи и тесты проходящие на ней могут не пройти на боевой базе. Но бывает что доступ к самим продакшен данным тестерам давать нельзя по юридическим причинам (приватные данные), и вот тогда придется поизвращаться (замазывание/подмена всего что критично).
В простом варианте - скрипты поднимают в докере сервер и базу данных из указанного бакапа а по окончании тестов этот сервер удаляют. Юнит тесты же должны как минимум быть с пометкой, какая версия базы данных им нужна. Само собой, существуют ситуации, часто, когда тесты требуют последовательно взаимо связаные состояния сервера (т.е. например один тест создает объект, второй его редактирует, третий удаляет, логично что они должны выполняться последовательно либо каждый раз должны откатывать на заранее подготовленную базу данных, что медленнее но надежнее).
Состояние сервера можно хранить снапшотами виртуальной машины (их поддерживают практически все известные), это значительно быстрее но очень требовательно к месту на диске.
p.s. я не участвовал в крупном проекте где требовалось бы так тестировать, а там где требовалось, стратегия запуска тестов требовала только одно стартовое состояние базы данных сервера, а затем куча тестов выполнялось последовательно в непротиворечивом порядке, но если тестов много а нужно заниматься отладкой какого то конкретного, то вышеописанный вариант со снапшотами очень и очень поможет