Как программно дождаться, пока процесс запустит конечную точку - PullRequest
1 голос
/ 24 апреля 2019

Я создал небольшое примерное приложение в файле node.js с юнит-тестами и приемочными тестами здесь

И модульные, и приемочные тесты выполняются внутри процесса mocha.Приемочные тесты начинаются с разветвления процесса и запуска сервера по методу before ().Метод after () останавливает процесс и

before((initialized) => {
  console.log('before script');
  serverProcess = child_process.fork('server.js');
  serverProcess.on('close', function (code) {  
  console.log('child process exited with code ' + code);  
});
setTimeout(() => {
  console.log('1s elapsed');
  initialized();
}, 1000);

Код без каких-либо задержек работает на моем локальном gitlab-runner, однако на сервере это не всегда так, поэтому я добавил задержку - подождите некоторое время, покасервер запустится.Опытным путем я обнаружил, что 1 с достаточно, а 5 с - нет.Тем не менее, я хотел бы знать, что я должен сделать, чтобы убедиться, что сервер.

Are there any solutions to run server, execute the tests and shutdown the server that works on Linux, Windows, docker and outside of it?

1 Ответ

1 голос
/ 24 апреля 2019

Существует хорошая справка о способах связи между процессами разветвления .

Идея будет в том, чтобы отправить сообщение от ребенка, говорящее его отцу (я готов!).Тогда папа продолжит работу.

Пример:

before((initialized) => {
  serverProcess = child_process.fork('server.js');

  serverProcess.on('close', function(code) {
    console.log('child process exited with code ' + code);
  });

  serverProcess.on('close', function(code) {
    console.log('child process exited with code ' + code);
  });

  // We add a backup plan. If it takes too long to launch, throw
  const timeout = setTimeout(() => {
    initialized(new Error('tiemout');
  }, 30000);

  // Cait for the child to send a message to us
  serverProcess.on('message', function(str) {
    if (str === 'init done') {
      clearTimeout(timeout);

      // server.js got successfully initialized
      initialized();
    }
  });
});

// To add inside of your server.js listen
if (process.send) {
  process.send("init done");
}
...