Как отлаживать ошибки с карма-сервера?

Я использую karma вместе с karma-typescript (но это не Angular проект, поэтому я не использую angular-cli).

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

$ karma start karma.conf.js --single-run --jenkins
21 02 2019 09:43:38.104:INFO [compiler.karma-typescript]: Compiling project using Typescript 3.2.4
21 02 2019 09:43:53.795:INFO [compiler.karma-typescript]: Compiled 21 files in 15446 ms.
21 02 2019 09:43:57.633:INFO [bundler.karma-typescript]: Bundled imports for 21 file(s) in 3328 ms.
21 02 2019 09:43:59.695:INFO [karma-server]: Karma v4.0.0 server started at http://0.0.0.0:9876/
21 02 2019 09:43:59.720:INFO [launcher]: Launching browsers ChromeHeadless with concurrency unlimited
21 02 2019 09:43:59.757:INFO [launcher]: Starting browser ChromeHeadless
21 02 2019 09:44:01.220:INFO [HeadlessChrome 72.0.3626 (Windows 10.0.0)]: Connected on socket 16JL3Xy0xm-ri3aBAAAA with id 59122393
HeadlessChrome 72.0.3626 (Windows 10.0.0): Executed 0 of 110 SUCCESS (0 secs / 0 secs)
[1A[2KHeadlessChrome 72.0.3626 (Windows 10.0.0): Executed 1 of 110 SUCCESS (0 secs / 0.061 secs)
...
[1A[2KHeadlessChrome 72.0.3626 (Windows 10.0.0): Executed 110 of 110 SUCCESS (2.695 secs / 2.341 secs)
TOTAL: 110 SUCCESS
21 02 2019 09:44:05.251:ERROR [karma-server]: { Error: read ECONNRESET
    at TCP.onStreamRead (internal/stream_base_commons.js:111:27) errno: 'ECONNRESET', code: 'ECONNRESET', syscall: 'read' }
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command

(The --jenkins флаг используется в моем karma.conf.js прежде всего, чтобы определить, ChromeHeadless используется вместо Chrome -- увидеть ниже).

Я совершенно уверен, что эта ошибка не из моего кода.

Соответствующие пакеты:

    "@types/jasmine": "^3.3.8",
    "@types/jasminewd2": "^2.0.6",
    "awesome-typescript-loader": "^5.2.1",
    "jasmine": "^3.3.1",
    "jasmine-core": "^3.3.0",
    "karma": "^4.0.0",
    "karma-chrome-launcher": "^2.2.0",
    "karma-cli": "^2.0.0",
    "karma-jasmine": "^2.0.1",
    "karma-jasmine-html-reporter": "^1.4.0",
    "karma-junit-reporter": "^1.2.0",
    "karma-typescript": "^4.0.0",
    "ts-loader": "^5.3.3",
    "typescript": "^3.2.4"

Наконец, вот мой karma.conf.js:

module.exports = function(config) {
  const jenkins = config.jenkins;
  config.set({
    basePath: '',
    frameworks: ["jasmine", "karma-typescript"],
    plugins: [
      require('karma-jasmine'),
      require("karma-chrome-launcher"),
      require("karma-typescript"),
      jenkins ? require('karma-junit-reporter') : require('karma-jasmine-html-reporter')
    ],
    client:{
      clearContext: false // leave Jasmine Spec Runner output visible in browser
    },
    files: [
      "src/**/*.ts"
    ],
    preprocessors: {
      "src/**/*.ts": "karma-typescript"
    },
    reporters: [
      'progress', (jenkins ? 'junit' : 'kjhtml'), 'karma-typescript'
    ],
    browsers: [jenkins ? 'ChromeHeadless' : 'Chrome'],
    karmaTypescriptConfig: {
      tsconfig: "./tsconfig.json",
      coverageOptions: {
        exclude: [/mock/, /\.spec\.ts$/, /testing-utils/]
      }
    },
    colors: !jenkins,
    logLevel: config.LOG_INFO,
    autoWatch: !jenkins,
    singleRun: jenkins,
    junitReporter: {
      outputDir: 'karma-results',
      outputFile: 'karma-results.xml'
    }
  });
};

2 ответа

Из связанного ответа я использовал плагин javascript-karma-verbose-reporter, чтобы решить эту проблему.

Настройка, кажется, сильно отличается между разными ответами/комментариями. Для меня, работающего локально (не в Jenkins, Gulp и т. д.), я запускал

      npm install --save-dev karma-verbose-reporter

Установив это, моя текущая версия karma (v4.4.1) распознает, что есть плагин, и мне не нужно было использоватьpluginsраздел .

Затем добавьтеkarma-verbose-reporterкreportersмассив вkarma.conf.js:

      module.exports = function(config) {
  config.set({ 
    // reporters configuration
    reporters: ['verbose']
  });
};

Как это относится к вашему вопросу, так это вывод, который он дает (чего нет в соответствующем ответе). Это часть моего вывода, я использую скриншот, так как цвета очень полезны:

Вы можете видеть, чтоERRORповторяется дважды. Во второй раз он аккуратно привязан к названию теста, в котором возникает ошибка:

      27 02 2023 11:52:08.143:ERROR [HeadlessChrome 110.0.5481 (Linux 0.0.0) | react-input-mask | should show empty value when input switches from uncontrolled to controlled]: 'Warning: A component is changing an uncontrolled input of type %s to be controlled. Input elements should not switch from uncontrolled to controlled (or vice versa). Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://reactjs.org/docs/forms.html#controlled-components%s', 'undefined', '
    in input (created by InputMask)
    in InputMask'

Прошу прощения, что не могу помочь с отладкой ошибок вообще с карма-сервера. Однако, если у кого-то появляется подобное сообщение об ошибке, я могу дать немного дополнительной информации, основанной на моем опыте с этой ошибкой.

Недавно я получил очень похожую ошибку (с кармой 6.3.4 и жасмином 3.9.0):

      04 01 2022 17:37:02.327:ERROR [karma-server]: UncaughtException: Error: read ECONNRESET
    at TCP.onStreamRead (internal/stream_base_commons.js:209:20)
04 01 2022 17:37:02.328:ERROR [karma-server]: Error: read ECONNRESET
    at TCP.onStreamRead (internal/stream_base_commons.js:209:20) {
  errno: -4077,
  code: 'ECONNRESET',
  syscall: 'read'
}

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

      { provide: WEBSOCKET, useFactory: (): typeof WebSocket => WebSocket },

Простое изменение их для использования смоделированного провайдера вместо реального WebSocket, похоже, решило проблему. Что-то вроде:

      { provide: WebSocketService, useClass: WebSocketServiceMock},

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

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

Другие вопросы по тегам