Как улучшить производительность запуска кукловода - PullRequest
4 голосов
/ 21 октября 2019

Я написал небольшой гусеничный ход с помощью кукловода. Теперь я сталкиваюсь с проблемой, что мои тесты выполняются довольно медленно (> 3 секунды для каждого теста). Я смог отследить его до функции launch Puppeteer и использования Стамбул / Нью-Йорк .

  • Если я запускаю тест только с mocha, тесты завершаются менее чем за 400 мс.
  • Но если я дополнительно использую nyc, продолжительность тестов превысит 3000 мс

Все, что я использую, это

'use strict';
const puppeteer = require('puppeteer');


module.exports = async function startBrowser() {
  const options = {
    args: [
      // '--no-sandbox',
      // '--disable-setuid-sandbox',
      // '--disable-dev-shm-usage',
      // '--disable-accelerated-2d-canvas',
      // '--disable-gpu'
    ],
    headless: false // true
  };

  return await puppeteer.launch(options);
};

Воттест, который я использую:

'use strict';
/* global describe: false, before: false, it: false,
    beforeEach: false, afterEach: false, after: false, window: false, document: false */

const assert = require('assert').strict;
const startBrowser = require('../');
const util = require('util');



describe('Puppeteer', function() {
  let pageManager;

  it('start the browser', async function() {
    this.timeout(10000);

    console.time('startBrowser');
    const browser = await startBrowser();
    console.timeEnd('startBrowser');
    assert(browser);

    console.time('closeBrowser');
    await browser.close();
    console.timeEnd('closeBrowser');
  });

});

Я создал хранилище с этим кодом и протестировал здесь . nyc _mocha ./test/*.test.js работает ~ 3500 мс, mocha ./test/*.test.js занимает всего 130 мс.

То, что я пробовал до сих пор:

  • различные комбинации include / excludenyc flags
  • обновление до последних версий Puppeteer, nyc и mocha
  • удаление аргументов моего Puppeteer
  • поиск проблем, связанных с Puppeteer & Istanbul (без особого успеха)
  • пытаясь headless: true
  • минуя все прокси, см. Этот вопрос кукловода

Что можно сделать, чтобы пройти тесты сохват будет таким же быстрым, как и сами тесты?

Использование:

  • Ubuntu 19.04
  • node.js 10.15.3

Ответы [ 2 ]

3 голосов
/ 28 октября 2019

Я начал отлаживать Puppeteer, и вот мои выводы:

  • Puppeteer неудивительно использует child_process.spawn() для запуска нового браузера
  • nyc использует spawn-wrap для таких дочерних процессов
  • spawn-wrap считывает весь исполняемый файл (./node_modules/puppeteer/.local-chromium/linux-686378/chrome-linux/chrome) в память с fs.readFileSync, что занимает необычно много времени для завершения

spawn-wrap s README дает какое-то объяснение:

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

Лично для меня ответ заключается в том, что я не могу получить такую ​​же производительность при выполнении тестов си без покрытия кода, пока я использую nyc / istanbul.

Я сделал c8 выстрел, и производительность почти такая же, и у меня все еще может быть покрытие кода.

0 голосов
/ 28 октября 2019

enter image description here Пожалуйста, попробуйте это также.

'use strict'
const puppeteer = require('puppeteer')

module.exports = async function startBrowser() {
  const options = {
    args: [
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '--disable-dev-shm-usage',
      '--disable-accelerated-2d-canvas',
      '--no-first-run',
      '--no-zygote',
      '--single-process', // <- this one doesn't works in Windows
      '--disable-gpu'
    ],
    headless: true
  }

  return await puppeteer.launch(options)
}
...