有没有更好的方法来终止childProcess然后只是做一个childProcess.kill()

时间:2015-12-22 03:21:11

标签: node.js automation child-process

我有一个node.js服务器,它会在控制台中打印出一些消息,然后启动服务器。

我正在创建一个自动化测试,方法是使用tap来检查console.log中的消息并检查服务器是否已启动,即是否生成了PID。

我尝试了两种不同的方法-child_process.exec和child_process.spawn 1.使用带有回调函数的child_process.exec。    这不起作用,因为服务器长时间运行,甚至不会    去回电话,所以我甚至无法检查任何标准。

然后我使用child_process.exec而不回调,这解决了    第一个问题,我现在可以从stdout获取消息。

第二个问题是测试将因服务器长时间运行而挂起,并且不会自行终止。

 code snippet: 

 var exec = require('child_process').exec;

 tap.test('test server start', function(t) {

    childProcess= exec('node',['server']);
    console.log('[exec] childProcess.pid: ', childProcess.pid);
    t.notEqual(childProcess.pid, undefined);

    childProcess.stdout.on('data', function (data) {
    console.log('[exec] stdout: ', data.toString());
    t.match(data.toString(), "Example app listening at http://:::3000");
    t.end();
    childProcess.kill('SIGTERM');

    });
    childProcess.stderr.on('data', function (data) {

         console.log('[exec] stderr: ', data.toString());
    });

    childProcess.on('close', function (code) {

      if (code!=null)
         console.log('child process exited with code '+ code);
    });

    });
  1. 使用child_process.spawn -code snippet

    var spawn = require('child_process').spawn;
    tap.test('test server start', function(t) {
    
    childProcess= spawn('node',['server']);
    console.log('[spawn] childProcess.pid: ', childProcess.pid);
    t.notEqual(childProcess.pid, undefined);
    
    childProcess.stdout.on('data', function (data) {
    console.log('[spawn] stdout: ', data.toString());
    t.match(data.toString(), "Example app listening at http://:::3000");
    t.end();
    childProcess.kill('SIGTERM');
    
    });
    childProcess.stderr.on('data', function (data) {
    
         console.log('[spawn] stderr: ', data.toString());
    });
    
    childProcess.on('close', function (code) {
    
      if (code!=null)
         console.log('child process exited with code '+ code);
    });
    
    });
    
  2. 在1& 2,测试将因服务器长时间运行而挂起, 我需要使用child_process.kill()来终止测试

    有没有更好的方法来实现这一目标?

    提前感谢任何改进。

1 个答案:

答案 0 :(得分:0)

好吧,我认为你可以用不同的方式检查服务器是否还活着(不会产生新进程)。

例如,您可以启动服务器等待连接:

const net = require('net');
var connections = {};

var server = net.createServer(function(conn) { });
server.listen(3333);

server.on('connection',function(conn) {
 var key = conn.remoteAddress + ':' + conn.remotePort;
 connections[key] = conn;
 conn.on('close',function() {
   delete connections[key];
 });
});

然后,将一些客户端(或仅一个)连接到服务器:

var connected = 0;
for (var i = 0;i < 10;i++) {
  var client = net.connect(3333);
  client.on('connect',function() {
    connected++;
    console.log(connected);
  });
}

因此,如果您能够连接到服务器,那么您的服务器仍然存在。

最后,当你想关闭服务器时,只需创建一个像这样的新函数:

var destroy = function () 
{
  server.close(function() {
    console.log('ok');
  });
  for (var key in connections) {
    connections[key].destroy();
  }
}

在与服务器成功连接10次后调用它。在for循环中:

for (var i = 0; i < 10; i++) {
  var client = net.connect(3333);
  client.on('connect',function() {
    connected++;
    if (connected === 10) {
      destroy();
    }
  });
}

这是一个非常基本的例子,但我认为了解另一种做你想做的事情的方法已经足够了。