2014-01-22 2 views
2

При написании автоматических тестов системы/интеграции обычно для первого шага запускается до того, как все тесты будут «запускать сервер». Поскольку запуск сервера может быть дорогостоящим, желательно сделать это один раз, а не перед каждым отдельным тестом. JUnit has easy functionality for doing this. Есть ли эквивалентный стандартный шаблон в nodeunit? Или это требует ручного проката?Запуск кода установки перед набором тестов в узле узла

ответ

2

Я не думаю, что Nodeunit имеет этот встроенный, но многие люди справляются с такими задачами с Grunt.

http://gruntjs.com/

1

Да, Nodeunit имеет setUp() и tearDown() функции, которые всегда выполняться до и после испытаний. Вы можете использовать setUp(), чтобы запустить сервер так:

var server = require("path/to/server.js"); 

exports.setUp = function(callback) { 
    server.start(8080, function() { 
     callback(); 
    }); 
}; 

// run your tests here, setUp will be called before each of them 

Это предполагает, в server.js у вас есть:

exports.start = function() { 
    // start server here 
} 

tearDown() функция запускается после test.done() называется.

Для примера этого, проверить его в действии здесь: https://github.com/jamesshore/Lessons-Learned-Integration-Testing-Node/blob/master/src/_server_test.js

Документация находится здесь: https://github.com/caolan/nodeunit#groups-setup-and-teardown

+3

Следовало сделать более четкими, но, как в ссылке, что я пытаюсь сделать, это есть набор перед всеми испытаниями, не каждый тест. –

+0

А я вижу. Прошу прощения за путаницу. Как сказал Брэд, тогда Грант - хороший выбор. – tfogo

2

Поскольку ваши наборы тестов с использованием nodeunit только узловые модули, вы можете воспользоваться этим закрытием для глобальной установки/демонтажа (для этого тест только люкс):

var myServer = require('./myservermodule'); 

var testsRun = 0; 
var testsExpected = 3; 

function startTest(test) { 
    test._reallyDone = test.done; 
    test.done = function() { 
     ++testsRun; 
     test._reallyDone(); 
    }; 
} 

module.exports = { 
    'setUp' : function(cb) { 
     if (!myServer.server) myServer.start(cb); 
     else cb(); 
    }, 
    'tearDown' : function(cb) { 
     console.log("Tests run: " + testsRun + "/" + testsExpected); 
     if (testsRun===testsExpected) myServer.stop(cb); 
     else cb(); 
    }, 
    'sometest1' : function(test) { 
     startTest(test); 
     test.expect(1); 
     test.ok(true); 
     test.done(); 
    }, 
    'sometest2' : function(test) { 
     startTest(test); 
     test.expect(1); 
     test.ok(false); 
     test.done(); 
    }, 
    'sometest3' : function(test) { 
     startTest(test); 
     test.expect(1); 
     test.ok(true); 
     test.done(); 
    } 
}; 
0

Есть два способа сделать это:

  1. Все тесты в тестовом файле nodeunit выполняются последовательно и синхронно. Вы можете поместить код установки для этой группы тестов в первый тест, а затем отрыв в последнем тесте.

  2. Если вы хотите сделать это более формально, и если вы не хотите настраивать Grunt для модульного теста, есть также модуль под названием «nodeunit-async», который позволит вам запускать глобальную настройку и разрывы до и после всех ваших испытаний. Вы можете запустить глобальную настройку и разрывы один раз до и после группы тестов.

Вот краткий текст для nodeunit-асинхронном:

Легкая обертка для запуска асинхронных тестов nodeunit. Особенно полезно, когда вы хотите, чтобы общие функции глобальной настройки или разрыва запускались для каждого теста в нескольких файлах, и/или функции установки или разблокировки прибора выполнялись один раз до и после всех тестов.

Предназначен для модульных испытаний, написанных с использованием методов автоматического и водопада async.

https://github.com/Zugwalt/nodeunit-async

Смежные вопросы