Jest: Скрыть журнал консоли для прохождения тестов и показать его при сбоях

Созданный на 28 июл. 2017  ·  47Комментарии  ·  Источник: facebook/jest


Вы хотите запросить функцию или сообщить об ошибке ?

характерная черта

Каково текущее поведение?

Когда вы запустите jest --watch он покажет ведение журнала консоли (если вы не используете --silent ).

Если текущее поведение является ошибкой, пожалуйста, предоставьте шаги для воспроизведения и либо демонстрацию repl.it через https://repl.it/languages/jest, либо минимальный репозиторий на GitHub, в котором мы можем yarn install и yarn 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

Привет, спасибо за полезную информацию.

Однако я попытался написать собственный репортер и наткнулся на несколько препятствий:

  • Нет простого способа унаследовать все функции от репортера по умолчанию (информативный тестовый вывод и т. Д.), И я бы предпочел не реализовывать все это заново с нуля.
  • Когда я включаю репортер по умолчанию в свою конфигурацию, передаю --silent в CLI (чтобы репортер по умолчанию скрыл ведение журнала консоли) и добавлял свой собственный репортер в свою конфигурацию, я не вижу простого способа в моем пользовательский репортер для печати журнала. Похоже, что из-за опции --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 для меня сбивает с толку пытаться найти консольные сообщения, относящиеся к моему неудачному тесту: / Если вы можете предложить более эффективные способы достижения этого, пожалуйста, сделайте это.

В качестве компромисса вы бы приняли патч, который предоставляет DefaultReporter в jest.js, чтобы я мог его расширить? В противном случае мне пришлось бы скопировать и вставить мир, чтобы реализовать эту функцию в настраиваемом репортере.

Вот как выглядит мой тестовый результат:

screen shot 2017-11-05 at 16 11 29

Я не могу избавиться от предупреждений из-за https://github.com/facebook/flow/issues/4673 , и, к счастью, есть только пара сообщений журнала, но если я хочу добавить больше журналов, это станет намного хуже .

Во- вторых,

Согласен, наличие флага, позволяющего скрыть вывод консоли для теста PASS и оставить его для теста FAILED, было бы отличным дополнением, чтобы сделать вывод теста более читаемым.

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

Согласован флаг, скрывающий вывод консоли для тестов PASS.

PASS __tests__/my_test.js (hidden output)

Можем ли мы пересмотреть это дополнение случайно?

Теперь у нас есть способ запускать просто неудачные тесты, которые должны охватывать этот вариант использования. См. # 4886 (доступно в шутке 22)

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

Он лишь частично закрывает корпус. Например, если 5 из 100 тестов терпят неудачу в наборе с большим количеством журналов, вы можете повторно запустить только неудачные тесты, чтобы понять вывод консоли. Однако, если бы вы все время скрывали журнал прохождения тестов, вам не нужно было бы повторно запускать тесты.

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

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

@ kumar303, пожалуйста, отправьте PR, кажется довольно несложным в обслуживании :)

@ kumar303 , вы в конце концов отправили пиар? Я бы тоже хотел это получить.

Я все еще собираюсь подать одну, но мне не удалось найти время между другими приоритетами своей работы. Если кто-то еще опередит меня, дайте мне знать, чтобы я мог помочь проверить это!

Моя идея заключалась в том, чтобы экспортировать DefaultReporter из jest.js, чтобы пользовательский репортер мог его расширить. Я думал начать с изменения этой строки на что-то вроде:

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://github.com/facebook/jest/issues/2080

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

Рад представить наш репортер по умолчанию более чистым способом.

Не могли бы вы поднять отдельный вопрос о принудительной буферизации console.logs? Должен быть последовательным

Есть ли существенный недостаток в наличии такой глобальной переменной конфигурации, как showLogsForFailedTests: true ? Значение по умолчанию ничего не меняет от того, как Jest работает в настоящее время, а значение false сделает чтение тестов намного более приятным.

Эта проблема закрыта, потому что что-то было сделано для ее исправления, или она закрыта, потому что 30+ человек воображают, что у них есть проблема с Jest, которой на самом деле нет?

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

Нужно это. Это действительно срывает.

К вашему сведению: мы успешно реализовали идею @ kumar303 в настраиваемом репортере, основанном на репортере Jest по умолчанию здесь: https://github.com/mozilla/addons-frontend/blob/e1606743d79e779b1902399685f35a90aa6b9ab9/tests/jest-crossed/fingers/ js

@willdurand Я попробовал вашего репортера. Я не уверен, что я мог сделать неправильно, поскольку все, что я сделал, это выбрал этот файл в качестве репортера. Все, что он сделал, это предотвратил показ этого в конце тестов:

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

Все логи во время тестов все еще появлялись.

Возможно, вы запускали его только для одного теста? См. Мой предыдущий комментарий и
связанный отчет об ошибке. Невозможно вести журналы с помощью репортера.
когда выполняется только один тест, это настоящий камень преткновения.

В среду, 8 августа 2018 г., 19: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 не выводит окончательную сводку внизу после того, как все тестовые наборы были запущены.

Я полагаю, это потому, что мы расширяем DefaultReporter а не SummaryReporter , может быть ..

@willdurand Я попробовал вашу конфигурацию, которая успешно скрывает журналы. Однако терминал больше не очищается (предыдущие журналы), и все журналы складываются ниже остальных.

Примечание: просто экспортируя класс DefaultReporter , я возвращаюсь к ведению журнала по умолчанию, но также и стек журналов

Я немного поигрался с FingersCrossedReporter от @ kumar303 / @willdurand
Однако, как отметили некоторые другие, он не печатает сводку теста в конце тестов. Это потому, что (я думаю) настройки Jest по умолчанию используют два репортера - DefaultReporter и SummaryReporter.
Теперь я не могу напрямую импортировать SummaryReporter в свою конфигурацию jest, поскольку он экспортируется по умолчанию и не кажется импортируемым. Я обошел это, повторно экспортировав его из другого файла.

//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

Конфигурация Jest

    "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://github.com/facebook/jest/issues/4156#issuecomment -324638718 Я согласен, что это важная функция. Я удивлен, как разработчики ядра Jest могут жить без этого, но, возможно, они не пишут код с ошибками, поэтому им не нужны журналы.

Пожалуйста, откройте снова. Нам это тоже нужно.

Почему это пока невозможно?

Мне кажется, функциональность очевидна. Большинство наших тестов производят по крайней мере страницу консольного текста каждый, невероятно раздражает необходимость пробираться через него, чтобы найти неудавшиеся тесты.

Я не знаю другого способа заявить о своей поддержке такого поведения, кроме как оставить комментарий. Я знаю, что 👍 и подобные им менее полезны, поэтому я считаю, что это лучшее, что я могу сделать. Спасибо за все от всех участников! Я следил за всеми тредами, и я с нетерпением жду этого, когда у людей есть циклы, чтобы получить людям то, что они хотят, лол.

Странно то, что эта функция не реализовывалась почти три года, когда это необходимо.

Основываясь на фрагментах, которые я нашел в Интернете, я придумал для этого глобальную конфигурацию; см. 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 рейтинги