2012-05-24 17 views
7

Wow, co za bałagan. To jest scenariusz.Jasmine + JSTestDriver + Pokrycie + RequireJS

  • Aplikacja JS sterowana przez szkielet.
  • RequireJS dla funkcjonalności AMD, inicjowane tak:

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

    następnie wewnątrz main.js następujący kod config:

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

    Każdy Backbone View/model/Router jest „define (. ..) "moduł i" wymagają ("theOneRouter", ...) "jest wywoływany raz w main.js.

  • r.js używany jako optymalizator z Uglify/Closure. Jeden "skompilowany" plik main.js jest tworzony w podfolderze ./release, który wybieram dynamicznie w ramach mojej platformy .net.

  • Zajęło sporo czasu, aby uzyskać Backbone + Require.JS do pracy, ale działa świetnie teraz!

  • Potem uderzanie Jasmine w to samo wymagało trochę niestandardowej pracy, ale działało dobrze. Musiałem załadować require.js z mojego pliku SpecRunner.html, zdefiniować każdy moduł testowy jako AMD za pomocą wywołania require (...), a ja sporządzić instancję & uruchomić Jasmine raz z połączenia, aby wywołać żądanie require (...) w SpecRunner.html:

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

    to też działa świetnie. Testy ładują się & uruchom, bez problemów. Require zajmuje się wszystkim.

Teraz chciałbym, aby framework, taki jak JSTestDriver, działał jak mój biegacz. Wybrałem JSTD dla jego prostoty, możliwości testowania na zdalnych przeglądarkach, obsługi zasięgu kodu, ale wciąż jestem otwarty na inne sugestie.

JSTestDriver per se działa dobrze, jedyny problem jaki mam, to połączenie kombinacji JSTD + Jasmine + ReuireJS. Największym problemem jest, jeśli powiem JSTD w pliku konfiguracyjnym około Jasmine/Wymagaj moduł testowy w celu jej obciążenia, pojawia się następujący błąd:

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

Jeśli używam r.js do optymalizowania wszystkich mój kod do jednego main.js, kombinacja działa, w tym Pokrycie, ale zasięg jest gromadzony na jednym gigantycznym pliku i trudny do analizy. Nie wspominając już o tym, że przyswojenie pliku js o długości 50k i uruchomienie go przez JSTD zajmuje bardzo dużo czasu.

Próbowałem utworzyć plik js podobny do urządzenia, który ładuje wszystkie moduły testowe Jasmine &, ale wracam do powyższego błędu "niedopasowania" ORAZ, jeśli nie powiem JSTD o każdym module osobno (ładując urządzenie html/js, które ma rzeczywisty załadunek) nie będą one wyposażone w oprzyrządowanie do pokrycia kodu.

Ktoś otrzymał tę konkretną kombinację do pracy? Może proszę o zbyt wiele ...

Odpowiedz

4

Rozwiązaniem jest dokładnie tak, jak devadvocate wymienione. Ponieważ JsTestDriver i Require.js konkurują o to, aby zarządzać ładowaniem plików/zależności, JsTestDriver rzuca dopasowanie, gdy próbujesz zrobić to w 100% w trybie Require.js (z anonimowymi modułami i definicjami). Zamiast tego musisz nazwać swoje moduły i użyć funkcji wymagającej ([...], funkcji (...) {... zamiast zdefiniować ([...]. Napisałem post, który pokazuje, jak zintegrować QUnit, Requirejs, i kodu z JSTD: js-test-driver+qunit+coverage+requirejs. Używam QUnit w moim przykładzie, ale możesz łatwo zastąpić QUnit dla Jasmine, próbując to zrozumieć rozważałem użycie PhantomJS, ale dla naszej bazy użytkowników ważne jest, abyśmy mieli przeglądarkę testowanie, IE7, IE8, IE9 itd., więc pojedynczy WebKit by tego nie wycinał.JsTestDriver jest bardzo przydatny, ale obawiam się, że zła dokumentacja powoduje, że deweloperzy odejdą, wkrótce dostanę kod do mojego przykładu na GitHubie . Mam nadzieję, że to pomaga.

+0

Dzięki za wejście, dobry komentarz. Tak, masz rację co do swoich punktów i próbowałem ręcznie nazwać moje moduły i użyć wywołań wymagających zamiast funkcji define(), ale nie jest to wykonalne rozwiązanie: nawet jeśli jest zautomatyzowane, wymagałoby to wykonania znacznej dodatkowej pracy przed każdy przebieg testowy, który chciałbym omijać w celu szybkiego uruchomienia testów podczas rozwoju. – Bernardo

+1

Mam teraz poprawioną wersję pliku jsTestDriver.jar, która umożliwia wyeksportowanie plików za pomocą wyrażeń regularnych. Umożliwia także ładowanie plików JavaScript z sekcji "wyświetl". Obsługa plików źródłowych JavaScript oznacza, że ​​nie zostaną automatycznie wykonane po załadowaniu stron przeglądarki. Zamiast tego, gdy przeglądarka wykonuje require.js, require jest w stanie wyciągnąć pliki z sekcji serve. W ten sposób moduły mogą być anonimowe bez żadnego problemu. Zobacz [Testowanie szkieletu] (http://pseudobry.com/backbone-testing/) – jdobry

2

Nie udało mi się uruchomić tego i skończyłem używając PhantomJS, aby uruchomić testy jaśminowe. http://phantomjs.org/

+0

ja uważane PhantomJS, ale punkt JSTD jest uruchamianie testów jednostkowych cross-platform, które PhantomJS nie obsługuje bycia bezgłowy web-kit. Wydaje mi się, że prowadzi to do pytania, czy testy jednostkowe na wielu platformach są konieczne: czy powinienem przeprowadzać testy jednostkowe w środowisku bezgłowym i skupiać się tylko na przeprowadzaniu testów integracji/akceptacji w środowisku podobnym do selenowego w różnych przeglądarkach? – Bernardo

+0

Zbudowałem własne rozwiązanie do uruchamiania testów jednostkowych w przeglądarce. Nie automatyzuję procesu, ale można łatwo rozszerzyć rozwiązanie, aby to zrobić. Oto link do mojego wpisu na blogu -> [link] (http://blakeblackshear.wordpress.com/2011/12/09/a-simple-way-to-run-unit-tests-across-browsers-with -nodejs-socket-io-i-jaśmin /) –

+0

Po kilku tygodniach eksperymentowania nadal jestem przekonany, że testy jednostkowe powinny być uruchamiane w środowisku przeglądarki, a nie bezgłosu. Z tego powodu eksperymentowałem z Selenium i hostowanym rozwiązaniem SauceLabs i jak dotąd wszystko działa. Moja jedyna porażka to zasięg kodu: JSTD ma ładne, płynnie zintegrowane narzędzie do raportowania i raportowania, i nie mogę znaleźć porównywalnie inteligentnego instrumentu dla tamtego niestandardowego środowiska wirującego. – Bernardo

2

Czy próbowałeś nazywać swoje moduły testowe i używać wymagania zamiast definiować w swoich testach?

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

Edit:

Właśnie wydała zestaw narzędzi open source, które, miejmy nadzieję, pomóc innym tak bardzo jak to mi pomaga. Jest to kompozycja wielu narzędzi open source, która daje gotowe działające szkielet aplikacji requirejs po wyjęciu z pudełka.

Udostępnia pojedyncze polecenia do uruchomienia: serwer WWW dev, pojedynczy testowy test jaśminów, jaśminowy sterownik testowy js-test wielu przeglądarek oraz konkatenization/minification dla JavaScript i CSS. Wydaje także niemineralizowaną wersję aplikacji do debugowania produkcji, prekompiluje szablony kierownicy i obsługuje internacjonalizację. Nie wymaga konfiguracji. Po prostu działa.

Obsługuje również moduły bez nazwy z testem.

http://github.com/davidjnelson/agilejs

+0

Yup, widziałem ten projekt i odniosłem z nim sukces, ale jest on zbyt uciążliwy. W dużym projekcie z wieloma modułami wymagającymi wielu innych modułów, musiałbym mieć system, który automatycznie wymieniłby wszystkie moduły testowane. Duży ból, imho. Znalazłem czystsze rozwiązanie z pokryciem Selenium i węzłem ... – Bernardo

+0

Rozwiązałem ten problem za pomocą mojego nowego zestawu narzędzi agilejs: http: // github.com/davidjnelson/agilejs – davidjnelson

0

Sprawdź to repo (Bredele appolo), jest to środowisko, które działa specyfikacje Jasmine BDD nad modułów anonimowych obciążonych require.js i JsTestDriver.

Jeśli pracujesz nad modułami nieanonimowymi, radzę również użyć rozwiązania podefr.

Olivier