Перейти до вмісту

Тестування

Запускайте файли 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

Чи була ця сторінка корисною?