Что такое модульный тест
Модульный тест — это небольшая программа, которая проверяет одну часть вашего кода, обычно одну функцию. Тесты запускают после каждого изменения: если изменение что-то сломало, тест сообщит вам об этом сразу же, раньше ваших пользователей.
Дополнительная библиотека не нужна. В Node.js есть встроенное средство запуска тестов: модуль node:test регистрирует тесты, модуль node:assert/strict проверяет значения, а флаг --test их запускает.
Тесты также делают изменения безопасными: с хорошими тестами вы можете переписать функцию и за секунды узнать, ведёт ли она себя по-прежнему.
Файлы тестов и тестовые случаи
Тест делают тестом две вещи:
1. Имя файла заканчивается на .test.ts: для add.ts вы пишете add.test.ts. Средство запуска тестов ищет файлы с такими именами и запускает только их.
2. Тест регистрируется вызовом: test("name", fn), импортированным из node:test. Имя — это произвольный текст, поэтому им может быть целое предложение: не нужно запоминать никаких префиксов в именах.
Внутри теста вы вызываете функцию, сравниваете то, что получили, с тем, что ожидали, и позволяете assert сообщить о разнице. Непройденная проверка выбрасывает ошибку, и средство запуска помечает тест как непройденный. Если ничего не выброшено, тест пройден.
Первый пройденный тест
add(2, 3) сравнивается с 5. Значения совпадают, поэтому assert.equal молчит и тест проходит. Средство запуска выводит для теста одну строку с ✔, а в сводке ниже — pass 1.
Вывод: программа на TypeScript и захваченный вывод
import { test } from "node:test"
import assert from "node:assert/strict"
function add(a: number, b: number): number {
return a + b
}
test("add(2, 3) is 5", () => {
const got = add(2, 3)
const want = 5
assert.equal(got, want, `add(2, 3) = ${got}; ожидалось ${want}`)
})
Непройденный тест
В этой функции add есть ошибка — она умножает. Тест её ловит: запуск выводит строку с ✖ и fail 1, а затем отчёт с нашим собственным сообщением add(2, 3) = 6; ожидалось 5 и двумя значениями, 6 !== 5.
Вывод: программа на TypeScript и захваченный вывод
import { test } from "node:test"
import assert from "node:assert/strict"
// В add есть ошибка: он умножает вместо сложения.
function add(a: number, b: number): number {
return a * b
}
test("add(2, 3) is 5", () => {
const got = add(2, 3)
const want = 5
assert.equal(got, want, `add(2, 3) = ${got}; ожидалось ${want}`)
})
Запуск тестов
Тесты запускает команда node --test. Если указать имя файла, она запустит этот файл; если не указать ничего, она найдёт в папке файлы, похожие на тесты, и запустит их все.
Репортёр решает, сколько вы увидите. --test-reporter=spec перечисляет каждый тест по имени со знаком ✔ или ✖ перед ним, и именно такой вид используется во всём этом учебнике. Строки сводки ниже начинаются с ℹ и подсчитывают, сколько тестов было запущено, пройдено и не пройдено.
Два теста, оба показаны по имени
В файле есть две небольшие функции и по одному тесту для каждой. Репортёр показывает оба теста по имени, так что видно, что оба запустились и оба прошли: в сводке указано tests 2 и pass 2.
Вывод: программа на TypeScript и захваченный вывод
import { test } from "node:test"
import assert from "node:assert/strict"
function double(n: number): number {
return n * 2
}
function half(n: number): number {
return n / 2
}
test("double(4) is 8", () => {
assert.equal(double(4), 8, "double(4) должно быть 8")
})
test("half(8) is 4", () => {
assert.equal(half(8), 4, "half(8) должно быть 4")
})