如何使用Jest运行单个测试?


355

我在fix-order-test.js文件中有一个测试“可与嵌套子代一起工作”。

运行以下命令将运行文件中的所有测试。

jest fix-order-test

如何只运行一个测试?以下内容不起作用,因为它搜索指定的正则表达式文件。

jest 'works with nested children'


由于您使用的是jest命令行,可能要通过npm,然后只需添加--testNamePattern 'works with nested children' Jest CLI选项#testNamePattern
steven87vt

@BioGenX:链接现在已断开
Dan Dascalescu

Answers:


427

在命令行中使用--testNamePattern-t标志

jest -t 'fix-order-test'

这只会运行与您提供的测试名称模式匹配的测试。在Jest docs中

另一种方法是在监视模式下运行测试,jest --watch然后按键p入测试文件名或t运行单个测试名称以筛选测试。


如果您itdescribe街区内部,则必须运行

jest -t '<describeString> <itString>'

我正在获得-t的无法识别的选项。是的,文档中确实提到了它。该标志已在16.0中添加。我使用的是最新版本。jest -help似乎没有提到该标志。谢谢。
vijayst

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,19年

在不指定<describeString>的情况下为我工作,我注意到它的大小比摩卡的grep(-g'searchString')慢-但我会接受它:-)
schmoopy

124

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。尽管它仅跳过该文件中的其余测试。除非您已将运行限制在一个文件中,否则其他文件中的测试将继续运行。
Holf

7
不过,这只是个玩笑-因为它异步运行测试,因此可能一开始就无法确定哪个测试在哪个文件中运行。因此它将默认运行所有文件,并在文件中检查test.only。因此,如果您只想在包含多个文件的一组测试用例中包含多个测试用例的文件中运行一个测试,那么不幸的是,您必须运行该单个文件jest myTestFile.test.js
不稳定的2009年

@johnslay:确实如此,只是对其进行了测试
片状的

@flaky我想说的是要在运行时不起作用npm test。您必须自己运行文件或按p设置过滤器。
约翰斯莱18-3-14

3
@johnslay好,感谢您在写您的回复之前阅读了以前的评论,我猜是/ s :)
片状

55

如其他答案所述,test.only仅过滤掉同一文件中的其他测试。因此,其他文件中的测试仍将运行。

因此,要运行一个测试,有两种方法:

  • 选项1:如果测试名称是唯一的,则可以t在监视模式下输入,然后输入要运行的测试的名称。

  • 选项2:

    1. p在观看模式下按下时,输入要运行的文件名的正则表达式。(当您在监视模式下运行Jest时,将显示诸如此类的相关命令)。
    2. 更改itit.only要运行的测试。

通过上述两种方法,Jest只会在您指定的文件中运行单个测试。


52

使用完整命令运行单个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>:包含测试(jsts)的文件的路径
  • -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/jestnode_modules\jest\bin\jest.js
  2. 这种方法允许您调试正在运行的脚本。要启用调试'--inspect-brk',请在命令中添加参数。

通过“ package.json”中的NPM脚本运行单个Jest测试

安装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 blog

  2. 这种方法似乎不允许调试,因为Jest是通过其Binary / CLI运行的,而不是通过运行的node

在Visual Studio Code中运行选定的Jest测试

如果您使用的是Visual Studio Code,则可以利用它并通过按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配置参数包含在中,则没有Jest配置参数'package.json'

优秀的!这应该是公认的答案。尤其是在添加提及的情况下npx,无论使用哪种操作系统,都可以大大简化对Jest的调用。
Dan Dascalescu

19

您也可以使用fx集中或排除测试。例如

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
不知道为什么这个答案被否决了,它似乎可以回答问题并起作用。
mbillard '18

1
xit确实为我工作,但fit没有。我正在使用jest@22.4.4。
辛里奇

fit为我工作在jest@23.1.0中。
jcubic

我认为这种方法的主要缺点是-如果您只是尝试深入研究一个错误以修复错误-则需要对基础测试文件进行不必要的更改。如果出于某种原因,您想要维护测试代码(例如跨提交),那么这可能是有道理的。
webelo

f它只能在一个文件中使用。
谢尔盖

14

如上所述,您可以运行命令

jest -t 'fix-order-test'

如果您itdescribe街区内部,则必须运行

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个测试套件(几个测试),请更改describedescribe.only
  • 如果需要,设置断点。
  • 在“ VS代码”中,转到“调试视图”(Shift + Cmd + D)。
  • 从顶部的下拉菜单中选择Jest Current File
  • 单击绿色箭头以运行该测试。

就我而言,您的配置仅运行一项测试(使用它。only(...)),但它不会在断点处停止:(
Tudor Leustean

由于JavaScript具有异步特性,因此在调试器中使其达到断点可能很棘手。在VS Code中,在断点以及“调试”菜单中的命令旁边进行操作,直到命中为止。如果它继续跳过断点,请将其放在代码中的EARLIER位置。如果1个文件在另一个文件中调用一个函数,则在该函数调用处放置断点,然后“进入”该调用以跳转文件。玩以下调试命令:“逐步,进入,退出,继续”
Raymond Gan

实际上,您不需要 "scripts": { "test": "jest" }in,package.json因为您已经在中的"program"参数中指定了完整路径launch.json
谢尔盖

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 –如前所述,不了解您的配置,但是如果您专注于开发/修复单个测试,则宁愿不与Web工作者打交道...
  • 是的,您可以为文件提供完整的显式路径
  • (可选)您可以-t用来不运行该文件中的所有测试,而只能运行一个测试(此处为:一个show expanded名称中带有“ ”的测试)。通过粘贴.only()到该文件中可以达到相同的效果。

3

只是一个附加组件,因为似乎在使用./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/...


0
npm run test -- test-name

仅当您的测试规范名称唯一时,这才起作用。上面的代码将引用

具有以下名称的文件: test-name.component.spec.ts

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.