我有一个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);
});
});
使用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);
});
});
在1& 2,测试将因服务器长时间运行而挂起, 我需要使用child_process.kill()来终止测试
有没有更好的方法来实现这一目标?
提前感谢任何改进。
答案 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();
}
});
}
这是一个非常基本的例子,但我认为了解另一种做你想做的事情的方法已经足够了。
我