Перейти к содержимому

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

Запускайте файлы node:test на JavaScript и TypeScript и тесты JUnit с elide test: обнаружение, выбор тестов, параметры, отчёты и покрытие.

На этой странице

elide test запускает файлы node:test на JavaScript и TypeScript и тесты JUnit.

elide test

Упавший тест делает код выхода ненулевым.

0:13 / 0:13

JavaScript и TypeScript

Тесты используют API node:test и не требуют манифеста. Файл считается тестом, если он соответствует *.test.*, *.spec.*, *_test.* или *_spec.* либо лежит в test, tests или __tests__. Расширения: .js, .mjs, .cjs, .ts, .mts, .cts.

Обнаружение пропускает скрытые каталоги, каталоги зависимостей и результатов сборки. Оно останавливается на любом вложенном проекте (каталоге с elide.pkl, package.json, pom.xml или requirements.txt), поэтому из корня рабочего пространства тесты участников не находятся. Чтобы запустить их, укажите путь.

import test from "node:test";
import assert from "node:assert";

test("adds two values", () => {
  assert.equal(1 + 1, 2);
});

Тесты JVM

Тесты JVM выполняются на JUnit Platform и требуют elide.pkl. src/test — набор исходников для тестов по умолчанию; объявленный набор исходников типа test заменяет его (Наборы исходников).

  • Тестовые наборы получают testPackages и зависимости основного набора.
  • Встроенные библиотеки JUnit добавляются по умолчанию. jvm.features.testing = false убирает и API JUnit для компиляции, и встроенную среду выполнения; тогда для запуска тестов JVM нужен консольный лаунчер JUnit (junit-platform-console) в testPackages, иначе запуск завершается ошибкой. На запуски без тестов JVM это не влияет.
  • processors применяются к тестовым исходникам.
  • Тестовая JVM получает jvm.flags и jvm.defs (как -D).
  • Зависимости modules тестового и основного наборов попадают в --module-path с --add-modules=ALL-MODULE-PATH.
  • Настройки параллелизма в junit-platform.properties на тестовом classpath переопределяют --concurrency.

Выбор тестов

Пути, каталоги или glob-шаблоны сужают набор тестов JavaScript и TypeScript:

elide test src/api
elide test src/api/client.test.ts

С аргументами-путями тесты JVM пропускаются, и выводится Path filtering unsupported for JVM tests: <paths>. -t отбирает тесты по имени в обоих средствах запуска тестов:

elide test -t 'parses .+ headers'

Тесты JVM принимают селекторы JUnit и выражения тегов:

elide test --select=class:com.example.ParserTest
elide test --select=method:com.example.ParserTest#parsesHeaders
elide test --select=package:com.example.parser   # the package and its subpackages
elide test com.example.parser                     # a dotted bare token is a package selector
elide test --include-tag=fast --include-tag=unit  # fast OR unit
elide test --exclude-tag=slow --exclude-tag=flaky # neither slow nor flaky
elide build test --select=class:com.example.ParserTest
0:15 / 0:15

--include-tag='slow & !flaky' — одно выражение. Фильтры тегов применяются после селекторов.

Вывод и отчёты

Ход выполнения выводится в stderr, итоговая сводка — в stdout:

elide test > summary.txt
elide test 2> progress.txt

Отчёты записываются в .dev/reports/tests/<language>/<source-set>/. testing.reports в elide.pkl включает их без флага:

import "elide:Testing.pkl" as Testing

testing {
  reports { Testing.xmlReport() }
}

Вывод TAP

--reporter=tap превращает stdout в чистый поток TAP 13:

TAP version 13
# start 1: suite A > t1
# out 1: printed from inside a test
ok 1 - suite A > t1
# start 2: broken
not ok 2 - broken
  ---
  message: "expected 1 to equal 2"
  severity: "ERR_ASSERTION"
  ...
1..2
  • # start <id> открывает тест; строки его вывода имеют вид # out <id>: <text>. # out: <text> не относится ни к одному тесту.
  • Тестовые точки нумеруются 1..N в порядке завершения. Сопоставляйте точки с тестами по строке # start, а не по номеру.
  • Блок YAML появляется только у падений с подробностями; severity — код ошибки средства запуска тестов, если он есть.
  • Stderr не оборачивается: elide test --reporter=tap 2>&1 не является корректным TAP.
  • JVM: вывод привязывается к своему тесту, только пока выполняется ровно один тест. С --concurrency больше 1 или с junit-platform.properties в проекте он остаётся непривязанным.
  • JavaScript: console.log внутри теста или на верхнем уровне после импорта node:test оборачивается. Вывод до этого импорта выводится как есть. Вывод хука относится к тесту, который хук оборачивает; t.diagnostic оборачивается как # out.

Покрытие

elide test --coverage
elide run --coverage

Покрытие JVM записывается в .dev/reports/coverage/jvm/<task>/ в формате HTML, XML или CSV; покрытие JavaScript и TypeScript — в формате LCOV, в .dev/reports/coverage/js/lcov.info для тестов и .dev/reports/coverage/js/run/lcov.info для запусков. В консоль выводится одна общая сводка. Блок coverage верхнего уровня собирает покрытие без флага:

import "elide:Coverage.pkl" as Coverage

coverage {
  enabled = true
  scope = "tests"
  jvm {
    excludes { "org.example.generated.*" }
    reports {
      Coverage.xmlReport()
      Coverage.htmlReport()
    }
  }
  js {
    paths { "src" }
  }
}
СвойствоЗначениеПо умолчанию
enabledСобирать без --coverage.false
scope"tests", "runs" или "all"; --coverage всегда покрывает свою задачу."tests"
jvm.reportsCoverage.htmlReport(), xmlReport(), csvReport().нет
jvm.excludesШаблоны классов (*, ?), которые не инструментируются, например сгенерированный код.нет
js.pathsКорни исходников для отчёта; пустой список означает весь проект.нет

С покрытием elide run запускает отдельный процесс JVM.

Параметры

ПараметрДействие
-t REGEXОтбирать по имени теста или объемлющего набора тестов.
--where CELJavaScript: запускать тесты, для которых истинно выражение CEL над name, parents и file.
--select=SELECTORJVM: селектор class:, method: или package:; можно повторять.
--include-tag=EXPRJVM: запускать тесты с подходящими тегами; повторы объединяются через ИЛИ.
--exclude-tag=EXPRJVM: пропускать тесты с подходящими тегами; повторы объединяются через И.
--bail[=N]Остановиться после N падений (по умолчанию 1).
--test-timeout=MSТайм-аут одного теста по умолчанию.
--timeout DURATIONОграничение времени на весь вызов (глобальный параметр).
--onlyЗапускать только тесты, помеченные .only.
--concurrency=NЗапускать файлы или классы JVM параллельно. По умолчанию 1; 0 недопустимо.
--coverageСобирать покрытие; см. Покрытие.
--reporter=junitПисать отчёты JUnit XML.
--reporter=tapПисать TAP 13 в stdout (и в --reporter-outfile).
--reporter-outfile=DIRКаталог отчётов.
--debugger[=MODE|ADDRESS]Подключить отладчик; см. ниже.
--debugger-host=HOST, --debugger-port=PORTАдрес отладчика JavaScript (DAP: 4711; CDP: 1337).
Форма --debuggerЧто отлаживает
без значенияТесты JVM через JDWP на 127.0.0.1:5005 и тесты JavaScript.
=5005, =host:5005Только тесты JVM (JDWP).
=dap, =cdpТолько тесты JavaScript.

Синтаксис: Отладка. Неизвестный параметр или пропущенное значение приводит к ошибке до начала запуска (Задачи сборки).

Ограничения

  • Обнаружения тестов Python нет; запускайте unittest или pytest (Тесты Python).
  • Тестам JVM нужен манифест.
  • Не реализовано: снапшоты node:test, mock.module, режим наблюдения, программный run(), node:test/reporters.

Поддерживаемый API: API тестов Node.

Примеры

Начните с шаблона:

elide init --template java        # Java app with a JUnit test
elide init --template ktjvm       # Kotlin app with a test

Была ли эта страница полезной?