2015-03-14 9 views
14

Przygotowałem zestaw testów w mokka za pomocą ZombieJS i Chai. Testy ładują stronę internetową i sprawdzają, czy różne usługi są poprawnie zapisane i wyświetlają się odwiedzającym stronę.Program Mocha uruchamia się programowo i przekazuje wyniki do zmiennej lub funkcji

Dążę do tego, aby testy były przeprowadzane codziennie, a następnie przesyłać wyniki e-mailem do mojego zespołu. Wszystkie testy przebiegają zgodnie z oczekiwaniami, ale blokada, którą uderzyłem, jest następująca.

Jak przekazać wyniki raportowania JSON do innego skryptu node.js, w którym mogę wysłać wyniki e-mailem. Budowanie e-maila i wysyłanie go będzie proste za pomocą nodemailera i podkreślenia szablonów.

Moje obecne myślenie jest dwa podejścia. Uruchom test mocha za pomocą skryptu powłoki i potokuj wyjście JSON do skryptu węzła i przetwórz JSON z argumentu wiersza poleceń. Coś jak ...

Inną alternatywą jest uruchomienie testów z poziomu skryptu węzła i uzyskanie zwróconego wyniku w zmiennej. Używam tutaj informacji do uruchomienia testów w węźle.

https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically

To działa poprawnie, ale gubię się w jaki sposób uzyskać wyniki reporter JSON do zmiennej z poniższym kodzie.

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

Jeśli ktoś ma jakieś wskazówki dotyczące najlepszego sposobu podejścia do tej kwestii lub jeśli zmierzam w zupełnie niewłaściwym kierunku, będę wdzięczny za wszelkie sugestie.

Odpowiedz

32

Można słuchać wydarzeń szparagową jak w https://github.com/mochajs/mocha/blob/master/lib/runner.js#L40 i budować swój własny raport.

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'); 
    }); 
+0

Przepraszam za powolną odpowiedź Riaana. To rozwiązuje dokładnie mój problem. Gratulujemy pierwszej zaakceptowanej odpowiedzi. – dlearious

+0

Kiedy używam tego snipped, dostaję wszystkie informacje. Ale mocha również drukuje wszystko na standardowe wyjście. Czy istnieje sposób, aby powstrzymać to zachowanie i uzyskać tylko dane z testów bez żadnych danych wyjściowych? Dzięki za radę! – manixx

+0

Zasadniczo znalazłem swoją odpowiedź tutaj: https://github.com/mochajs/mocha/issues/138#issuecomment-142608295 – manixx

0

Hmm zwykle ludzie używają bota CI, aby osiągnąć to, co próbujesz zrobić. Jednak w odniesieniu do twojego bezpośredniego pytania o uzyskanie wyniku od reportera JSON, nie wiem, czy istnieje lepszy sposób, aby go osiągnąć, ale oto, co zrobię po przeczytaniu źródła mocha. Musisz utworzyć Suite, biegacz i uzyskać reporter sobie (kopia z 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 
}); 
+0

When Konsola log 'testResults' zostaje niezdefiniowana, więc nie ma wygląda na to, że sugerowane rozwiązanie działa. Byłbym zainteresowany usłyszeniem czegoś więcej na temat wspomnianego CI-Bota. – dlearious

+0

@Tayful sorry sorry, my bad. _reporter to konstruktor, a nie instancja. Zaktualizowałem moją odpowiedź. –

+0

@lyarious dotyczące CI, używamy jenkins gdzie pracuję. Zamiast reportera JSON używamy reportera XML w stylu jUnit. Po każdej kompilacji, Jenkins przeczyta ten raport i prześle nam powiadomienie :) –

0

Sugeruję użyciu reportera mokka jak wyjaśniono tutaj https://github.com/mochajs/mocha/wiki/Third-party-reporters

invoke mokka jak ten

MyReporter = require('./MyReporter'); 
mocha({ reporter: MyReporter })` 

a plik MyReporter.js będzie wyglądać następująco

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); 
    }); 
} 
Powiązane problemy