2010-07-07 19 views
5

Poszukuję ram, które zapewniają testy jednostkowe dla JS. Później będę musiał zintegrować go z CruiseControl.NET. Mam wiele stron asp przy użyciu JS i muszę zautomatyzować testy dla nich. Na przykład użyłem lokalnego JSUnit (może to być inny framework), co było dla mnie dość łatwe, ale nie mam pojęcia jak go zintegrować z CC.NET. Może możesz mi pokazać, od czego zacząć?Testowanie jednostek JavaScript zintegrowane z CruiseControl.NET

UWAGA: musi być CC.NET, ramy badanej jednostki niewymienione

Odpowiedz

3

Zdaję sobie sprawę, że jest to raczej stare pytanie, ale miałem podobne zainteresowania więc postać chciałbym pisać odpowiedzi niezależnie. Zakładam, że piszesz w stylu OO JavaScript i chcesz przetestować te obiekty.

Typowym rozwiązaniem zalecanym przez ludzi jest uruchamianie JsTestDriver i jest to z pewnością świetne narzędzie; biorąc to pod uwagę, wymaga to zainstalowania JVM na twoim komputerze, jak również na serwerze budowania. Oprócz wymagania JVM, JsTestDriver nadal zależy od uruchomienia jednej lub więcej przeglądarek "Slave". Osobiście uważam, że nie powinno to być problemem, gdy jednostka testuje JavaScript obiekty. Jeśli celem jest testowanie interfejsu użytkownika, to za pomocą narzędzia takiego jak WatiN i moim zdaniem jest to inny rodzaj testu. Przeglądarka powinna wyglądać tak, jakbyś wyśmiewała każdy inny widok, używając JSMock lub JsMockito (co najbardziej lubię).

W tym celu użyłem Windows Script Host, aby uruchomić testy jednostek JavaScript na lata. Ma to kilka zalet:

  1. Nie wymagana przeglądarka (dla mnie to dobra rzecz).
  2. CScript jest już na każdym komputerze z systemem Windows od XP; więc nic do zainstalowania.
  3. Działa w tle i nie wymaga interaktywnego interfejsu użytkownika podczas uruchamiania testów.
  4. Po uruchomieniu w MSTest, NUnit lub xUnit itp. Integracja z CC.NET, Hudson lub TeamCity jest tak prosta, jak uruchomienie testów jednostkowych jako części kompilacji.
  5. Pełna obsługa debugowania po prostu przez uruchomienie testu urządzenia wewnątrz debuggera.

Istnieje kilka wad przedmiotu:

  1. Maszyna działa testy jednostkowe musi mieć zdolność do tarła od nowych procesów (CSCRIPT) faktycznie uruchomić testy (jeszcze być problem).
  2. Wolniej niż w przypadku regularnych testów jednostkowych (nieco ponad 1000/minutę na starszym dwurdzeniowym rdzeniu, jeśli jest uruchamiany osobno - tj. Nie jest połączony w jednym procesie CSCript).

Korzystanie JSTest.NET (podejście użyłem lat, ale po prostu umieszczone w Internecie), możesz skończyć z przyrządu, który może wyglądać podobnie do następującego:

using JSTest; 
using JSTest.ScriptLibraries; 
using Xunit; 

namespace JSTest.Sample 
{ 
    public class EventDispatcherTests 
    { 
    private readonly TestScript _testScript = new TestScript(); 

    public EventDispatcherTests() 
    { 
     //Append File(s) Under Test. 
     _testScript.AppendFile(@"..\..\..\Web\Scripts\eventDispatcher.js"); 

     //Append Mock/Assertion libraries. 
     _testScript.AppendBlock(new JsHamcrestLibrary()); 
     _testScript.AppendBlock(new JsMockitoLibrary()); 

     //Append Common "Setup" Scripts. 
     _testScript.AppendBlock(@"var dispatcher = new EventDispatcher(); 
           var mockHandler = JsMockito.mockFunction(); 
           var mockPredicate = JsMockito.mockFunction(); 
           var fakeEvent = { eventType: 'CommentAdded', data: 'Sample Comment' }; 
           "); 
    } 

    [Fact] 
    public void ProcessEventInvokesAttachedHandler() 
    { 
     ... 
    } 

    [Fact] 
    public void ProcessEventGracefullyHandlesPredicateException() 
    { 
     _testScript.RunTest(@"var mockPredicateAlternate = JsMockito.mockFunction(); 

          JsMockito.when(mockPredicateAlternate)(fakeEvent).thenThrow('MyException'); 

          dispatcher.attachListener(mockHandler, mockPredicateAlternate); 
          dispatcher.processEvent(fakeEvent); 

          JsMockito.verify(mockPredicateAlternate)(fakeEvent); 
          JsMockito.verifyZeroInteractions(mockHandler); 
          "); 
    } 
    } 
} 

Podejście to działa dobrze dla mnie, i jest bardzo prosty w konfiguracji. Zasadniczo jest to jak pisanie regularnych testów jednostkowych, ale z JavaScriptem.

+0

Nie rozumiem - czy trzeba napisać kod C#, aby zawinąć każdy z testów javascript, czy też piszesz testy w języku C#? –

+0

@Johnny Powyższy przykład ilustruje testowanie javascript kodu C#, ale nie jest to preferowany sposób ... czysta integracja z xUnit/nUnit/MSTest można znaleźć na wiki https: // github.com/cbaxter/JSTest.NET/wiki i umożliwia testowanie napisów w JavaScript przy użyciu szelek testowych C#. Istnieją również przykłady znalezione @ https://github.com/cbaxter/JSTest.NET/tree/master/src/Examples –