2012-05-24 8 views
7

Wow, che casino. Questo è lo scenario.Jasmine + JSTestDriver + Copertura + RequireJS

  • App JS con backbone.
  • RequireJS per la funzionalità AMD, inizializzati come questo:

    <script data-main="js/main" src="js/require.js" type="text/javascript"></script> 
    

    poi dentro main.js il codice seguente configurazione:

    require.config(
    { 
        paths: 
        { 
         ... : ... 
        } 
    }); 
    

    Ogni Backbone Vista/model/router è un "define (. ..) "module, and" require ("theOneRouter", ...) "è chiamato una volta in main.js.

  • r.js utilizzato come ottimizzatore con Uglify/Closure. Un main.js 'compilato' viene creato in una sottocartella ./release che seleziono dinamicamente nel mio .net framework.

  • Abbiamo impiegato un po 'di tempo per far funzionare il Backbone + Require.JS, ma ora funziona alla grande!

  • Quindi anche uno schiaffo su Jasmine ha richiesto un po 'di lavoro personalizzato, ma ha funzionato bene. Ho dovuto caricare require.js dal mio SpecRunner.html, definire ogni modulo di test come un AMD utilizzando la chiamata define (...) di require, e istanziare & eseguire Jasmine una volta da una chiamata a require's require (...) chiamata una volta nel SpecRunner.html:

    require(
    [ 
    //"test/specs/testSpec1", 
    "test/specs/views" 
    ], 
    function() 
    { 
        jasmine.getEnv().updateInterval = 1000; 
        var reporter = new jasmine.TrivialReporter(); 
        jasmine.getEnv().addReporter(reporter); 
        .... 
        .... 
    }); 
    

    anche questo funziona alla grande. I test caricano & run, nessun problema. Require si prende cura di tutto.

Ora, vorrei che un framework come JSTestDriver fungesse da mio corridore. Ho scelto JSTD per la sua semplicità, capacità di test sui browser remoti, supporto per la copertura del codice, ma sono ancora aperto per altri suggerimenti.

JSTestDriver di per sé funziona bene, l'unico problema che ho è l'esecuzione della combinazione JSTD + Jasmine + ReuireJS insieme. Il problema più grande è, se dico JSTD nel file di configurazione di una Jasmine/Richiede modulo di prova al fine di caricarlo, ottengo il seguente errore:

http://requirejs.org/docs/errors.html#mismatch

Se uso r.js a optmize tutto il mio codice in un main.js, la combinazione funziona, inclusa la copertura, ma la copertura viene raccolta su un unico file gigantesco e difficile da analizzare. Per non parlare ci vuole molto tempo per strumentare un file js di 50k linee di codice ed eseguirlo tramite JSTD.

Ho provato a creare un file js simile a un'apparecchiatura che carica tutti i moduli di codice Jasmine &, ma continuo a tornare all'errore "mancata corrispondenza" sopra riportato, E, se non dico a JSTD su ciascun modulo singolarmente (caricando un dispositivo html/js che esegue il caricamento reale) non verranno strumentati per la copertura del codice.

Qualcuno ha ottenuto questa combinazione specifica per funzionare? forse sto chiedendo troppo ...

risposta

4

La soluzione è esattamente come devadvocate menzionato. Poiché JsTestDriver e Require.js competono per essere il gestore del caricamento di file/dipendenze, JsTestDriver genera un adattamento quando si tenta di farlo al 100% in modo Require.js (con moduli anonimi e definisce). Invece devi nominare i tuoi moduli e usare require ([...], function (...) {... invece di define ([...]. Ho scritto un post che mostra come integrare QUnit, Requirejs, e la copertura del codice con JSTD: js-test-driver+qunit+coverage+requirejs. Io uso QUnit nel mio esempio, ma puoi facilmente sostituire QUnit per Jasmine. Nel tentativo di capirlo ho preso in considerazione l'utilizzo di PhantomJS, ma per la nostra base di utenti è essenziale disporre di un cross-browser testing, IE7, IE8, IE9, ecc., quindi un singolo WebKit non lo taglierebbe.JsTestDriver è molto utile, ma temo che una documentazione scadente allontani gli sviluppatori. Presto prenderò il codice per il mio esempio su GitHub . Spero che questo aiuti.

+0

Grazie per l'input, buon commento. Sì, hai ragione riguardo ai tuoi punti e ho provato a nominare manualmente i miei moduli e utilizzare chiamate richieste anziché define() s, ma non è una soluzione fattibile: anche se automatizzato, richiederebbe un notevole lavoro extra prima di ogni esecuzione di test, che vorrei evitare per eseguire rapidamente test durante lo sviluppo. – Bernardo

+1

Quindi ora ho una versione con patch di jsTestDriver.jar che consente l'esportazione di file tramite espressioni regolari. Consente inoltre di caricare i file JavaScript dalla sezione "serve". La pubblicazione di file di origine JavaScript significa che non verranno eseguiti automaticamente quando le pagine dei browser vengono caricate. Invece, quando il browser esegue require.js, require è in grado di estrarre i file dalla sezione di servizio. In questo modo i moduli possono essere anonimi senza alcun problema. Vedi [Backbone-Testing] (http://pseudobry.com/backbone-testing/) – jdobry

2

non ero in grado di arrivare a questo lavoro e finito per usare PhantomJS per eseguire il mio test di gelsomino. http://phantomjs.org/

+0

ho considerato PhantomJS, ma il punto di JSTD è quello di eseguire test di unità multi-piattaforma, che PhantomJS non supporta essendo un web-kit senza testa. Immagino che ciò porti alla domanda se siano necessari test di unità multipiattaforma: dovrei eseguire i test unitari in un ambiente senza head e concentrarmi solo sull'esecuzione di test di integrazione/accettazione in un ambiente cross-browser di tipo Selenium? – Bernardo

+0

Ho costruito la mia soluzione per eseguire test unitari cross browser. Non automatizzo il processo, ma potresti facilmente espandere la soluzione per farlo. Ecco un link al mio post sul blog -> [link] (http://blakeblackshear.wordpress.com/2011/12/09/a-simple-way-to-run-unit-tests-across-browsers-with -nodejs-socket-io-and-jasmine /) –

+0

Dopo alcune settimane di esperimenti, sono ancora convinto che i test unitari dovrebbero essere eseguiti in un ambiente browser, non senza headless. Per questo motivo ho sperimentato con Selenium e la soluzione SauceLabs ospitata e finora tutto funziona. La mia unica battuta d'arresto è la copertura del codice: JSTD ha uno strumento di copertura e reportistica perfettamente integrato e non riesco a trovare uno strumento relativamente intelligente là fuori per un ambiente di rotazione personalizzato. – Bernardo

2

Avete provato a denominare i moduli in prova e utilizzando richiedono invece di definire nei test?

https://github.com/podefr/jasmine-reqjs-jstd

Edit:

Ho appena rilasciato un toolkit open source che si spera di aiutare gli altri, per quanto mi aiuta. Si tratta di una composizione di molti strumenti open source che ti dà un'app di backbone workingjs funzionante pronta all'uso.

Fornisce comandi singoli da eseguire: server Web di sviluppo, runner di prova per browser singolo di jasmine, runner di test multi browser per jasmine js-test-driver e concatenamento/minificazione per JavaScript e CSS. Produce anche una versione non terminata della tua app per il debug della produzione, precompila i modelli del manubrio e supporta l'internazionalizzazione. Nessuna installazione richiesta. Funziona e basta.

Supporta anche moduli senza nome sotto test.

http://github.com/davidjnelson/agilejs

+0

Sì, ho visto quel progetto e ho avuto successo con esso, ma è troppo ingombrante. In un grande progetto con molti moduli che richiedono molti altri moduli, dovrei avere un sistema in atto per nominare automaticamente tutti i moduli in prova. Grande dolore, imho. Ho trovato una soluzione più pulita con Selenium & Node Coverage ... – Bernardo

+0

Ho risolto questo problema con il mio nuovo toolkit agilejs: http: // github.com/davidjnelson/agilejs – davidjnelson

0

Dai un'occhiata a questo repo (Bredele appolo), si tratta di un ambiente che corre specifiche Jasmine BDD oltre moduli anonimi carichi di require.js e JsTestDriver.

Se si stanno sviluppando moduli non anonimi, si consiglia inoltre di utilizzare la soluzione podefr.

Olivier

Problemi correlati