Как запустить один тест с использованием Jest?


356

У меня есть тест «работает с вложенными детьми» в файле fix-order-test.js.

Запуск ниже запускает все тесты в файле.

jest fix-order-test

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

jest 'works with nested children'


поскольку вы используете командную строку jest, возможно, через npm, просто добавьте --testNamePattern 'works with nested children' Jest CLI Options #testNamePattern
steven87vt

@BioGenX: ссылка теперь не работает
Дан Даскалеску

Ответы:


429

Из командной строки используйте флаг --testNamePatternили-t

jest -t 'fix-order-test'

Это будет запускать только те тесты, которые соответствуют заданному вами шаблону имени. Это в Jest Docs .

Другой способ - запустить тесты в режиме наблюдения, jest --watchа затем нажать, pчтобы отфильтровать тесты, введя имя файла теста или tзапустить одно имя теста.


Если у вас itвнутри describeблока, вы должны запустить

jest -t '<describeString> <itString>'

Я получаю нераспознанные опции для -t. Да, в документации это упоминается. Флаг был добавлен в 16.0. Я на последней версии. jest -help, кажется, не упоминает флаг. Спасибо.
Виджайст

12
Просто обратите внимание, что это тестовый шаблон для конкретного имени теста внутри it()функции, а не имени файла. О чем я и думал.
HussienK

70
Если вы используете тест npm, вам нужно это сделатьnpm test -- -t "fix order test"
Sarsaparilla

3
Это работает для меня, но также пропускает все остальные тесты в проекте, которые являются медленными для больших проектов. Указание конкретного файла теста, в котором этот тест действительно помогает:./node_modules/.bin/jest --config=./.jest.config.json ./src/x/y/sites.js/sitesWorker.test.js -t 'given only incorrect sites'
anon58192932

У меня работает без указания <descriptionString>, я заметил, что это на несколько медленнее, чем grep мокко (-g 'searchString') - но я возьму это :-)
schmoopy

125

Документация Jest рекомендует следующее:

Если тест не пройден, первое, что нужно проверить, должно быть, проваливается ли тест, когда он выполняется только один раз. В Jest просто запустить только один тест - просто временно измените эту test команду наtest.only

test.only('this will be the only test that runs', () => {
   expect(true).toBe(false);
});

или

it.only('this will be the only test that runs', () => {
   expect(true).toBe(false);
});

7
У меня работает с шуткой 20.0.4. Хотя он пропускает только остальные тесты в этом файле. Тесты в других файлах продолжают выполняться, если вы уже не ограничивали запуск одним файлом.
Холф

7
Однако это забавная вещь - поскольку он запускает тесты асинхронно, он, вероятно, не может определить, какой тест для запуска в каком файле с самого начала. Таким образом, он будет запускать все файлы по умолчанию и проверять наличие файлов test.only. Так что если вы только хотите , чтобы запустить один тест в файл , который имеет множество тестовых случаев в пределах набора testcases , который состоит из множества файлов вы должны , к сожалению , работать , что один файлjest myTestFile.test.js
слоеный

@johnslay: Да, только что проверил
ненадежно,

@ flaky Я думаю, я хотел сказать, что это не работает при запуске npm test. Вам нужно будет запустить файл самостоятельно или нажать, pчтобы установить фильтр.
Johnslay

3
@johnslay хорошо, спасибо, что прочитали предыдущие комментарии, прежде чем писать свой ответ, я думаю, / с :)
облезли

55

Как упоминалось в других ответах, test.onlyпросто отфильтровывает другие тесты в том же файле . Таким образом, тесты в других файлах все равно будут выполняться.

Итак, для запуска одного теста есть два подхода:

  • Вариант 1. Если ваше имя теста является уникальным, вы можете ввести его tв режиме просмотра и ввести имя теста, который вы хотите запустить.

  • Вариант 2:

    1. Нажмите pв режиме просмотра, чтобы ввести регулярное выражение для имени файла, которое вы хотите запустить. (Соответствующие команды, подобные этой, отображаются при запуске Jest в режиме просмотра).
    2. Изменение itк it.onlyна тест вы хотели бы работать.

При любом из указанных выше подходов Jest запускает только один тест в указанном вами файле.


54

Полная команда для запуска одного теста Jest

Команда:

node <path-to-jest> -i <you-test-file> -c <jest-config> -t "<test-block-name>"

  • <path-to-jest>:
    • Окна: node_modules\jest\bin\jest.js
    • Другие: node_modules/.bin/jest
  • -i <you-test-file>: путь к файлу с тестами ( jsили ts)
  • -c <jest-config>: путь к отдельному файлу конфигурации Jest (JSON), если вы сохраняете свою конфигурацию Jest, package.jsonвам не нужно указывать этот параметр (Jest найдет его без вашей помощи)
  • -t <the-name-of-test-block>: На самом деле это имя (первый параметр) из describe(...), it(...)или test(...)блока.

Пример:

describe("math tests", () => {

  it("1 + 1 = 2", () => {
    expect(1 + 1).toBe(2);
  });

  it("-1 * -1 !== -1", () => {
    expect(-1 * -1).not.toBe(-1);
  });

});

Итак, команда

node node_modules/jest/bin/jest.js -i test/math-tests.js -c test/tests-config.json -t "1 + 1 = 2"

будет проверять it("1 + 1 = 2", ...), но если вы измените -tпараметр на, "math tests"то он будет запускать оба теста из describe("math tests",...)блока.

Примечания:

  1. Для Windows заменить node_modules/.bin/jestна node_modules\jest\bin\jest.js.
  2. Такой подход позволяет отлаживать запущенный скрипт. Для включения отладки добавьте '--inspect-brk'параметр в команду.

Выполнение одиночного Jest-теста с помощью сценариев NPM в package.json

Установив Jest, вы можете упростить синтаксис этой команды (см. Выше) с помощью сценариев NPM . В "package.json"добавляем новый скрипт в "scripts"раздел:

"scripts": {
  "test:math": "jest -i test/my-tests.js -t \"math tests\"",
}

В этом случае мы используем псевдоним 'jest'вместо записи полного пути к нему. Кроме того, мы не указываем путь к файлу конфигурации, так как мы можем поместить его в файл, "package.json"и Jest рассмотрит его по умолчанию. Теперь вы можете запустить команду:

npm run test:math

и "math tests"блок с двумя тестами будет выполнен. Или, конечно, вы можете указать один конкретный тест по имени.

Другой вариант - извлечь <the-name-of-test-block>параметр из "test:math"сценария и передать его из команды NPM:

package.json:

"scripts": {
  "test:math": "jest -i test/my-tests.js -t",
}

Команда:

npm run test:math "math tests"

Теперь вы можете управлять именем запускаемых тестов с помощью более короткой команды.

Примечания:

  1. Команда 'jest'будет работать со сценариями NPM, потому что

    npm делает "./node_modules/.bin"первую запись в PATHпеременной среды при запуске любых сценариев жизненного цикла, так что это будет работать нормально, даже если ваша программа не установлена ​​глобально ( блог NPM )

  2. Этот подход, кажется, не позволяет отладку, потому что Jest запускается через его двоичный файл / CLI , а не через node.

Запуск выбранного Jest-теста в коде Visual Studio

Если вы используете код Visual Studio, вы можете воспользоваться им и запустить текущий выбранный тест (в редакторе кода), нажав F5кнопку. Для этого нам потребуется создать новый файл конфигурации запуска в ".vscode/launch.json"файле. В этой конфигурации мы будем использовать предопределенные переменные, которые заменяются соответствующими (к сожалению, не всегда ) значениями при запуске. Из всех доступных нам интересны только эти:

  • ${relativeFile} - текущий открытый файл относительно ${workspaceFolder}
  • ${selectedText} - текущий выделенный текст в активном файле

Но перед записью конфигурации запуска мы должны добавить 'test'скрипт в наш 'package.json'(если у нас его еще нет).

package.json:

"scripts": {
  "test": "jest"
}

тогда мы можем использовать его в нашей конфигурации запуска.

Конфигурация запуска:

{
  "type": "node",
  "request": "launch",
  "name": "Run selected Jest test",
  "runtimeExecutable": "npm",
  "runtimeArgs": [
    "run-script",
    "test"
  ],
  "args": [
    "--",
    "-i",
    "${relativeFile}",
    "-t",
    "${selectedText}"
  ],
  "console": "integratedTerminal",
}

он фактически делает то же самое, что и команды, описанные ранее в этом ответе. Теперь, когда все готово, мы можем запустить любой тест без необходимости переписывать параметры команды вручную.

Вот все, что вам нужно сделать:

  1. Выберите созданную конфигурацию запуска на панели отладки:

выберите конфигурацию запуска в панели отладки VSCode

  1. Откройте файл с тестами в редакторе кода и выберите название теста, который вы хотите проверить (без кавычек):

выберите название теста

  1. Нажмите 'F5'кнопку.

И вуаля!

Теперь для запуска любого теста просто откройте его в редакторе, выберите его имя и нажмите F5.

К сожалению, это не будет "вуаля" на машинах с Windows, потому что они заменяют (кто знает почему) ${relativeFile}переменную путем обратного слеша, и Jest не поймет такой путь.

Примечания:

  1. Для запуска под отладчиком не забудьте добавить '--inspect-brk'параметр.
  2. В этом примере конфигурации у нас нет параметра конфигурации Jest, при условии, что он включен в 'package.json'.

1
Отлично! Это должен быть принятый ответ. Особенно если добавить упоминание об npxупрощении вызова Jest вне зависимости от ОС.
Дан Даскалеску

19

Вы также можете использовать fили, xчтобы сфокусировать или исключить тест. Например

fit('only this test will run', () => {
   expect(true).toBe(false);
});

it('this test will not run', () => {
   expect(true).toBe(false);
});

xit('this test will be ignored', () => {
   expect(true).toBe(false);
});

1
Не уверен, почему этот ответ был отклонен, кажется, чтобы ответить на вопрос и работает.
Мбиллард

1
xitу меня сработало, но fitнет. Я использую Jest @ 22.4.4.
Хинрих

fitу меня работает в jest@23.1.0.
jcubic

Я думаю, что основным недостатком этого подхода является то, что - если вы просто пытаетесь углубиться в один тест для исправления ошибки - это влечет за собой ненужные изменения в базовых тестовых файлах. Если по какой-либо причине вы хотите сохранить тестовый код (скажем, между коммитами), это может иметь смысл.
Webelo

fэто работает только в пределах одного файла.
Сергей

14

Как сказано выше, вы можете запустить команду

jest -t 'fix-order-test'

Если у вас itвнутри describeблока, вы должны запустить

jest -t '<describeString> <itString>'

13

Если вы jestиспользуете команду сценария, что-то вроде этого npm test, вам нужно использовать следующую команду, чтобы она работала:

npm test -- -t "fix order test"

8

В последней версии Jest вы можете использовать одно из следующих, чтобы запустить только один тест, то же самое для набора тестов.

it.only('test 1', () => {})

test.only('test 1', () => {})

fit('test 1', () => {})

jest 'test 1' может также работать, если имя теста уникально.


4

В VS Code это позволяет мне запускать / отлаживать только 1 Jest тест с точками останова: https://github.com/Microsoft/vscode-recipes/tree/master/debugging-jest-tests

У меня launch.jsonесть это внутри:

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Jest All",
      "program": "${workspaceFolder}/node_modules/.bin/jest",
      "args": ["--runInBand"],
      "console": "integratedTerminal",
      "internalConsoleOptions": "neverOpen",
      "windows": {
        "program": "${workspaceFolder}/node_modules/jest/bin/jest",
      }
    },
    {
      "type": "node",
      "request": "launch",
      "name": "Jest Current File",
      "program": "${workspaceFolder}/node_modules/.bin/jest",
      "args": ["${relativeFile}"],
      "console": "integratedTerminal",
      "internalConsoleOptions": "neverOpen",
      "windows": {
        "program": "${workspaceFolder}/node_modules/jest/bin/jest",
      }
    }
  ]
}

и это в package.json:

  "scripts": {
    "test": "jest"
  }
  • Чтобы запустить 1 тест, в этом тесте измените test(или it) на test.only(или it.only). Чтобы запустить 1 набор тестов (несколько тестов), измените describeна describe.only.
  • Установите точку останова (ов), если хотите.
  • В VS Code, перейдите в Debug View (Shift + Cmd + D).
  • В раскрывающемся меню сверху выберите Jest Current File.
  • Нажмите зеленую стрелку, чтобы запустить этот тест.

В моем случае ваш конфиг запускает только один тест (с it.only (...)), но он не останавливается на точках останова :(
Tudor Leustean

Получение JavaScript для достижения точек останова в отладчике может быть сложным из-за его асинхронного характера. В VS Code поиграйте с тем, куда вы ставите точки останова, а также с командами в меню «Отладка», пока они не достигнут их. Если он продолжает пропускать точки останова, поместите их РАНЬШЕ в ваш код. Если 1 файл вызывает функцию в другом файле, поместите точку останова на вызов этой функции, а затем "Step Into" вызов для перехода к файлам. Поиграйте с этими командами отладки: «Шаг вперед, шаг вперед, шаг вперед, продолжение»
Рэймонд Ган,

На самом деле, вам не нужно "scripts": { "test": "jest" }в package.jsonпотому , что вы указали полный путь в "program"параметре в launch.json.
Сергей

4

просто небольшое дополнение, потому что, кажется, была какая-то драка, если использовать ./node_modules/.bin/jest -i ...или просто jest -i ...илиnpm test -- -i ...

  1. просто вызов jestработает, если он установлен глобально (как с npm install -g jest), не очень чистый способ обработки зависимостей
  2. если вы установили jest только локально в пакете и хотите вызвать jest-скрипт без обхода сценария npm, вы можете использовать npx jest -i ...=>, это именно то, для чего предназначен npx. спасает вас от письма./node_modules/.bin/...

3

Вот мое взятие:

./node_modules/.bin/jest --config test/jest-unit-config.json --runInBand src/components/OpenForm/OpenForm.spec.js -t 'show expanded'

Ноты:

  • ./node_modules/.bin/...это прекрасный способ получить доступ к локально установленному двоичному файлу jest (или mocha или ...), который поставляется вместе с локально установленным пакетом. (да, в ваших сценариях npm вы можете jestничего не делать раньше, но это удобно в командной строке ... (это также хорошее начало для вашей конфигурации отладки, какую бы среду IDE вы не использовали ...)
  • Ваш проект может не иметь набора параметров конфигурации. Но если это произойдет (загляните в сценарии package.json), это то, что вам нужно.
  • --runInBand - как уже говорилось, не знаю о вашей конфигурации, но если вы сосредоточены на разработке / исправлении одного теста, вы скорее не хотите иметь дело с веб-работниками ...
  • да, вы можете указать полный, явный путь к вашему файлу
  • опционально , вы можете использовать, -tчтобы не запускать все тесты в этом файле, а только один (здесь: тот, у которого есть что-то с ' show expanded' в его имени). Тот же эффект может быть достигнут путем склеивания .only()в этот файл.

0

Теперь есть хороший плагин для шуток, jest-watch-typeaheadкоторый делает этот процесс намного проще.


0
npm run test -- test-name

Это будет работать только в том случае, если ваша спецификация теста уникальна. Код выше будет ссылаться

файл с таким именем: test-name.component.spec.ts

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.