Одна из лучших функций Django — это тестовый клиент, который поставляется с тестовой средой -> blackbox testing baby, да!
Blackbox test — мой любимый вид тестирования. Это гораздо более полезно, чем модульные тесты, и, как правило, намного проще в написании, обслуживании и работе. И это потому, что вместо того, чтобы убедиться, что все ваши функции и внутренние функции работают так, как они должны, вы только тестируете то, что действительно важно в веб-приложении.
Правильный ли вывод для этого конкретного ввода?
Вашим пользователям все равно, что у вас есть полный охват модульных тестов. Они никогда не увидят вывод всех ваших внутренних функций и методов, драйверов баз данных и еще много чего. Все они заботятся, что если они положили в X они получают правильный Y вне.
Два основных преимущества тестирования «черного ящика» для разработчика:
- Тесты с минимальным обслуживанием — вам не нужно переписывать весь набор тестов при рефакторинге глубоких внутренних частей вашего приложения
- Интеграционные тесты — поскольку вы сопоставляете только входные данные с выходными данными, вы тестируете всю цепочку, начиная от маршрутизации, заканчивая соединениями с базой данных и бизнес-логикой самого приложения.
Хотя все еще целесообразно написать достаточное количество этих тестов, чтобы проверить правильность возвращаемых ошибок, убедитесь, что ваше приложение не дает сбой при странных входах и так далее.
Также важно не забывать модульные тесты для основной бизнес-логики. Это алгоритмическая штука, к алгоритмам должны быть прикреплены юнит-тесты. Но в целом веб-приложения — это не алгоритмы, а системы. И системы нуждаются в тестах черного ящика.
Делаем это в node.js
Итак, тестирование черного ящика отлично подходит для веб-приложений. Но как ты их делаешь?
В Django это просто, когда в тесте вы просто говорите что-то вроде
response = self.client.get("/my/url") self.assertEqual(response.status, 200)
и проверьте ответ, что вы ожидали. Тестовый клиент автоматически обеспечивает работу фальшивого сервера, который принимает запросы, отвечает, а затем срывается, когда вы закончите тестирование.
До недавнего времени единственный способ, которым я знал об этом с node.js, был запуск сервера и отправка ему запросов. Но это немного неубедительно, в конце концов, я хочу просто запустить тесты. Конечно, я собираюсь забыть запускать сервер каждый раз.
Не говоря уже о том, что вы должны продолжать его перезапускать при изменении кода.
Войдите в супертест , этап слева.
Supertest — это высокоуровневая библиотека http-тестов, основанная на superagent, которая, в свою очередь, является высокоуровневой абстракцией для выполнения http-запросов.
Он принимает любой тип объекта сервера и позволяет очень просто выполнять запросы и проверять ожидаемые результаты. При необходимости вы можете даже перейти к низкоуровневым API для запросов http.
Простой (мокко) тест может выглядеть примерно так:
var app = require('../app.js'); describe('GET /users', function(){ it('respond with json', function(done){ request(app) .get('/user') .set('Accept', 'application/json') .expect('Content-Type', /json/) .expect(200, done); }) })
Где приложение , например, сервер express.js — запрос является нашим тестовым клиентом. Мы просто проверить , что отправка запроса GET к / пользователю будет возвращать какие — то JSON и код состояния будет 200.
Если сервер не работает, когда для этого требуется, supertest удостоверится, что он связан с эфемерным портом, а затем отключен после завершения тестов.
Да, и из-за superagent вы можете отправить любой тип запроса и проверить любой тип ответа.
Потрясающие.