Тестирование
Надёжные возможности тестирования и бенчмаркинга для обеспечения качества и производительности кода.
Например, Deno.test, Deno.bench
функция Deno.bench
Перегрузка 1
bench(b: BenchDefinition): voidЗарегистрируйте бенчмарк-тест, который будет запущен при использовании deno bench в командной строке, если содержащий его модуль распознаётся как модуль бенчмарков.
Модуль «распознаётся как модуль бенчмарков», когда deno bench выбирает его для выполнения. Если передать deno bench явные пути к файлам, эти файлы будут запущены в любом случае. Если запустить deno bench без путей, он будет обходить каталог в поисках файлов, имена которых (без учёта расширения) заканчиваются на _bench или .bench либо в точности совпадают с bench. Например: foo_bench.ts, foo.bench.js или bench.ts. Поддерживаются те же расширения, что и для тестов: .ts, .tsx, .js, .jsx, .mjs, .mts, .cjs, .cts.
Если тестовая функция (fn) возвращает промис или является асинхронной, среда выполнения тестов дождётся её завершения, прежде чем считать тест завершённым.
import { assertEquals } from "jsr:@std/assert";
Deno.bench({
name: "example test",
fn() {
assertEquals("world", "world");
},
});
Deno.bench({
name: "example ignored test",
ignore: Deno.build.os === "windows",
fn() {
// This test is ignored only on Windows machines
},
});
Deno.bench({
name: "example async test",
async fn() {
const decoder = new TextDecoder("utf-8");
const data = await Deno.readFile("hello_world.txt");
assertEquals(decoder.decode(data), "Hello world");
}
});
Параметры
Тип возвращаемого значения
void Перегрузка 2
bench(
name: string,
fn: (b: BenchContext) => void | Promise<void>,
): voidЗарегистрируйте бенчмарк-тест, который будет запущен при использовании deno bench в командной строке, если содержащий его модуль распознаётся как модуль бенчмарков.
Если тестовая функция (fn) возвращает промис или является асинхронной, среда выполнения тестов дождётся её завершения, прежде чем считать тест завершённым.
import { assertEquals } from "jsr:@std/assert";
Deno.bench("My test description", () => {
assertEquals("hello", "hello");
});
Deno.bench("My async test description", async () => {
const decoder = new TextDecoder("utf-8");
const data = await Deno.readFile("hello_world.txt");
assertEquals(decoder.decode(data), "Hello world");
});
Параметры
name: string fn: (b: BenchContext) => void | Promise<void> Тип возвращаемого значения
void Перегрузка 3
bench(fn: (b: BenchContext) => void | Promise<void>): voidЗарегистрируйте бенчмарк-тест, который будет запущен при использовании deno bench в командной строке, если содержащий его модуль распознаётся как модуль бенчмарков.
Если тестовая функция (fn) возвращает промис или является асинхронной, среда выполнения тестов дождётся её завершения, прежде чем считать тест завершённым.
import { assertEquals } from "jsr:@std/assert";
Deno.bench(function myTestName() {
assertEquals("hello", "hello");
});
Deno.bench(async function myOtherTestName() {
const decoder = new TextDecoder("utf-8");
const data = await Deno.readFile("hello_world.txt");
assertEquals(decoder.decode(data), "Hello world");
});
Параметры
fn: (b: BenchContext) => void | Promise<void> Тип возвращаемого значения
void Перегрузка 4
bench(
name: string,
options: Omit<BenchDefinition, "fn" | "name">,
fn: (b: BenchContext) => void | Promise<void>,
): voidЗарегистрируйте бенчмарк-тест, который будет запущен при использовании deno bench в командной строке, если содержащий его модуль распознаётся как модуль бенчмарков.
Если тестовая функция (fn) возвращает промис или является асинхронной, среда выполнения тестов дождётся её завершения, прежде чем считать тест завершённым.
import { assertEquals } from "jsr:@std/assert";
Deno.bench(
"My test description",
{ permissions: { read: true } },
() => {
assertEquals("hello", "hello");
}
);
Deno.bench(
"My async test description",
{ permissions: { read: false } },
async () => {
const decoder = new TextDecoder("utf-8");
const data = await Deno.readFile("hello_world.txt");
assertEquals(decoder.decode(data), "Hello world");
}
);
Параметры
name: string options: Omit<BenchDefinition, "fn" | "name"> fn: (b: BenchContext) => void | Promise<void> Тип возвращаемого значения
void Перегрузка 5
bench(
options: Omit<BenchDefinition, "fn">,
fn: (b: BenchContext) => void | Promise<void>,
): voidЗарегистрируйте бенчмарк-тест, который будет запущен при использовании deno bench в командной строке, если содержащий его модуль распознаётся как модуль бенчмарков.
Если тестовая функция (fn) возвращает промис или является асинхронной, среда выполнения тестов дождётся её завершения, прежде чем считать тест завершённым.
import { assertEquals } from "jsr:@std/assert";
Deno.bench(
{ name: "My test description", permissions: { read: true } },
() => {
assertEquals("hello", "hello");
}
);
Deno.bench(
{ name: "My async test description", permissions: { read: false } },
async () => {
const decoder = new TextDecoder("utf-8");
const data = await Deno.readFile("hello_world.txt");
assertEquals(decoder.decode(data), "Hello world");
}
);
Параметры
options: Omit<BenchDefinition, "fn"> fn: (b: BenchContext) => void | Promise<void> Тип возвращаемого значения
void Перегрузка 6
bench(
options: Omit<BenchDefinition, "fn" | "name">,
fn: (b: BenchContext) => void | Promise<void>,
): voidЗарегистрируйте бенчмарк-тест, который будет запущен при использовании deno bench в командной строке, если содержащий его модуль распознаётся как модуль бенчмарков.
Если тестовая функция (fn) возвращает промис или является асинхронной, среда выполнения тестов дождётся её завершения, прежде чем считать тест завершённым.
import { assertEquals } from "jsr:@std/assert";
Deno.bench(
{ permissions: { read: true } },
function myTestName() {
assertEquals("hello", "hello");
}
);
Deno.bench(
{ permissions: { read: false } },
async function myOtherTestName() {
const decoder = new TextDecoder("utf-8");
const data = await Deno.readFile("hello_world.txt");
assertEquals(decoder.decode(data), "Hello world");
}
);
Параметры
options: Omit<BenchDefinition, "fn" | "name"> fn: (b: BenchContext) => void | Promise<void> Тип возвращаемого значения
void интерфейс Deno.BenchContext
Контекст, передаваемый функции, для которой выполняется бенчмаркинг. Экземпляр используется совместно между итерациями бенчмарка. Например, его методы позволяют исключить из измеряемой части функции определённый участок.
Свойства
Методы
start(): void Перезапускает таймер измерения бенчмарка. Вызывать этот метод следует после выполнения подготовительных действий, которые не нужно измерять.
Предупреждение: этот метод не следует использовать для бенчмарков со средним временем итерации менее 10 мкс. В таких случаях он будет отключён, но вызов всё равно создаст заметные накладные расходы, что приведёт к появлению предупреждения.
Deno.bench("foo", async (t) => {
const data = await Deno.readFile("data.txt");
t.start();
// some operation on `data`...
});
end(): void Досрочно останавливает таймер измерения бенчмарка. Вызывать этот метод следует перед выполнением завершающих действий, которые не нужно измерять.
Предупреждение: этот метод не следует использовать для бенчмарков со средним временем итерации менее 10 мкс. В таких случаях он будет отключён, но вызов всё равно создаст заметные накладные расходы, что приведёт к появлению предупреждения.
Deno.bench("foo", async (t) => {
using file = await Deno.open("data.txt");
t.start();
// some operation on `file`...
t.end();
});
интерфейс Deno.BenchDefinition
Интерфейс для определения бенчмарк-теста с помощью Deno.bench.
Свойства
fn: (b: BenchContext) => void | Promise<void> Тестовая функция, производительность которой будет измеряться.
name: string Имя теста, используемое при отображении результатов.
ignore: boolean Если значение истинно, бенчмарк-тест будет проигнорирован или пропущен.
group: string Имя группы бенчмарков.
Для сгруппированных бенчмарков формируется сводка времени выполнения группы, в которой сравнивается разница в производительности между тестами группы.
baseline: boolean Бенчмарк, который следует использовать в качестве базового для сравнения с другими бенчмарками.
Если в группе несколько базовых бенчмарков, в качестве базового используется первый.
only: boolean Если хотя бы для одного бенчмарка задано значение only, равное true, будут запущены только бенчмарки со значением only, равным true, а набор бенчмарков завершится с ошибкой.
n: number Количество выполняемых итераций.
warmup: number Количество прогревочных запусков перед выполнением бенчмарка.
sanitizeExit: boolean = true Не позволяет тестовому случаю бенчмарка преждевременно завершить процесс, например, вызвав Deno.exit.
permissions: PermissionOptions = "inherit" Задаёт разрешения, с которыми следует запускать бенчмарк.
Установите значение "inherit", чтобы сохранить разрешения вызывающего потока.
Установите значение "none", чтобы отозвать все разрешения.
интерфейс Deno.DenoTest
Сигнатуры вызова
(t: TestDefinition): void Зарегистрируйте тест, который будет запущен при использовании deno test в командной строке, если содержащий его модуль распознаётся как тестовый модуль.
При необходимости fn может быть асинхронной.
import { assertEquals } from "jsr:@std/assert";
Deno.test({
name: "example test",
fn() {
assertEquals("world", "world");
},
});
Deno.test({
name: "example ignored test",
ignore: Deno.build.os === "windows",
fn() {
// This test is ignored only on Windows machines
},
});
Deno.test({
name: "example async test",
async fn() {
const decoder = new TextDecoder("utf-8");
const data = await Deno.readFile("hello_world.txt");
assertEquals(decoder.decode(data), "Hello world");
}
});
(
name: string,
fn: (t: TestContext) => void | Promise<void>,
): void Зарегистрируйте тест, который будет запущен при использовании deno test в командной строке, если содержащий его модуль распознаётся как тестовый модуль.
При необходимости fn может быть асинхронной.
import { assertEquals } from "jsr:@std/assert";
Deno.test("My test description", () => {
assertEquals("hello", "hello");
});
Deno.test("My async test description", async () => {
const decoder = new TextDecoder("utf-8");
const data = await Deno.readFile("hello_world.txt");
assertEquals(decoder.decode(data), "Hello world");
});
(fn: (t: TestContext) => void | Promise<void>): void Зарегистрируйте тест, который будет запущен при использовании deno test в командной строке, если содержащий его модуль распознаётся как тестовый модуль.
При необходимости fn может быть асинхронной. Объявленная функция должна иметь имя.
import { assertEquals } from "jsr:@std/assert";
Deno.test(function myTestName() {
assertEquals("hello", "hello");
});
Deno.test(async function myOtherTestName() {
const decoder = new TextDecoder("utf-8");
const data = await Deno.readFile("hello_world.txt");
assertEquals(decoder.decode(data), "Hello world");
});
(
name: string,
options: Omit<TestDefinition, "fn" | "name">,
fn: (t: TestContext) => void | Promise<void>,
): void Зарегистрируйте тест, который будет запущен при использовании deno test в командной строке, если содержащий его модуль распознаётся как тестовый модуль.
При необходимости fn может быть асинхронной.
import { assert, fail, assertEquals } from "jsr:@std/assert";
Deno.test("My test description", { permissions: { read: true } }, (): void => {
assertEquals("hello", "hello");
});
Deno.test("My async test description", { permissions: { read: false } }, async (): Promise<void> => {
const decoder = new TextDecoder("utf-8");
const data = await Deno.readFile("hello_world.txt");
assertEquals(decoder.decode(data), "Hello world");
});
(
options: Omit<TestDefinition, "fn" | "name">,
fn: (t: TestContext) => void | Promise<void>,
): void Зарегистрируйте тест, который будет запущен при использовании deno test в командной строке, если содержащий его модуль распознаётся как тестовый модуль.
При необходимости fn может быть асинхронной.
import { assertEquals } from "jsr:@std/assert";
Deno.test(
{
name: "My test description",
permissions: { read: true },
},
() => {
assertEquals("hello", "hello");
},
);
Deno.test(
{
name: "My async test description",
permissions: { read: false },
},
async () => {
const decoder = new TextDecoder("utf-8");
const data = await Deno.readFile("hello_world.txt");
assertEquals(decoder.decode(data), "Hello world");
},
);
(
options: Omit<TestDefinition, "fn">,
fn: (t: TestContext) => void | Promise<void>,
): void Зарегистрируйте тест, который будет запущен при использовании deno test в командной строке, если содержащий его модуль распознаётся как тестовый модуль.
При необходимости fn может быть асинхронной. Объявленная функция должна иметь имя.
import { assertEquals } from "jsr:@std/assert";
Deno.test(
{ permissions: { read: true } },
function myTestName() {
assertEquals("hello", "hello");
},
);
Deno.test(
{ permissions: { read: false } },
async function myOtherTestName() {
const decoder = new TextDecoder("utf-8");
const data = await Deno.readFile("hello_world.txt");
assertEquals(decoder.decode(data), "Hello world");
},
);
Свойства
Зарегистрируйте параметризованную группу тестов — по одному тесту для каждого случая в cases.
Возвращает функцию, принимающую шаблон имени и тестовую функцию. Для каждого случая шаблон имени подставляется, а тестовая функция вызывается со значением или значениями этого случая, за которыми следует TestContext.
Массивы случаев передаются как позиционные аргументы; объекты (и примитивы) передаются как один аргумент.
В шаблоне имени поддерживаются токены в стиле printf, которые последовательно используют значения случая (%s, %d/%i, %f, %j, %o/%O), %# для индекса случая, отсчитываемого с нуля, и %% для буквального символа %. Для случаев-объектов $key (и $key.nested) подставляет соответствующее свойство.
import { assertEquals } from "jsr:@std/assert";
Deno.test.each([
[1, 1, 2],
[1, 2, 3],
[2, 1, 3],
])("add(%i, %i) = %i", (a, b, expected) => {
assertEquals(a + b, expected);
});
Deno.test.each([
{ a: 1, b: 1, sum: 2 },
{ a: 1, b: 2, sum: 3 },
])("$a + $b = $sum", ({ a, b, sum }) => {
assertEquals(a + b, sum);
});
Сокращённая запись для пропуска отдельного тестового случая.
Методы
beforeAll(fn: () => void | Promise<void>): void Зарегистрируйте функцию, которая будет вызвана перед всеми тестами в текущей области видимости.
Эти функции выполняются в порядке FIFO (первой зарегистрирована — первой выполнена).
Если во время выполнения этого хука возникает исключение, оставшиеся хуки beforeAll выполнены не будут.
Deno.test.beforeAll(() => {
// Setup code that runs once before all tests
console.log("Setting up test suite");
});
beforeEach(fn: () => void | Promise<void>): void Зарегистрируйте функцию, которая будет вызываться перед каждым тестом в текущей области видимости.
Эти функции выполняются в порядке FIFO (первой зарегистрирована — первой выполнена).
Если во время выполнения этого хука возникает исключение, оставшиеся хуки выполнены не будут, а выполняемый тестовый случай будет помечен как неудачный.
Deno.test.beforeEach(() => {
// Setup code that runs before each test
console.log("Setting up test");
});
afterEach(fn: () => void | Promise<void>): void Зарегистрируйте функцию, которая будет вызываться после каждого теста в текущей области видимости.
Эти функции выполняются в порядке LIFO (последней зарегистрирована — первой выполнена).
Если во время выполнения этого хука возникает исключение, оставшиеся хуки выполнены не будут, а выполняемый тестовый случай будет помечен как неудачный.
Deno.test.afterEach(() => {
// Cleanup code that runs after each test
console.log("Cleaning up test");
});
afterAll(fn: () => void | Promise<void>): void Зарегистрируйте функцию, которая будет вызвана после завершения всех тестов в текущей области видимости.
Эти функции выполняются в порядке LIFO (последней зарегистрирована — первой выполнена).
Если во время выполнения этого хука возникает исключение, оставшиеся хуки afterAll выполнены не будут.
Deno.test.afterAll(() => {
// Cleanup code that runs once after all tests
console.log("Cleaning up test suite");
});
sanitizer(options: { ops?: boolean; resources?: boolean; }): void Настройте санитайзеры на уровне модуля. Эти настройки переопределяют флаги CLI и параметры файла конфигурации, но для каждого теста их можно переопределить с помощью sanitizeOps / sanitizeResources в параметрах теста.
Вызывать метод следует в начале модуля, до регистрации каких-либо Deno.test() — каждый вызов задаёт значения по умолчанию, наследуемые зарегистрированными после него тестами, поэтому тесты, зарегистрированные до вызова, используют прежние значения.
// Enable both sanitizers for all tests in this file
Deno.test.sanitizer({ ops: true, resources: true });
Deno.test("my test", () => {
// This test will have ops and resources sanitizers enabled
});
Deno.test({
name: "override per-test",
sanitizeOps: false,
fn() {
// This test opts out of ops sanitizer
},
});
интерфейс Deno.TestContext
Контекст, передаваемый тестовой функции. Его можно использовать, чтобы получить информацию о текущем тесте или зарегистрировать дополнительные шаги в рамках текущего теста.
Свойства
name: string Имя текущего теста.
origin: string Строка URL текущего теста.
parent: TestContext Если текущий тест является шагом другого теста, здесь будет задан контекст родительского теста.
Методы
step(definition: TestStepDefinition): Promise<boolean> Запускает вложенный шаг родительского теста или шага. Возвращает промис, который разрешается в логическое значение, указывающее, успешно ли завершился шаг.
Возвращённый промис отклоняется только в том случае, если аргументы недопустимы.
Если тест был пропущен, промис возвращает false.
Deno.test({
name: "a parent test",
async fn(t) {
console.log("before the step");
await t.step({
name: "step 1",
fn(t) {
console.log("current step:", t.name);
}
});
console.log("after the step");
}
});
step(
name: string,
fn: (t: TestContext) => void | Promise<void>,
): Promise<boolean> Запускает вложенный шаг родительского теста или шага. Возвращает промис, который разрешается в логическое значение, указывающее, успешно ли завершился шаг.
Возвращённый промис отклоняется только в том случае, если аргументы недопустимы.
Если тест был пропущен, промис возвращает false.
Deno.test(
"a parent test",
async (t) => {
console.log("before the step");
await t.step(
"step 1",
(t) => {
console.log("current step:", t.name);
}
);
console.log("after the step");
}
);
step(fn: (t: TestContext) => void | Promise<void>): Promise<boolean> Запускает вложенный шаг родительского теста или шага. Возвращает промис, который разрешается в логическое значение, указывающее, успешно ли завершился шаг.
Возвращённый промис отклоняется только в том случае, если аргументы недопустимы.
Если тест был пропущен, промис возвращает false.
Deno.test(async function aParentTest(t) {
console.log("before the step");
await t.step(function step1(t) {
console.log("current step:", t.name);
});
console.log("after the step");
});
assertSnapshot<T>(
actual: T,
options?: TestSnapshotOptions<T>,
): Promise<void> Проверяет, что actual соответствует снимку, сохранённому в файле снимков.
Снимок сохраняется в __snapshots__/<test file name>.snap рядом с файлом теста под ключом, сформированным на основе имени теста (и шага). При первом запуске создайте файл снимков, запустив тесты с флагом --update-snapshots, и добавьте его в систему контроля версий вместе с тестом. При последующих запусках проверка завершается ошибкой, если сериализованное значение больше не соответствует сохранённому снимку. Чтобы намеренно изменить снимки, снова запустите тесты с --update-snapshots.
Для файлов снимков в расположении по умолчанию не требуются разрешения на чтение или запись; для пользовательского dir или path такие разрешения необходимы.
Формат файла снимков совместим с assertSnapshot из @std/testing/snapshot.
Deno.test("matches snapshot", async (t) => {
await t.assertSnapshot({ hello: "world", example: 123 });
});
assertSnapshot<T>(
actual: T,
message?: string,
): Promise<void> Проверяет, что actual соответствует снимку, сохранённому в файле снимков; если проверка не пройдёт, будет использовано сообщение об ошибке message.
Deno.test("matches snapshot", async (t) => {
await t.assertSnapshot(2 + 3, "should be five");
});
интерфейс Deno.TestDefinition
Свойства
fn: (t: TestContext) => void | Promise<void> name: string Имя теста.
ignore: boolean Если значение истинно, текущий шаг теста будет пропущен.
Это быстрый способ пропустить шаг, но его также можно использовать для условной логики, например, чтобы определить, доступна ли функция среды.
only: boolean Если хотя бы у одного теста параметр only задан как true, запускаются только тесты с параметром only, заданным как true, а набор тестов завершается с ошибкой.
sanitizeOps: boolean = false Проверяет, что число завершённых асинхронных операций после шага теста совпадает с числом запущенных операций. Это гарантирует, что проверяемый код не запускает асинхронные операции, которые затем не ожидает. Это помогает предотвратить логические ошибки и утечки памяти в коде приложения.
Эту проверку также можно включить глобально с помощью флага CLI --sanitize-ops, переменной среды DENO_TEST_SANITIZE_OPS=1 или параметра test.sanitizeOps в deno.json. Её можно задать для отдельного модуля с помощью Deno.test.sanitizer.
sanitizeResources: boolean = false Проверяет, что шаг теста не оставляет «утечки» ресурсов, например открытых файлов или сетевых подключений, сравнивая открытые ресурсы в начале теста с открытыми ресурсами в конце теста.
Эту проверку также можно включить глобально с помощью флага CLI --sanitize-resources, переменной среды DENO_TEST_SANITIZE_RESOURCES=1 или параметра test.sanitizeResources в deno.json. Её можно задать для отдельного модуля с помощью Deno.test.sanitizer.
sanitizeExit: boolean = true Проверяет, что тестовый случай не приводит к преждевременному завершению процесса, например, при вызове Deno.exit.
permissions: PermissionOptions = "inherit" Задаёт разрешения, с которыми следует запускать тест.
Укажите «inherit», чтобы сохранить разрешения вызывающей среды выполнения, или «none», чтобы отозвать все разрешения. Также можно задать более конкретный набор разрешений с помощью PermissionOptionsObject.
timeout: number Максимальная продолжительность выполнения теста в миллисекундах, по истечении которой тест помечается как не пройденный. Обнаруживаются как зависания асинхронных операций, так и бесконечные синхронные циклы.
Если параметр не задан или равен 0, тест выполняется без ограничения времени.
retry: number = 0 Количество повторных запусков теста в случае ошибки. Тест считается пройденным, если успешна хотя бы одна попытка. Полезно для нестабильных тестов.
Если параметр задан, он имеет приоритет над флагом --retry, включая явное значение 0, которое отключает значение по умолчанию, заданное флагом.
repeats: number = 0 Количество дополнительных запусков теста. Для успешного прохождения теста должны завершиться успешно все повторы. Это помогает выявлять нестабильные тесты. При совместном использовании с TestDefinition.retry каждый повтор сам может запускаться повторно.
Если параметр задан, он имеет приоритет над флагом --repeats, включая явное значение 0, которое отключает значение по умолчанию, заданное флагом.
интерфейс Deno.TestEach
Регистрирует параметризованную группу тестов. См. DenoTest.each.
Первая перегрузка обрабатывает случаи с массивами (их значения передаются как позиционные аргументы); вторая — случаи с объектами или примитивами (каждый передаётся как отдельный аргумент, за которым следует TestContext).
TestContext также передаётся последним аргументом функциям для случаев с массивами во время выполнения, но не отражается в типах их параметров, чтобы типы значений случаев оставались корректными.
Сигнатуры вызова
<T extends readonly unknown[]>(cases: readonly T[]): { (
name: string,
fn: (...args: [...T]) => void | Promise<void>,
): void; (
name: string,
options: Omit<TestDefinition, "fn" | "name">,
fn: (...args: [...T]) => void | Promise<void>,
): void; } <T>(cases: readonly T[]): { (
name: string,
fn: (
value: T,
t: TestContext,
) => void | Promise<void>,
): void; (
name: string,
options: Omit<TestDefinition, "fn" | "name">,
fn: (
value: T,
t: TestContext,
) => void | Promise<void>,
): void; } интерфейс Deno.TestIgnore
Сокращённая запись для пропуска определённого тестового случая. См. DenoTest.ignore.
Сигнатуры вызова
(t: Omit<TestDefinition, "ignore">): void (
name: string,
fn: (t: TestContext) => void | Promise<void>,
): void (fn: (t: TestContext) => void | Promise<void>): void (
name: string,
options: Omit<TestDefinition,
"fn"
| "name"
| "ignore"
>,
fn: (t: TestContext) => void | Promise<void>,
): void (
options: Omit<TestDefinition,
"fn"
| "name"
| "ignore"
>,
fn: (t: TestContext) => void | Promise<void>,
): void (
options: Omit<TestDefinition, "fn" | "ignore">,
fn: (t: TestContext) => void | Promise<void>,
): void Свойства
Регистрирует параметризованную группу пропускаемых тестов. См. DenoTest.each.
интерфейс Deno.TestOnly
Сокращённая запись для выбора определённого тестового случая. См. DenoTest.only.
Сигнатуры вызова
(t: Omit<TestDefinition, "only">): void (
name: string,
fn: (t: TestContext) => void | Promise<void>,
): void (fn: (t: TestContext) => void | Promise<void>): void (
name: string,
options: Omit<TestDefinition,
"fn"
| "name"
| "only"
>,
fn: (t: TestContext) => void | Promise<void>,
): void (
options: Omit<TestDefinition,
"fn"
| "name"
| "only"
>,
fn: (t: TestContext) => void | Promise<void>,
): void (
options: Omit<TestDefinition, "fn" | "only">,
fn: (t: TestContext) => void | Promise<void>,
): void Свойства
Регистрирует параметризованную группу выбранных тестов. См. DenoTest.each.
интерфейс Deno.TestSnapshotOptions
Параметры, которые можно задать при вызове Deno.TestContext.assertSnapshot.
Параметры типа
T = unknown Свойства
dir: string Каталог для выходных файлов снимков относительно каталога файла теста (или абсолютный путь). Файлы снимков записываются в этот каталог вместо каталога __snapshots__ по умолчанию. Для каталога требуются разрешения на чтение и, при использовании --update-snapshots, на запись.
Если указаны оба параметра — dir и path, — dir игнорируется.
path: string Путь к выходному файлу снимка относительно каталога файла теста (или абсолютный путь). Снимок сохраняется в этот файл вместо файла __snapshots__/<test file name>.snap по умолчанию. Для файла требуются разрешения на чтение и, при использовании --update-snapshots, на запись.
Если указаны оба параметра — dir и path, — dir игнорируется.
name: string Имя снимка, используемое в файле снимков вместо имени, сформированного на основе имён теста и шага.
msg: string Сообщение об ошибке, используемое при неудачной проверке вместо автоматически созданного сообщения с различиями.
serializer: (actual: T) => string Функция, используемая для сериализации значения в строку перед сравнением с сохранённым снимком. По умолчанию используется сериализатор на основе Deno.inspect().
интерфейс Deno.TestStepDefinition
Свойства
fn: (t: TestContext) => void | Promise<void> Тестовая функция, которая проверяется при выполнении этого шага. Функция может принимать аргумент, предоставляющий информацию о контексте текущего шага.
name: string Имя шага.
ignore: boolean Если значение истинно, текущий шаг теста будет пропущен.
Это быстрый способ пропустить шаг, но его также можно использовать для условной логики, например, чтобы определить, доступна ли функция среды.
sanitizeOps: boolean Проверяет, что число завершённых асинхронных операций после шага теста совпадает с числом запущенных операций. Это гарантирует, что проверяемый код не запускает асинхронные операции, которые затем не ожидает. Это помогает предотвратить логические ошибки и утечки памяти в коде приложения.
По умолчанию используется значение родительского теста или шага.
sanitizeResources: boolean Проверяет, что шаг теста не оставляет «утечки» ресурсов, например открытых файлов или сетевых подключений, сравнивая открытые ресурсы в начале шага с открытыми ресурсами в конце шага.
По умолчанию используется значение родительского теста или шага.
sanitizeExit: boolean Проверяет, что шаг теста не приводит к преждевременному завершению процесса, например, при вызове Deno.exit.
По умолчанию используется значение родительского теста или шага.
переменная Deno.test
Регистрирует тест, который будет запущен при использовании deno test в командной строке, если содержащий его модуль распознан как тестовый.
При необходимости fn может быть асинхронной.
Тесты обнаруживаются до выполнения, поэтому их регистрация должна происходить во время загрузки модуля. Вложенные вызовы Deno.test() не поддерживаются. Для вложенных тестов используйте t.step().
import { assertEquals } from "jsr:@std/assert";
Deno.test({
name: "example test",
fn() {
assertEquals("world", "world");
},
});
Deno.test({
name: "example ignored test",
ignore: Deno.build.os === "windows",
fn() {
// This test is ignored only on Windows machines
},
});
Deno.test({
name: "example async test",
async fn() {
const decoder = new TextDecoder("utf-8");
const data = await Deno.readFile("hello_world.txt");
assertEquals(decoder.decode(data), "Hello world");
}
});
Тип
© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/api/deno/testing