Статьи

Тестирование приложений Blackbox node.js

Одна из лучших функций Django  — это тестовый клиент, который поставляется с тестовой средой -> blackbox testing baby, да!

Blackbox test — мой любимый вид тестирования. Это гораздо более полезно, чем модульные тесты, и, как правило, намного проще в написании, обслуживании и работе. И это потому, что вместо того, чтобы убедиться, что все ваши функции и внутренние функции работают так, как они должны, вы только тестируете то, что действительно важно в веб-приложении.

Правильный ли вывод для этого конкретного ввода?

Вашим пользователям все равно, что у вас есть полный охват модульных тестов. Они никогда не увидят вывод всех ваших внутренних функций и методов, драйверов баз данных и еще много чего. Все они заботятся, что если они положили в  X  они получают правильный Y  вне.

Два основных преимущества тестирования «черного ящика» для разработчика:

  1. Тесты с минимальным обслуживанием — вам не нужно переписывать весь набор тестов при рефакторинге глубоких внутренних частей вашего приложения
  2. Интеграционные тесты — поскольку вы сопоставляете только входные данные с выходными данными, вы тестируете всю цепочку, начиная от маршрутизации, заканчивая соединениями с базой данных и бизнес-логикой самого приложения.

Хотя все еще целесообразно написать достаточное количество этих тестов, чтобы проверить правильность возвращаемых ошибок, убедитесь, что ваше приложение не дает сбой при странных входах и так далее.

Также важно не забывать модульные тесты для основной бизнес-логики. Это алгоритмическая штука, к алгоритмам должны быть прикреплены юнит-тесты. Но в целом веб-приложения — это не алгоритмы, а системы. И системы нуждаются в тестах черного ящика.

Делаем это в 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 вы можете отправить любой тип запроса и проверить любой тип ответа.

Потрясающие.