2010-12-28 19 views
6

Mam aplikacji GWT zbudowany w Maven, teraz próbowałem uruchomić prosty test GWT jak poniżej:Jak używać testów maven i jUnit?

public class GwtTestLaughter extends GWTTestCase { 

    /** 
    * Specifies a module to use when running this test case. The returned 
    * module must include the source for this class. 
    * 
    * @see com.google.gwt.junit.client.GWTTestCase#getModuleName() 
    */ 
    @Override 
    public String getModuleName() { 
     return "com.sample.services.joker.laughter.Laughter"; 
    } 

    /** 
    * Add as many tests as you like 
    */ 
    public void testSimple() { 
     assertTrue(true); 
    } 
} 

iw pliku pom.xml, skonfigurowany GWT-maven-plugin i Maven-surefire- wtyczka jak poniżej:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>gwt-maven-plugin</artifactId> 
    <version>2.1.0-1</version> 
    <configuration> 
     <!-- Use the 'war' directory for GWT hosted mode --> 
     <output>${basedir}/war</output> 
     <webXml>${basedir}/war/WEB-INF/web.xml</webXml> 
     <runTarget>index.html</runTarget> 
     <!-- Make sure the GWT compiler uses Xerces --> 
    <extraJvmArgs> 
    -Dgwt.style=DETAILED -Xmx512M -Xss1024k -XX:MaxPermSize=128m -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl -Dlogback.configurationFile=./src/test/resources/logback-test.xml 
    </extraJvmArgs> 
</configuration> 
<executions> 
    <execution> 
    <goals> 
     <goal>compile</goal> 
     <goal>test</goal> 
    </goals> 
    </execution> 
</executions> 

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <configuration> 
     <useFile>false</useFile> 
     <forkMode>once</forkMode> 
     <argLine>-Xmx128m</argLine> 
     <systemPropertyVariable> 
     <property> 
      <name>log4j.configuration</name> 
      <value>log4j.properties</value> 
     </property> 
     </systemPropertyVariables> 
    </configuration> 
    <executions> 
     <execution> 
      <id>unit-test</id> 
      <phase>test</phase> 
      <goals> 
      <goal>test</goal> 
      </goals> 
      <configuration> 
       <skip>false</skip> 
       <includes> 
       <include>**/*Test.java</include> 
       <includes> 
       <excludes> 
       <exclude>**/GwtTest*.java</exclude> 
       </excludes> 
      </configuration> 
     </execution> 
    <execution> 
     <id>integration-test</id> 
     <phase>integration-test</phase> 
     <goals> 
     <goal>test</goal> 
     </goals> 
     <configuration> 
      <skip>true</skip> 
      <includes> 
      <include>**/GwtTest*.java</include> 
      <includes> 
      <excludes> 
      <exclude>**/*Test.java</exclude> 
      </excludes> 
     </configuration> 
    </execution> 
    <executions> 
    </plugin> 

Kiedy wpadłem 'test mvn' w linii poleceń, widzę tylko normalne testy JUnit prowadził (jeden z nazwa pliku test.java), gdy uruchomiłem "test integracji mvn", nadal widzę wszystkie testy, w tym normalny test Junit i test Gwt (te z GwtTest. Nazwa pliku .java).

Pytanie 1:

Jak mogę całkowicie wykluczają prowadzenie normalnego testu Junit czasie do badania integracji? czy to niemożliwe? Ponieważ w domyślnym cyklu życia mafii, faza testowa jest zdefiniowana przed testem integracyjnym, nie ma sposobu na pominięcie fazy testowej w celu przeprowadzenia czystego testu integracji?

Odkąd mieszały cały kod testy pod/src/test folderu/Jawa, kiedy wpadłem „mvn integracji test” i obserwowane dane wyjściowe w oknie wiersza poleceń, widziałem, co następuje:

[INFO] running com.sample.services.joker.laughter.client.GwtTestLaughter 
.. 
[INFO] Validating newly compiled units 
[INFO] [ERROR] Errors in 'file:...src/test/java/com/sample/joker/laughter/client/file1Test.java'.. 
[INFO] [ERROR] Line 42: No source code is available for type...; did you forget to inherit a required module? 
... 

Pytanie 2:

Nie rozumiem tego, test gwt jest bardzo prosty, dlaczego sprawdziłby niepowiązany * Test.java i szukał jego kodu źródłowego. chociaż ostatecznie udało się pomyślnie przejść test, jak mogę się pozbyć tego nieprzyjemnego komunikatu o błędzie?

Może powinienem zapomnieć o gwt-mavin-plugin i trzymać się klasycznych testów Juint?

Odpowiedz

1

mogę pomóc w pytaniu 1. Aby przejść testy trwania:

mvn (goals) -Dmaven.test.skip=true 

To pozwoli zignorować testy JUnit.

Podobnie jak w przypadku pytania 2, klasyczny JUnit może być drogą do zrobienia. Nie jestem zbyt zaznajomiony z GWT, ale czy ma on adnotacje testowe (@ test)? A co jest na linii 42, która jest błąd?

2

Należy dodać pliki src w ścieżce klasy tak:

<plugin> 
<artifactId>maven-surefire-plugin</artifactId> 
<version>2.6</version> 
<configuration> 
    <additionalClasspathElements> 
    <additionalClasspathElement> 
     ${project.build.sourceDirectory} 
    </additionalClasspathElement> 
    <additionalClasspathElement> 
     ${project.build.testSourceDirectory} 
    </additionalClasspathElement> 
    </additionalClasspathElements> 
    <useManifestOnlyJar>false</useManifestOnlyJar> 
    <forkMode>always</forkMode> 
    <systemProperties> 
    <property> 
     <name>gwt.args</name> 
     <value>-out \${webAppDirectory}</value> 
    </property> 
    </systemProperties> 
</configuration> 

Reference

1

Tak na marginesie dla ciebie, w większości nietrywialnych projektów Byłem zaangażowany z, jest ekstremalne uprzedzenie wobec JUnit z dwóch powodów. Po pierwsze, GWTUnit wymaga rozproszenia kontekstu javascript, który jest powolny, boleśnie powolny w porównaniu do testu JUnit.Po drugie, naprawdę nie powinno być zbyt wiele, że piszesz, które wymaga kontekstu JavaScript do testowania w oparciu o strukturę projektu i kodu; przede wszystkim z powodu problemu 1, ale także pamiętaj, że piszesz coś z widokiem GWT w tej chwili, ale naprawdę chcesz, aby to było jak najbardziej agnostyczne dla technologii widoku. W ten sposób, gdy Swing sprawi, że triumfalnie powróci do wybitności, możesz go znacznie łatwiej przeportować. Żartuję, bardziej prawdopodobny scenariusz przeniesie się na Androida lub kto wie, co jeszcze w przyszłości.

Zasadniczo GWTUnit działa bardzo wolno z powodu środowiska, w którym musi się rozpędzić, aw rzeczywistości musi być (IMHO), który rozdziela Twoją logikę biznesową, abyś nie był wiecznie związany z nikim. zobacz technologię renderowania. Moim zdaniem większość logiki, która może zostać oddzielona od czystego interfejsu użytkownika widgetów i paneli, powinna być, niezależnie od tego, czy chodzi o logikę typu sterowania przepływem, logikę walidacji, czy o coś innego niż tylko umieszczanie rzeczy na ekranie i wprowadzanie wartości do i na zewnątrz. z nich. Cała reszta powinna być poza tymi klasami w większym projekcie i brać przedmioty za wkłady, które w żaden sposób nie mają związku z GWT. Jeśli to zrobisz, możesz JUnit ogromną większość aplikacji, która jest śmiesznie szybka, i nie będziesz musiał czekać wiecznie (w dużym projekcie duże pokrycie z GWTUnit zajmie godziny, może dni). Nie będę mówił o tym, jak wielki silny test jednostkowy musi zostać utrzymany w bazie kodu.

Ten rant jest przewidziany przez ostatnie zadanie, które zrobiłem tutaj w mojej obecnej pracy, był zestaw logiki biznesowej, który został zakończony warstwą widoku, która miała (pod koniec rozwijania i budowania pełnego zestaw testów jednostkowych) 178 różnych scenariuszy, które wszyscy musieli wykonać poprawnie. To było coś, co nigdy nie powinno było wiedzieć, że działa w GWT, ale zostało skrócone i zawierało odniesienia do klas technologii przeglądania. W rzeczywistości było to coś, co zostało już napisane dla wcześniejszej wersji oprogramowania i nie zmieniło się zbytnio, ale zawinęło logikę w tę warstwę widoku (która była Swingiem). Nowa ekipa właśnie powtórzyła grzechy wcześniejszego zespołu i dlatego ta część kodu wymagała ręcznego sprawdzenia godzin, co, na pewno, w 100% nie obejmowało scenariuszy, w przeciwieństwie do szybkich kilkunastu testów jednostkowych. który uruchamia je wszystkie.

7

Cześć Rozumiem Twój problem i prawdopodobne rozwiązanie polega na tym GWT-maven-plugin stronie dokumentacja: https://gwt-maven-plugin.github.io/gwt-maven-plugin/user-guide/testing.html

Zgodnie docs plugin:

przez intencję: 'testu' cel jest związany domyślnie do fazy testów integracji, a GWTTestCase nie jest traktowane jako test jednostkowy, ponieważ wymaga uruchomienia całego modułu GWT.

Aby uruchomić testy oparte na Surefire i gwt-maven-plugin (dla zwykłych testów JUnit po stronie serwera z Surefire, a także dla modelu klienta i testów kontrolera z GWT), należy rozróżnić te testy od siebie. Odbywa się to za pomocą konwencji nazewnictwa.

Możesz skonfigurować wtyczkę Surefire (odpowiedzialną za uruchamianie testów podczas budowania maven), aby pominąć GwtTests używając pewnych wzorców nazw.

Prostszym sposobem na rozdzielenie testów klasycznych i GWT jest nazwa lattony GwtTest "Something" .java. Ponieważ pewnie firewall szuka testów o nazwie Something "Test" .Java domyślnie będą ignorowane podczas fazy testowej.

Domyślnie wtyczka gwt-maven używa GwtTest * .java jako wzorca włączenia, aby takie testy nie pasowały do ​​standardowego wzorca Surefire. Korzystanie z tej konwencji nie wymaga zmiany konfiguracji.

Powiązane problemy