Тестовый асинхронный код (Benchmark.js, Node.js)

Я хотел бы использовать модуль Benchmark.js для тестирования некоторого асинхронного кода, написанного в node.js. В частности, я хочу запустить ~10000 запросов на два сервера (один написан на узле, другой написан на PHP) и отслеживать, сколько времени требуется каждому серверу для выполнения всех запросов.

Я планировал написать простой скрипт узла для запуска этих запросов с использованием Benchmark, но меня немного смущает вопрос о том, как использовать его с асинхронным кодом. Обычно в модулях узлов есть какой-то обратный вызов, который вы вызываете, когда ваш асинхронный код завершен, или Promise возвращается из функции и т. Д. Но с помощью Benchmark из всего, что я читаю в документах, это не кажется обрабатывать асинхронно на всех.

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

Спасибо за любое направление, Нейт

1 ответ

Решение

Это не очень хорошо задокументировано, но вот PoC:

var Benchmark = require('benchmark');
var suite     = new Benchmark.Suite();

suite.add(new Benchmark('foo', {
  // a flag to indicate the benchmark is deferred
  defer : true,

  // benchmark test function
  fn : function(deferred) {
    setTimeout(function() {
      deferred.resolve();
    }, 200);
  }
})).on('complete', function() {
  console.log(this[0].stats);
}).run();

Benchmark.js v2 немного меняет синтаксис:

var Benchmark = require('benchmark');
var suite = new Benchmark.Suite;

suite.add('foo', {
  defer: true,
  fn: function (deferred) {
    setTimeout(function() {
      deferred.resolve();
    }, 200);
  }
}).on('complete', function () {
  console.log(this[0].stats)
}).run()

Я столкнулся с этой же проблемой при тестировании асинхронных функций. Вот пример того, что я в итоге использовал в Code Sand Box. Вот ссылка на тестовые документы, где приводится пример использованияdefer свойство.

А вот код, который я использовал в Node.js для всех, кто приходит и хочет увидеть deffered используется с async/await. Надеюсь, кому-то это пригодится!

const Benchmark = require('benchmark');
const suite = new Benchmark.Suite();
const promiseCount = 10;
const setupArray = Array.from(Array(promiseCount)).map((_, i) => i);

const sleep = (ms = 500) =>
  new Promise(resolve => {
    setTimeout(() => {
      resolve();
    }, ms);
  });

const asyncFunction = async (name, index) => {
  await sleep(100);
  return `${name}_${index}`;
};

suite
  .add("Promise.all", {
    defer: true,
    fn: async function(deferred) {
      const promiseArray = setupArray.map(asyncFunction);
      await Promise.all(promiseArray);
      deferred.resolve();
    }
  })
  .add("For loop", {
    defer: true,
    fn: async function(deferred) {
      const final = [];

      for (let i = 0; i < promiseCount; i++) {
        const data = await asyncFunction(setupArray[i], i);
        final.push(data);
      }
      deferred.resolve();
    }
  })
  .on("cycle", function(event) {
    console.log(String(event.target));
  })
  .on("complete", function() {
    console.log("Fastest is " + this.filter("fastest").map("name"));
  })
  .run({ async: true });
Другие вопросы по тегам