Невозможно записать транспортировочный журнал / журнал производительности в пользовательский репортер Жасмин - PullRequest
0 голосов
/ 13 мая 2019

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

Конфигурация транспортира (упрощенно):

exports.config = {
  specs: ['./e2e/**/*.spec.ts'],
  capabilities: {
    browserName: 'chrome',
    chromeOptions: {
      perfLoggingPrefs: {
        enableNetwork: true,
        enablePage: false,
      }
    },
    loggingPrefs: {
      performance: 'ALL',
      browser: 'ALL'
    },
  },
  onPrepare() {
    jasmine.getEnv().addReporter({
      specDone: result => {
        new ErrorReporter(browser).logNetworkError(result);
      }
    });
  },
};

ErrorReporter:

class ErrorReporter {
  constructor(browser) {
    this.browser = browser;
  }

  logNetworkError(result) {
    if(result.status === 'failed') {
// execution makes it in here
      this.browser.manage().logs().get('performance').then(function(browserLogs) {
// execution DOES NOT make it here
        browserLogs.forEach(function(log) {
          const message = JSON.parse(log.message).message;

          if(message.method === 'Network.responseReceived') {
            const status = message.params.response.status;
            const url = message.params.response.url;

            if(status !== 200 && status !== 304) {
              console.log(`----E2E NETWORK ERROR----`);
              console.log(`STATUS: [${status}]`);
              console.log(`URL: [${url}]`);
              console.log(`RESPONSE: [${log.message}]`);
            }
          }
        });
      });
    }
  }
}

module.exports = ErrorReporter;

Код внутри метода logNetworkError() прекрасно работает при выполнении в блоке afterEach(), но никогда не записывает никаких журналов при выполнении в качестве пользовательского репортера. Я ожидал бы, что это будет работать как репортер жасмина также.

Если это невозможно выполнить как репортер жасмина, есть ли способ получить доступ к результатам выполненного теста в блоке afterEach()? Я не хочу войти в систему при успешном выполнении теста.

1 Ответ

0 голосов
/ 14 мая 2019

Я разобрался с решением. Было 2 основных проблемы. Во-первых, мне нужно было использовать async и ждать внутри функции, которая создавала журнал:

  async logNetworkError(result) {
      if(result.status === 'failed') {

        const logs = await this.browser.manage().logs().get('performance');

        logs.forEach((log) => {
          const message = JSON.parse(log.message).message;

          if(message.method === 'Network.responseReceived') {
            const status = message.params.response.status;
            const url = message.params.response.url;

            if(status !== 200 && status !== 304) {
              console.log(`-----E2E NETWORK ERROR-----`);
              console.log(`TEST NAME: ${result.fullName}`);
              console.log(`STATUS: [${status}]`);
              console.log(`URL: [${url}]`);
              console.log(`RESPONSE: [${log.message}]`);
            }
          }
        });
      }
  }

Вторая часть проблемы заключалась в том, что другой репортер, который сохранял скриншоты, не имел async и await, что мешало другим репортерам завершить работу. Добавление async / await к обоим репортерам решило эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...