2015-12-22 220 views
1

我有一個node.js服務器,它將打印出一些消息在控制檯,然後啓動服務器。有沒有更好的方法來終止childProcess然後只是做一個childProcess.kill()

我正在使用tap來檢查console.log中的消息並檢查服務器是否已啓動,即生成了PID,從而創建自動化測試。

我嘗試了2種不同的方法-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片斷

    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

    嗯,我認爲你可以檢查服務器是否以不同的方式存在(不會產生新的進程)。然後

    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(); 
        } 
        }); 
    } 
    

    這是一個非常基本的例子,但我認爲這足以理解另一種方法來做你想做的事情。

    I.

    相關問題