Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[NodeJS] Jenkins Unit Testing Express JS app

Pagina: 1
Acties:

  • Storm90
  • Registratie: September 2008
  • Laatst online: 09-09 15:23
Iemand ervaring met unit tests uitvoeren binnen Express JS? De tests schrijven lukt me wel, het probleem zit 'm voornamelijk in hoe ik nu een connectie leg met de app. Op dit moment verwijs ik naar een url, uiteraard is dat geen optie als ik de tests met Jenkins wil uitvoeren. Dan wil ik uiteraard de huidige app testen voordat het live gaat, en niet verwijzen naar een bestaande url.

Een voorbeeld van mijn huidige test script
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
var should    = require('should'),
    assert    = require('assert'),
    request   = require('supertest'),
    express   = require('express');

describe('Routing', function() {

  var app = 'http://someurl.com';

  describe('Account', function() {
    it('should return error trying to save duplicate username', function(done) {
      var profile = {
        username: 'vgheri',
        password: 'test',
        firstName: 'Valerio',
        lastName: 'Gheri'
      };
    // once we have specified the info we want to send to the server via POST verb,
    // we need to actually perform the action on the resource, in this case we want to 
    // POST on /api/profiles and we want to send some info
    // We do this using the request object, requiring supertest!
    request(app)
    .post('/api/profiles')
    .send(profile)
    // end handles the response
    .end(function(err, res) {
          if (err) {
            throw err;
          }
          // this is should.js syntax, very clear
          res.should.have.status(400);
          done();
        });
    });
});


Volgens https://www.npmjs.org/package/supertest lijkt onderstaand voldoende om mijn express app te testen:
JavaScript:
1
2
3
4
var request = require('supertest'), 
    express = require('express');

var app = express();


Maar met bovenstaand krijg ik 404 errors op alle routes die ik wil testen.

Iemand hier ervaring mee? Is er anders een optie om met Jenkins de huidige app eerst te starten en vervolgens de tests alsnog via een localhost url uit te voeren? Ik heb het eerder geprobeerd, maar dan lijkt die verstrikt te raken in een eindeloze loop.

  • Storm90
  • Registratie: September 2008
  • Laatst online: 09-09 15:23
Ik heb het al gevonden! Na lang zoeken kwam ik eindelijk het volgende tegen:

code:
1
2
3
npm install
node app.js & grunt jenkins
pkill node


De apostrophe zorgt ervoor dat eerst de applicatie wordt gestart en vervolgens tegelijkertijd de tests worden uitgevoerd (grunt jenkins is een grunt task die de mocha tests uitvoert, je kunt deze ook vervangen door ```mocha <folder met tests>```. Mijn grunt task bevat overigens diverse taken welke ook een code coverage genereert e.d.). Vervolgens killed die de applicatie als die klaar is met testen.

Mijn fout was voornamelijk dat ik deze 2 taken onder elkaar plaats, waardoor die bij node app.js uiteraard blijft hangen. Nu kan ik binnen de test gewoon verwijzen naar de app url "localhost:5000" bijvoorbeeld. Werkt super.

[ Voor 7% gewijzigd door Storm90 op 31-07-2014 14:37 ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Is het niet handiger om de test geisoleerd te draaien binnen node en dus gewoon je libraries te testen? Dit is niet echt een unit test, namelijk. Niet dat dat opzich een probleem is, maar het is wel goed om bottom-up te denken als je automatisch wilt testen.

Overigens kun je op deze manier geen tests tegelijkertijd draaien, maar dat zal vermoedelijk geen probleem voor je zijn :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Storm90
  • Registratie: September 2008
  • Laatst online: 09-09 15:23
drm schreef op donderdag 31 juli 2014 @ 20:53:
Is het niet handiger om de test geisoleerd te draaien binnen node en dus gewoon je libraries te testen? Dit is niet echt een unit test, namelijk. Niet dat dat opzich een probleem is, maar het is wel goed om bottom-up te denken als je automatisch wilt testen.

Overigens kun je op deze manier geen tests tegelijkertijd draaien, maar dat zal vermoedelijk geen probleem voor je zijn :)
Klopt daar heb je gelijk in. Ik wil de methods ook wel los testen, los van de routes, maar ik weet niet hoe. Ik zou toch op de een of andere manier de express app moeten importen binnen de tests, zodat ik de express app kan testen. Maar steeds wanneer ik de app.js "require" binnen de test, op deze manier:
code:
1
var app = require('../.../app.js');
begin ik errors te ontvangen van express dat die de andere files niet kan vinden welk weer required worden binnen app.js (hetzelfde probleem met express.js e.d.). Snap je wat ik bedoel?

Is hier toevallig een oplossing voor? Ik ben vrij nieuw in express js en steeds wanneer ik google op "unit testing in express js", stuit ik op zulke api testing voorbeelden, dus hoe ik de routes test en niet de individuele functies.

[ Voor 13% gewijzigd door Storm90 op 06-08-2014 11:04 ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Je zal waarschijnlijk moeten zorgen dat je je app verder uitsplitst in los testbare onderdelen. Ik ken express verder niet, maar ik stel me zo voor dat app.js meer een soort front controller is en dat alles wat daarachter ligt de de daadwerkelijke logica bevat die je wilt testen. Als je die dus in losse modules stopt, en die test, dan ben je van die dependencies af.

Maar ik kan je daar niet zo veel over zeggen zonder wat code te zien

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Storm90
  • Registratie: September 2008
  • Laatst online: 09-09 15:23
Ik heb het hier nog even met een programmeur overlegd en we zijn het eens geworden dat ik de huidige module.export inhoud moet vervangen door normale functions. Deze functions roep ik dan weer aan binnen module.export. Om een voorbeeld te geven, nu ziet het er zo uit:
JavaScript:
1
2
3
4
5
module.exports = {
  getUser: function(req, res, next) {
      // nu staat alle logica hier
  }
}


En dat wordt dus dit:
JavaScript:
1
2
3
4
5
6
7
8
9
10
function getUser(){
  // alle logica komt hier
}

module.exports = {
  getUser: function(req, res, next) {
      // roep functie aan
      getUser();
  }
}


Op die manier moeten de functies eenvoudiger te testen zijn.
Pagina: 1