Jest: 隐藏通过测试的控制台日志记录并显示失败

创建于 2017-07-28  ·  47评论  ·  资料来源: facebook/jest


您要请求功能还是报告错误

特征

目前的行为是什么?

当您运行jest --watch ,它将显示控制台日志记录(除非您使用--silent )。

如果当前行为是一个错误,请通过https://repl.it/languages/jest或 GitHub 上的最小存储库提供重现步骤和 repl.it 演示,我们可以yarn installyarn test

什么是预期行为?

查看失败测试的控制台日志会非常有帮助,因为那是您最需要它的时候。 为了通过测试,可以隐藏控制台日志。

请提供您确切的 Jest 配置并提及您的 Jest、节点、yarn/npm 版本和操作系统。

$ jest --version && node --version && yarn --version
v20.0.4
v6.10.3
0.27.5

Mac OS X 10.12.5

jest.config.js :

module.exports = {
  collectCoverageFrom: ['src/**/*.{js,jsx}'],
  coveragePathIgnorePatterns: [
    '<rootDir>/node_modules/',
    '<rootDir>/src/core/server/webpack-isomorphic-tools-config.js',
    '<rootDir>/src/locale/',
  ],
  moduleDirectories: [
    'src',
    'node_modules',
  ],
  moduleFileExtensions: [
    'js',
    'json',
    'jsx',
  ],
  moduleNameMapper: {
    // Prevent un-transpiled react-photoswipe code being required.
    '^photoswipe$': '<rootDir>/node_modules/photoswipe',
    // Use the client-side logger by default for tests.
    '^core/logger$': '<rootDir>/src/core/client/logger',
    // Alias tests for tests to be able to import helpers.
    '^tests/(.*)$': '<rootDir>/tests/$1',
    // Replaces the following formats with an empty module.
    '^.+\\.(scss|css|svg|woff|woff2|mp4|webm)$': '<rootDir>/tests/emptyModule',
  },
  setupTestFrameworkScriptFile: '<rootDir>/tests/setup.js',
  testPathIgnorePatterns: [
    '<rootDir>/node_modules/',
    '<rootDir>/(assets|bin|config|coverage|dist|docs|flow|locale|src)/',
  ],
  testMatch: [
    '**/[Tt]est(*).js?(x)',
    '**/__tests__/**/*.js?(x)',
  ],
  transform: {
    '^.+\\.js$': 'babel-jest',
    // This transforms images to be a module that exports the filename.
    // Tests can assert on the filenname.
    '^.+\\.(jpg|jpeg|gif|png)$': '<rootDir>/tests/fileTransformer',
  },
  transformIgnorePatterns: [
    '<rootDir>/node_modules/',
  ],
  verbose: false,
};

最有用的评论

同意,有一个标志来隐藏 PASS 测试的控制台输出并将其留给 FAILED 测试将是一个很好的补充,使测试输出更具可读性

所有47条评论

您可以编写自定义记者。 抄送@aaronabramov

以下是我们测试的示例: https :

您好,感谢您提供的有用信息。

但是,我尝试编写自定义记者并遇到了一些障碍:

  • 没有简单的方法可以从默认报告器(信息性测试输出等)继承所有功能,我宁愿不从头开始重新实现它
  • 当我在我的配置中包含默认报告器时,在 CLI 中传递--silent (使默认报告器隐藏控制台日志记录),并将我的自定义报告器添加到我的配置中,我在我的配置中没有看到简单的方法自定义记者打印日志。 似乎由于--silent选项,报告类不再可以访问缓冲控制台。

因此,我想为 Jest 提出一个补丁,该补丁将引入一个配置值,以仅在测试失败时显示控制台。 你会考虑这样的补丁吗?

这显然需要测试,它需要检查配置值,但这里是一般的想法(这是有效的):

diff --git a/packages/jest-cli/src/reporters/default_reporter.js b/packages/jest-cli/src/reporters/default_reporter.js
index 08d4a9f2..adedbdd3 100644
--- a/packages/jest-cli/src/reporters/default_reporter.js
+++ b/packages/jest-cli/src/reporters/default_reporter.js
@@ -176,7 +176,8 @@ class DefaultReporter extends BaseReporter {
       this.log(getResultHeader(result, config));

       const consoleBuffer = result.console;
-      if (consoleBuffer && consoleBuffer.length) {
+      const testFailed = result.numFailingTests > 0;
+      if (testFailed && consoleBuffer && consoleBuffer.length) {
         this.log(
           '  ' +
             TITLE_BULLET +

我其实很喜欢这个主意,但是我们需要考虑很多事情

我们需要添加一些关于隐藏输出的信息

PASS __tests__/my_test.js (hidden output)

我们也应该在运行几个测试或单个测试时禁用它(我想几乎只为完整的测试运行启用它)

@cpojer你对此有什么想法吗?

我认为这种行为令人困惑,我希望 Jest 在每次测试中输出的内容保持一致,而不管状态如何。

@cpojer对我来说,尝试查找与我失败的测试相关的控制台消息很令人困惑:/如果您可以提出更好的方法来实现这一目标,那么请这样做。

作为妥协,你会接受一个在jest.js中暴露DefaultReporter补丁,以便我可以扩展它吗? 否则,我必须复制和粘贴世界才能在自定义报告器中实现此功能。

这是我的测试输出的样子:

screen shot 2017-11-05 at 16 11 29

由于https://github.com/facebook/flow/issues/4673我无法摆脱警告,幸运的是只有几条日志消息,但是如果我想添加更多日志记录,情况会变得更糟.

我第二次提到@miracle2k ,当您从依赖项中收到大量警告和错误时,查找失败的测试变得更加困难。 最好有一个可以传递的标志,它只会返回失败的测试列表。

同意,有一个标志来隐藏 PASS 测试的控制台输出并将其留给 FAILED 测试将是一个很好的补充,使测试输出更具可读性

我同意。 我目前正在处理一个包含大量测试的项目,并且通过测试的输出使得调试时工作流程更加困难。

同意隐藏 PASS 测试的控制台输出的标志。

PASS __tests__/my_test.js (hidden output)

我们可以重新考虑这个添加吗?

我们现在有一种只运行失败测试的方法,它应该涵盖这个用例。 参见 #4886(在 jest 22 中可用)

我们现在有一种只运行失败测试的方法,它应该涵盖这个用例。

它仅部分涵盖了案例。 例如,如果 100 个测试中有 5 个在具有大量日志记录的套件中失败,则您可以仅重新运行失败的测试以了解控制台输出。 但是,如果您一直隐藏通过测试的日志记录,那么您就不需要重新运行测试。

此外,仅重新运行失败的测试有一个缺点,因为它不会捕获由代码编辑引入的任何测试失败。

如果核心团队不想实现这个功能,有人可以考虑的妥协

@kumar303请发送 PR,维护起来似乎并不复杂:)

@kumar303你最终提交了 PR 吗? 我也想拥有这个。

我仍然打算提交一份,但我一直无法在我的其他工作重点之间找到时间。 如果其他人打败了我,请告诉我,以便我帮助测试!

我的想法是从jest.js导出DefaultReporter以便自定义记者可以扩展它。 我想先把这条线改成更像:

const testFailed = result.numFailingTests > 0;
if (testFailed && consoleBuffer && consoleBuffer.length) {
  // Log console output
}

我相信在那之后它需要更多的调整。

@kumar303如何将您的代码添加到我的笑话配置中?

我也对这个感兴趣。 按照@kumar303的想法,我能够编写一个自定义报告器,它很容易扩展default_reporter (虽然很脆弱,因为我直接从jest-cli/build/reporters/default_reporter导入它),然后转换result.console我认为合适(在这种情况下,我让用户设置最低日志级别)。

它工作正常,除了一件事——运行单个测试时,控制台消息不会被缓冲。 这里提到: https :

因此,在这些场景中,无法从自定义报告器中影响控制台输出。 所以我不认为@thymikee最初建议使用自定义报告器来管理控制台输出普遍有效,除非我们也可以有某种方法来强制 jest 始终缓冲控制台输出。

很高兴以更干净的方式公开我们的默认记者。

介意打开一个关于强制缓冲 console.logs 的单独问题吗? 应该是一致的

拥有像showLogsForFailedTests: true这样的全局配置变量有什么明显的缺点吗? 默认值与 Jest 当前的工作方式没有任何变化, false的值将使阅读测试更加愉快。

这个问题是因为做了什么来修复它而关闭,还是因为 30 多个人想象他们在 Jest 上有问题而他们实际上并没有遇到这个问题?

男孩,我认为这几乎是一种标准方法,只显示失败的日志以开玩笑......这仍然是一个问题吗?

需要这个。 它真的很扰乱。

仅供参考:我们已经在基于 Jest 的默认报告器的自定义报告器中成功实现了@kumar303的想法: https :

  • 没有这个记者: https :
  • 与此记者: https :

@willdurand我试过你的记者。 我不确定我可能做错了什么,因为我所做的只是选择该文件作为报告者。 它所做的只是防止在测试结束时出现这种情况:

Test Suites: 48 passed, 48 total
Tests:       78 passed, 78 total
Snapshots:   73 passed, 73 total

测试期间的所有日志仍然显示。

您是否可能只为一次测试运行它? 看我之前的评论和
相关的错误报告。 无法使用记者捕获日志
当只运行一个测试时,这才是真正的症结所在。

在星期三,2018年8月8日,下午7点08分jazoom [email protected]写道:

@willdurand https://github.com/willdurand我试过你的记者。 我是
不知道我可能做错了什么,因为我所做的只是选择了那个文件
作为记者。 它所做的只是阻止这在结束时显示
测试:

测试套件:48 个通过,总共 48 个
测试:78 次通过,总共 78 次
快照:通过 73 个,总共 73 个

测试期间的所有日志仍然显示。


您收到此消息是因为您订阅了此线程。
直接回复本邮件,在GitHub上查看
https://github.com/facebook/jest/issues/4156#issuecomment-411582223或静音
线程
https://github.com/notifications/unsubscribe-auth/AAi-gO9_uEJPO4xnhkpfGore_hEX81fUks5uO29bgaJpZM4OnBQQ
.

@jamietre我运行它的命令与我用于运行 48 个套件的测试完全相同。

编辑:澄清一下,我运行了两次相同的命令。 与自定义报告器的唯一区别是它最后没有打印此摘要:

Test Suites: 48 passed, 48 total
Tests:       78 passed, 78 total
Snapshots:   73 passed, 73 total

@jazoom如果您的配置中有verbose: true ,则记者将不会产生任何影响。 尝试将其设置为false

@jamietre我同意。 单个测试运行不捕获或显示任何控制台输出(https://github.com/facebook/jest/issues/6441)是一种奇怪的行为。

jest 不通过测试对控制台输出进行分组也无济于事(https://github.com/facebook/jest/issues/2080)。 自定义报告器只能显示套件的输出(即测试文件),而不是特定的失败测试。

@jazoom还要确保在安装或更改报告器后完全重新启动 jest。 这可能并不明显,因为 jest 会在运行时识别其他源文件的更改(但不是报告器)。

@kumar303未设置为详细

“完全重启”是什么意思? 它只是一个运行的脚本。

“完全重启”是什么意思?

我的意思是,如果您处于 jest 的监视模式,则需要退出。

好的。 我不使用手表模式。

啊是的,确实如此。 我没有注意到,但由于某些原因,一旦所有测试套件都运行完毕,Jest 不会在底部输出最终摘要。

我想那是因为我们扩展了DefaultReporter而不是SummaryReporter ,也许..

@willdurand我尝试了您成功隐藏日志的配置。 但是,终端不再被清除(以前的日志)并且所有日志都在其他日志下方堆叠。

注意:通过只导出DefaultReporter类,我回退到默认日志记录但日志堆栈也是如此

我玩弄了来自@kumar303 / @willdurand 的 FingersCrossedReporter
但是,正如其他一些人指出的那样,它不会在测试结束时打印测试摘要。 这是因为(我认为)默认 Jest 设置使用两个报告器 - DefaultReporter 和 SummaryReporter。
现在我无法在我的 jest 配置中直接导入 SummaryReporter,因为它是默认导出的,而且似乎不可导入。 我通过从另一个文件重新导出它来解决它。

//summary-reporter.js
const SummaryReporter = require('@jest/reporters/build/summary_reporter')
  .default;
module.exports = SummaryReporter;
//log-on-fail-reporter.js
Content: https://gist.github.com/GeeWee/71db0d9911b4a087e4b2486386168b05
Same as reporter above, but with updated import paths for the new jest structure

玩笑配置

    "reporters": [
      "<rootDir>/src/test-reporters/log-on-fail-reporter.js",
      "<rootDir>/src/test-reporters/summary-reporter.js"
    ],

编辑:在玩了一会儿之后,我看到如果单个测试失败,这个日志记录了整个描述块。

我们将修复对 jest 25 的默认导出的支持。

你也可以

//summary-reporter.js
const {SummaryReporter} = require('@jest/reporters')
module.exports = SummaryReporter;

我们可能想添加@jest/reporters/SummaryReporter等文件,所以你不需要中间的 js 文件......想为此打开一个单独的功能请求吗?

为什么关闭此功能请求?
似乎很多人认为在开箱即用的笑话中包含此功能是合理的。 至少作为一个配置选项。
你能@kumar303再打开它吗?

你能@kumar303再打开它吗?

呵呵。 不,我没有访问权限。 这是关闭的理由: https :

请重新打开。 我们也需要这个。

为什么这还不可能?

对我来说似乎很简单的功能。 我们的大多数测试每个至少产生一页控制台文本,不得不费力地通过它找到失败的测试是非常烦人的

除了发表评论,我不知道还有其他方法可以表达我对这种行为的支持。 我知道 👍 之类的用处不大,所以这是我觉得我能做的最好的。 感谢所有参与者所做的一切! 我关注了所有的线索,每当人们有周期让人们得到他们想要的东西时,我就很期待这一点,哈哈。

这个功能已经快三年没有实现了,什么时候有这个必要,有点奇怪。

根据我在互联网上找到的片段,我想出了一个全局配置; 见https://stackoverflow.com/questions/58936650/javascript-jest-how-to-show-logs-from-test-case-only-when-test-fails/61909588#61909588

希望这对某人有帮助。

可能想查看https://github.com/AtakamaLLC/capio以进行异步捕获。

请重新打开并将其作为可选配置实施。
如果有现实的机会获得 PR 接受,我会自己做。
在我看来,为这个“小”功能请求编写自定义报告器将是不可持续的维护开销。

虽然这个功能请求既不“干净”也不“一致”,但仍然是很多人非常需要的。

此页面是否有帮助?
0 / 5 - 0 等级