Два способа сообщить об ошибке
Тест может сообщить о проблеме двумя способами, и разница в том, что происходит дальше:
Каждая проверка в node:assert/strict выбрасывает исключение, когда она не проходит. Исключение завершает тест, в котором оно возникло, поэтому проверки, написанные после него, уже не выполняются. Это и есть поведение быстрого отказа, и именно оно работает по умолчанию.
Чтобы сообщить о проблеме и продолжить проверки, поместите каждую проверку в отдельный вызов test(…). Тесты независимы: один упавший тест не останавливает следующий, поэтому за один запуск можно увидеть сразу несколько проблем.
Обе формы принимают сообщение. assert.equal(got, want, "…") и assert.ok(value, "…") печатают ваш текст вместо стандартного.
Отдельные тесты: сообщить и продолжить
Когда нужно проверить несколько случаев подряд, дайте каждому случаю свой тест. О сломанном случае будет сообщено, а случаи после него всё равно будут проверены.
Так один запуск показывает весь ущерб, а не только первый сломанный случай.
Увидеть все сломанные случаи сразу
Эта функция add игнорирует b, поэтому не проходят все три проверки. Так как каждая проверка — это отдельный тест, все три строки ✖ появляются за один запуск, а в итоге написано fail 3. Если бы это были три проверки внутри одного теста, сообщили бы только о первой.
Вывод: программа на TypeScript и захваченный вывод
import { test } from "node:test"
import assert from "node:assert/strict"
// В add есть ошибка: она игнорирует b.
function add(a: number, b: number): number {
return a
}
// Один тест на каждую проверку: ошибка в одном не скрывает остальные.
test("add(2, 2) is 4", () => {
assert.equal(add(2, 2), 4)
})
test("add(2, 3) is 5", () => {
assert.equal(add(2, 3), 5)
})
test("add(10, 1) is 11", () => {
assert.equal(add(10, 1), 11)
})
Неудачная проверка останавливает тест
Иногда неудачная проверка означает, что остальная часть теста работать не может. Типичный случай: тест сначала готовит значение, а затем изучает его. Если подготовка уже прошла неправильно, изучать значение бесполезно или это даже приведёт к сбою.
Здесь выбрасывающая исключение проверка — именно то, что нужно. Она завершает тест прямо на этом месте, и проверки ниже не выполняются — в этом и смысл.
Остановиться до бесполезных проверок
В splitWords есть ошибка (функция разделяет строку по неверному символу), поэтому возвращается 1 часть вместо 3. Проверка длины не проходит и выбрасывает исключение, поэтому до проверки первой части ниже дело не доходит — в отчёте видно только эту одну ошибку и ничего больше.
Вывод: программа на TypeScript и захваченный вывод
import { test } from "node:test"
import assert from "node:assert/strict"
// В splitWords есть ошибка: она разделяет по ";" вместо ",".
function splitWords(s: string): string[] {
return s.split(";")
}
test("splitWords finds three parts", () => {
const parts = splitWords("one,two,three")
assert.equal(parts.length, 3, `получено частей: ${parts.length}, нужно 3 — проверять их нельзя`)
// Не выполняется, пока есть эта ошибка.
assert.equal(parts[0], "one")
})
Сообщения в логических проверках
assert.ok(value, message) — это проверка для обычного логического значения: она не проходит, когда значение ложно. Используйте её там, где нет пары got и want для сравнения, а есть только ответ «да или нет».
Сообщение — это второй аргумент, и оно необязательно. Без него исполнитель тестов всё равно напечатает свой текст и сравниваемые значения, поэтому собственное сообщение стоит писать тогда, когда оно говорит больше.
Простые сообщения
Две простые логические проверки, каждая в своём тесте и каждая с простым сообщением. Здесь обе проходят, поэтому сообщения молчат, а в итоге написано pass 2.
Вывод: программа на TypeScript и захваченный вывод
import { test } from "node:test"
import assert from "node:assert/strict"
function isEven(n: number): boolean {
return n % 2 === 0
}
test("4 is even", () => {
assert.ok(isEven(4), "4 должно быть чётным")
})
test("3 is not even", () => {
assert.ok(!isEven(3), "3 не должно быть чётным")
})