Spec-Zone.ru › Deno 2

Тестирование

Надёжные возможности тестирования и бенчмаркинга для обеспечения качества и производительности кода.

Например, 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");
  }
});

Параметры

b: BenchDefinition

Тип возвращаемого значения

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

Контекст, передаваемый функции, для которой выполняется бенчмаркинг. Экземпляр используется совместно между итерациями бенчмарка. Например, его методы позволяют исключить из измеряемой части функции определённый участок.

Свойства

name: string

Текущее имя бенчмарка.

origin: string

Строковый URL текущего бенчмарка.

Методы

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");
  },
);

Свойства

each: TestEach

Зарегистрируйте параметризованную группу тестов — по одному тесту для каждого случая в 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);
});
ignore: TestIgnore

Сокращённая запись для пропуска отдельного тестового случая.

only: TestOnly

Сокращённая запись для выделения отдельного тестового случая.

Методы

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

Свойства

each: TestEach

Регистрирует параметризованную группу пропускаемых тестов. См. 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

Свойства

each: TestEach

Регистрирует параметризованную группу выбранных тестов. См. 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");
  }
});

Тип

DenoTest

© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/api/deno/testing

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API