JS: Express

Теория: Тесты

Функциональное тестирование — это тестирование ПО в целях проверки реализуемости функциональных требований, то есть способности ПО в определённых условиях решать задачи, нужные пользователям.

В отношении сайтов такое тестирование можно провести, делая HTTP-запросы к соответствующим обработчикам и проверяя их ответ. Чтобы это было возможно, требуется небольшая дисциплина кода. В случае Express она выражается в том, что определение приложения отделяется от его запуска.

// src/app.js
import Express from 'express';

const app = new Express();
app.get('/', (req, res) => res.send('hello'));
export default app;

// bin/app.js
#!/usr/bin/env node

import app from '../src/app.js';
app.listen(4000);

Такое разделение позволяет тестам самостоятельно запускать приложение и работать с ним как с обычной функцией. Вам не нужно отдельно поднимать сервер перед запуском тестов и останавливать его после.

Vitest и Supertest

Для запуска тестов используют тестовый фреймворк, например Vitest, а HTTP-запросы к приложению выполняют через Supertest.

// __tests__/app.test.js
import request from 'supertest'
import { expect, test } from 'vitest'
import app from '../src/app.js'

test('GET /', async () => {
  const res = await request(app).get('/')
  expect(res.status).toBe(200)
})

Supertest возвращает объект response, в котором можно проверить статус, заголовки и тело ответа. Vitest дает структуру тестов (describe, it/test) и ассерты (expect).

В package.json обычно достаточно такого скрипта:

{
  "scripts": {
    "test": "vitest run"
  }
}

Этого хватает, чтобы писать функциональные тесты для HTTP-интерфейса. Но важно помнить: такие тесты не проверяют, как страница реально выглядит и работает в браузере. Для этого нужны приёмочные (e2e) тесты, они в этом курсе не рассматриваются.

Superagent

Supertest построен поверх Superagent. Именно Superagent отвечает за формирование HTTP-запросов.

import request from 'superagent'

const res = await request
  .post('/api/pet')
  .type('form')
  .send({ name: 'Manny', species: 'cat' })
  .set('X-API-Key', 'foobar')
  .set('Accept', 'application/json')

Рекомендуемые программы

Дальше

Завершено

0 / 13