ChatGPT解决这个技术问题 Extra ChatGPT

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

我在文件 fix-order-test.js 中有一个“适用于嵌套子项”的测试。

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

jest fix-order-test

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

jest 'works with nested children'
因为您使用 jest 命令行,可能通过 npm 然后添加 --testNamePattern 'works with nested children' Jest CLI Options #testNamePattern
@BioGenX:链接现在已损坏

R
Rahul Bhobe

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

jest -t 'fix-order-test'

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

另一种方法是在监视模式下运行测试,jest --watch,然后按 P 通过键入测试文件名来过滤测试或按 T 运行单个测试名称.

如果 describe 块中有 it,则必须运行

jest -t '<describeString> <itString>'

我得到了无法识别的 -t 选项。是的,文档确实提到了它。该标志已在 16.0 中添加。我在最新版本。 jest -help 似乎没有提到该标志。谢谢。
请注意,这是 it() 函数中特定测试名称的测试模式,而不是文件名。这是我的想法。
如果使用 npm test,你需要做 npm test -- -t "fix order test"
这对我有用,但它也会跳过项目中的所有其他测试,这对于大型项目来说很慢。指定测试所在的特定测试文件确实很有帮助:./node_modules/.bin/jest --config=./.jest.config.json ./src/x/y/sites.js/sitesWorker.test.js -t 'given only incorrect sites'
不确定当时是否是这种情况,但现在,如果您放弃 -t,它将只运行您关心的测试,而不会跳过所有其他测试。
p
peterjmag

Jest documentation 建议如下:

如果测试失败,首先要检查的事情之一应该是测试是否失败,因为它是唯一运行的测试。在 Jest 中,只运行一个测试很简单——只需将该测试命令临时更改为 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);
});

用 jest 20.0.4 为我工作。虽然它只跳过该文件中的其余测试。其他文件中的测试继续运行,除非您已经将运行限制在一个文件中。
不过这是个笑话——因为它异步运行测试,它可能无法确定从一开始就在哪个文件中运行哪个测试。因此它将默认运行所有文件,并在文件内检查 test.only。因此,如果您只想在包含许多文件的一组测试用例中包含许多测试用例的文件中运行一个测试,那么不幸的是,您必须运行该单个文件 jest myTestFile.test.js
@johnslay:确实如此,只是测试了一下
@johnslay 好,感谢您在写回复之前阅读之前的评论,我猜 /s :)
可爱的灵魂
M
Michael Freidgeim

运行单个 Jest 测试的完整命令

命令:

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

:Windows:node_modules\jest\bin\jest.js 其他:node_modules/.bin/jest

Windows:node_modules\jest\bin\jest.js

其他:node_modules/.bin/jest

-i :测试文件的路径(js 或 ts)

-c :一个单独的 Jest 配置文件 (JSON) 的路径,如果你在 package.json 中保存你的 Jest 配置,你不必指定这个参数(Jest 会在没有你帮助的情况下找到它)

-t :实际上是 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",...) 块运行两个测试。

评论:

对于 Windows,将 node_modules/.bin/jest 替换为 node_modules\jest\bin\jest.js。这种方法允许您调试正在运行的脚本。要启用调试,请在命令中添加“--inspect-brk”参数。

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

安装 Jest 后,您可以使用 NPM scripts 简化此命令(如上)的语法。在 "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" 块。或者,当然,您可以通过名称指定一个特定的测试。

另一种选择是在 "test:math" 脚本之外提取 <the-name-of-test-block> 参数并从 NPM 命令传递它:

包.json:

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

命令:

npm run test:math "math tests"

现在您可以使用更短的命令来管理运行测试的名称。

评论:

'jest' 命令将适用于 NPM 脚本,因为

在运行任何生命周期脚本时,npm 使“./node_modules/.bin”成为 PATH 环境变量中的第一个条目,因此即使您的程序未全局安装(NPM 博客)2. 这种方法似乎也不会正常工作允许调试,因为 Jest 是通过其二进制/CLI 运行的,而不是通过节点。

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

如果您使用的是 Visual Studio Code,您可以利用它并通过按 F5 按钮运行当前选择的测试(在代码编辑器中)。为此,我们需要在 ".vscode/launch.json" 文件中创建一个新的 launch configuration block。在该配置中,我们将使用 predefined variables,在运行时将其替换为适当的(不幸的是 not always)值。在所有可用的资源中,我们只对这些感兴趣:

${relativeFile} - 当前打开的相对于 ${workspaceFolder} 的文件

${selectedText} - 活动文件中当前选定的文本

但是在写出启动配置之前,我们应该在我们的 'package.json' 中添加 'test' 脚本(如果我们还没有这样做的话)。

文件包.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",
}

它实际上与此答案中前面描述的命令相同。现在一切准备就绪,我们可以运行我们想要的任何测试,而无需手动重写命令参数。

这是您需要做的所有事情:

在调试面板中选择当前创建的启动配置:在代码编辑器中打开包含测试的文件,然后选择要测试的测试名称(不带引号):按 F5 按钮。

瞧!

现在运行你想要的任何测试。只需在编辑器中打开它,选择它的名称,然后按 F5。

不幸的是,在 Windows 机器上它不会是“voilà”,因为它们用路径 having reversed slashes 替换(谁知道为什么)${relativeFile} 变量,而 Jest 不会理解这样的路径。 (如果命令需要故障排除,请参阅 https://www.basefactor.com/using-visual-studio-code-to-debug-jest-based-unit-tests 中的类似方法)

评论:

要在调试器下运行,不要忘记添加“--inspect-brk”参数。在这个配置示例中,我们没有 Jest 配置参数,假设它包含在“package.json”中。


出色的!这应该是公认的答案。特别是如果它添加了 npx 以大大简化调用 Jest,无论操作系统如何。
令人惊讶的解释得很好的答案。可能开玩笑的文档也没有这个很好的解释:P
要跨平台,请在启动配置中使用 ${fileBasename} 而不是 ${relativeFile},因为 jest 无法解析带有反斜杠 '\' 的路径(Windows)
既然 VSCode 的 2020 年 11 月更新添加了以下新的 launch.json 变量,此解决方案能否在 Windows 中运行: ${fileWorkspaceFolder} - 解析为在活动 VS Code 编辑器中打开的文件的工作区文件夹路径。 ${fileDirnameBasename} - 解析为在活动 VS Code 编辑器中打开的文件所在的文件夹的名称。 ${pathSeparator} - 解析为操作系统用来分隔文件路径中的组件的字符。
对于使用 Windows 的用户,您可以添加一个 "--runTestsByPath" 参数来告诉 Jest 将 "${relativeFile}" 参数视为普通路径而不是 RegEx,以便正确解析反斜杠。
S
Salim

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

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

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

选项 2:在监视模式下按 p 以输入您要运行的文件名的正则表达式。 (当您在监视模式下运行 Jest 时,会显示类似这样的相关命令)。将其更改为 it.only 在您要运行的测试上。

在监视模式下按 p 以输入要运行的文件名的正则表达式。 (当您在监视模式下运行 Jest 时,会显示类似这样的相关命令)。

将其更改为 it.only 在您要运行的测试上。

使用上述任何一种方法,Jest 只会在您指定的文件中运行单个测试。


M
Mugur 'Bud' Chirica

如果您将 jest 作为脚本命令运行,例如 npm test,则需要使用以下命令使其工作:

npm test -- -t "fix order test"

如果你有很多测试文件,你也应该指定文件名。例如npm test -- testFile.js -t "fix order test"。否则它将遍历所有测试文件以查找匹配项,这需要更长的时间。
N
Nima Soroush

您还可以使用 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);
});

xit 对我有用,但 fit 没有。我正在使用 jest@22.4.4。
我认为这种方法的主要缺点是——如果你只是想深入研究一个测试来修复错误——它需要对底层测试文件进行不必要的更改。如果出于某种原因,您想维护测试代码(例如,跨提交),那么这可能是有道理的。
此外,fit 不起作用的原因与 it.only 不起作用的原因相同。它只会阻止 同一文件中的其他测试 运行。其他文件仍在运行。
it.only 和 it.skip 更具可读性,并且不太可能您不小心将临时更改提交到源代码管理
B
Bablu Ahmed

您可以尝试使用以下命令,因为它对我有用

npm run test -- -t 'Your test name'

或者您可以做的另一种方法是在您的测试中添加 .only,如下所示并运行命令 npm run test

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

P
Peter Mortensen

如上一个答案所述,您可以运行命令

jest -t 'fix-order-test'

如果 describe 块中有 it,则必须运行

jest -t '<describeString> <itString>'

P
Peter Mortensen

利用:

npm run test -- test-name

这仅在您的测试规范名称是唯一的情况下才有效。

上面的代码将引用具有此名称的文件:test-name.component.spec.ts


这对我有用!为了澄清其他阅读此答案的人:“测试规范名称”指的是 describe() 块内的文本。
谢谢!这是在 JHipster (7.8.1) 项目中无需更改代码或其他内容即可开箱即用的唯一解决方案。
P
Peter Mortensen

使用 latest Jest version,您可以使用以下方法之一仅运行一个测试,对于测试套件也是如此。

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

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

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

如果测试名称是唯一的,jest 'test 1' 也可以工作。


c
codeAline

在开玩笑的 26.6.0 上,这是唯一对我有用的东西:

jest -- test/unit/name-of-test-file.test.ts

并观看

jest --watch -- test/unit/name-of-test-file.test.ts


这加上 it.onlydescribe.only 可以很好地缩小测试范围
P
Peter Mortensen

在 Visual Studio Code 中,这让我只能运行/调试一个带有断点的 Jest 测试:Debugging tests in Visual Studio Code

我的 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"
  }

要运行一项测试,在该测试中,将 test(或 it)更改为 test.only(或 it.only)。要运行一个测试套件(多个测试),请将 describe 更改为 describe.only。

如果需要,设置断点。

在 Visual Studio Code 中,转到调试视图(Shift + Cmd + D 或 Shift + Ctrl + D)。

从顶部的下拉菜单中,选择 Jest Current File。

单击绿色箭头运行该测试。


就我而言,您的配置仅运行一个测试(使用 it.only(...)),但它不会在断点处停止:(
由于 JavaScript 的异步特性,让 JavaScript 在调试器中命中断点可能会很棘手。在 VS Code 中,尝试放置断点的位置,以及 Debug 菜单中的命令,直到遇到它们。如果它一直跳过断点,请将它们放在代码中的更早的位置。如果一个文件调用另一个文件中的函数,则在该函数调用处放置断点,然后“进入”调用以跳转文件。使用这些调试命令:“Step Over, Step Into, Step Out, Continue”
实际上,您不需要 package.json 中的 "scripts": { "test": "jest" },因为您已在 launch.json"program" 参数中指定了完整路径。
谢谢,那些 "${relativeFile}" 帮助我在 VSCode 中运行单个文件。
@TudorLeustean 可能值得一提,在您想要停止的行上添加 debugger; ,在我的情况下,通过 UI 设置断点也不适用于测试。
M
Michael Freidgeim

https://i.stack.imgur.com/riUgi.png


P
Peter Mortensen

npm test __tests__/filename.test.ts - 运行单个文件。

test.only('check single test', () => { expect(true).toBe(true)}); - 运行单个测试用例

test.skip('to skip testcase, () => {expect(false).toBe(false_}); - 跳过测试用例


A
Anton Swanevelder

https://jestjs.io/docs/cli#--testnamepatternregex

您的测试类似于这个名为 my.test.js 的文件

test("My Sum", () => {
  const sum = 3;
  expect(sum).toBe(3);
});

使用测试名称在 CLI 上运行

jest -t Sum

使用带有正则表达式匹配文件名部分的 npm test 示例:my.test.js

npm test -t my

P
Peter Mortensen

这是我的看法:

./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 脚本中,您以前可以不开玩笑,但这在命令行上很方便...(这也是您调试配置的良好开端,无论您使用哪种 IDE...)

您的项目可能没有一组配置选项。但如果确实如此(查看 package.json 中的脚本),这就是您所需要的。

--runInBand – 如前所述,不知道您的配置,但如果您专注于开发/修复单个测试,您宁愿不想与网络工作者打交道......

是的,您可以提供文件的完整、显式路径

或者,您可以使用 -t 不运行该文件中的所有测试,而只运行一个测试(这里:一个名称中带有“显示扩展”的内容)。通过将 .only() 粘贴到该文件中可以实现相同的效果。


您现在可以使用 npx jest blah,而不是在 node_mpdules bin 中查找 jest 二进制文件
P
Peter Mortensen

只是一个小插件,因为如果使用 ./node_modules/.bin/jest -i ... 或仅使用 jest -i ...npm test -- -i ... 似乎存在某种冲突

如果您在全局安装了 jest(与 npm install -g jest 一样),则只需调用 jest 即可,这是一种处理依赖项的不太干净的方式脚本绕道,您可以使用 npx jest -i ... => 这正是 npx 的用途。它使您免于编写 ./node_modules/.bin/....


T
Tingolfin

我花了一段时间才找到这个,所以我想在这里为像我这样使用纱线的人添加它:

yarn test -i "src/components/folderX/folderY/.../Filename.ts" -t "name of test"

所以 -i 之后的文件名和 -t 之后的测试名。


P
Peter Mortensen

现在有一个很好的 Jest plugin,称为 jest-watch-typeahead,它使这个过程变得更加简单。


你能编辑你的答案来解释这个插件是如何解决问题的吗?
M
MartinDuo

对于 Windows 中的 VSCode,我在我的 launch.json 文件中使用这些。注意使用 ${pathSeparator} 来处理 Win 和 Mac 中的差异。在调试下拉列表中选择一个,然后按 F5 运行。

 {
  "name": "Debug Selected Jest Test",
  "type": "node",
  "request": "launch",
  "runtimeArgs": ["--inspect-brk", "${workspaceRoot}/node_modules/jest/bin/jest.js", "--runInBand"],
  "args": ["--", "-i", "${fileDirnameBasename}${pathSeparator}${fileBasename} ", "-t", "${selectedText}"],
  "console": "integratedTerminal",
  "internalConsoleOptions": "neverOpen",
  "port": 9229
},
{
  "name": "Debug Named Jest Test",
  "type": "node",
  "request": "launch",
  "runtimeArgs": ["--inspect-brk", "${workspaceRoot}/node_modules/jest/bin/jest.js", "--runInBand"],
  "args": ["--", "-i", "${fileDirnameBasename}${pathSeparator}${fileBasename} ", "-t", "filename.test.js"],
  "console": "integratedTerminal",
  "internalConsoleOptions": "neverOpen",
  "port": 9229
},

M
Md. Raju Ahmed

在最新版本的 jest 中,您可以通过多种方式运行任何单个测试。

fit('only this test will run', () => {});

it.only('only this test will run',() => {});

m
mubasshir00

运行这个命令行:

   npm run test-jest unit_test/file_name -- -t test_name

我的 Package.json

"test-jest": "jest --verbose=true --force-exit",
"test-jest:watch": "jest --watchAll",

Y
Yehya

检查 Jest CLI 文档后,我发现这是我们在特定文件中运行特定测试的方式。

jest --findRelatedTests path/to/fileA.js path/to/fileB.js -t "test name"

用纱,

yarn test --findRelatedTests path/to/fileA.js path/to/fileB.js -t "test name"

使用 npm,

npm test -- --findRelatedTests path/to/fileA.js path/to/fileB.js -t "test name"

如需参考,请查看Jest Cli Options