Запустите Mocha программно и передайте результаты в переменную или функцию
Я установил набор тестов в мокко, используя ZombieJS и Chai. В тестах загружается веб-сайт и проверяется правильность бронирования различных услуг и отображается посетителям веб-сайта.
То, что я намереваюсь, это то, что тесты будут выполняться ежедневно, а затем отправлять результаты по электронной почте моей команде. Все тесты выполняются так, как ожидалось, но заблокированный я получил следующее.
Как передать результаты репортажа JSON в другой node.js script, где я могу отправить результаты по электронной почте. Построение электронной почты и отправка ее будет осуществляться прямо с помощью шаблонов nodemailer и underscore.
В моем нынешнем мышлении есть два подхода. Запустите тест мокки с оболочкой script и проведите вывод JSON на node script и обработайте JSON из аргумента командной строки. Что-то вроде...
mocha test/services/homepage.js > node email.js
Другой вариант - запустить тесты из node script и получить возвращаемый результат в переменной. Я использовал информацию здесь для запуска тестов в node.
https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically
Это работает правильно, но я теряюсь с тем, как получить результаты репортера JSON в переменной из приведенного ниже кода.
var Mocha = require('mocha'),
Suite = Mocha.Suite,
Runner = Mocha.Runner,
Test = Mocha.Test;
// First, you need to instantiate a Mocha instance
var mocha = new Mocha({
reporter: 'json'
});
var suite = new Suite('JSON suite', 'root');
var runner = new Runner(suite);
var mochaReporter = new mocha._reporter(runner);
mocha.addFile(
'/Users/dominic/Git/testing-rig/test/services/homepage.js'
);
runner.run(function(failures) {
// the json reporter gets a testResults JSON object on end
var testResults = mochaReporter.testResults;
console.log(testResults);
// send your email here
});
Если у кого-то есть рекомендации относительно наилучшего способа приблизиться к этому, или если я пойду в совершенно неправильном направлении, я буду благодарен за любые предложения.
Ответы
Ответ 1
Вы можете прослушивать события runner, как в https://github.com/mochajs/mocha/blob/master/lib/runner.js#L40, и создавать свой собственный отчет.
var Mocha = require('mocha');
var mocha = new Mocha({});
mocha.addFile('/Users/dominic/Git/testing-rig/test/services/homepage.js')
mocha.run()
.on('test', function(test) {
console.log('Test started: '+test.title);
})
.on('test end', function(test) {
console.log('Test done: '+test.title);
})
.on('pass', function(test) {
console.log('Test passed');
console.log(test);
})
.on('fail', function(test, err) {
console.log('Test fail');
console.log(test);
console.log(err);
})
.on('end', function() {
console.log('All done');
});
Ответ 2
Обычно люди используют CI-бот для достижения того, что вы пытаетесь сделать. Однако в отношении вашего прямого вопроса о получении результата от репортера JSON я не знаю, есть ли лучший способ его достижения, но вот что я сделал бы после прочтения источника мокки. Вам нужно будет создать Suite, Runner и получить репортера самостоятельно (копия из https://github.com/mochajs/mocha/blob/master/test%2Freporters%2Fjson.js):
var mocha = new Mocha({
reporter: 'json'
});
var suite = new Suite('JSON suite', 'root');
var runner = new Runner(suite);
var mochaReporter = new mocha._reporter(runner);
runner.run(function(failures) {
// the json reporter gets a testResults JSON object on end
var testResults = mochaReporter.testResults;
// send your email here
});
Ответ 3
Я предлагаю использовать репортера мокко, как объяснено здесь
https://github.com/mochajs/mocha/wiki/Third-party-reporters
вызывать мокку вроде этого
MyReporter = require('./MyReporter');
mocha({ reporter: MyReporter })`
и файл MyReporter.js
будет выглядеть следующим образом
var mocha = require('mocha');
module.exports = MyReporter;
function MyReporter(runner) {
mocha.reporters.Base.call(this, runner);
var passes = 0;
var failures = 0;
runner.on('pass', function(test){
passes++;
console.log('pass: %s', test.fullTitle());
});
runner.on('fail', function(test, err){
failures++;
console.log('fail: %s -- error: %s', test.fullTitle(), err.message);
});
runner.on('end', function(){
console.log('end: %d/%d', passes, passes + failures);
process.exit(failures);
});
}