2010-12-28 40 views
6

Tôi có một ứng dụng gwt được xây dựng trong Maven, bây giờ tôi đã cố gắng để chạy một thử nghiệm GWT đơn giản như dưới đây:Làm cách nào để sử dụng thử nghiệm maven và jUnit cùng nhau?

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); 
    } 
} 

và trong file pom.xml, cấu hình gwt-maven-plugin và maven-surefire- Plugin như dưới đây:

<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> 

Khi tôi chạy 'thử mvn' trong dòng lệnh, tôi có thể thấy chỉ kiểm tra Junit bình thường chạy (một với Tên tệp Test.java), khi tôi chạy 'kiểm tra tích hợp mvn', tôi vẫn thấy tất cả các thử nghiệm, bao gồm kiểm tra Junit bình thường và kiểm tra Gwt (những tên có tên tệp GwtTest .java) chạy.

Câu hỏi 1:

Làm thế nào tôi có thể hoàn toàn loại trừ chạy thử nghiệm Junit bình thường trong thời cho thử nghiệm hội nhập? hoặc điều đó là không thể? Bởi vì trong vòng đời maven mặc định, giai đoạn thử nghiệm được xác định là tồn tại trước khi kiểm thử tích hợp, không có cách nào để bỏ qua giai đoạn thử nghiệm để chạy thử nghiệm tích hợp thuần túy?

Vì tôi trộn lẫn tất cả các mã kiểm tra dưới/kiểm tra thư mục src// java, khi tôi chạy 'mvn tích hợp kiểm tra và quan sát đầu ra trong cửa sổ dòng lệnh, tôi thấy như sau:

[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? 
... 

Câu hỏi 2:

Tôi không hiểu điều này, kiểm tra gwt là một cách rất đơn giản, tại sao nó sẽ xác nhận một Test.java không liên quan và tìm kiếm mã nguồn của nó. mặc dù cuối cùng xây dựng thành công với kiểm tra được thông qua, làm thế nào tôi có thể thoát khỏi những thông báo lỗi khó chịu?

Có lẽ tôi nên quên plugin gwt-mavin và gắn bó với các bài kiểm tra Juint cổ điển?

Trả lời

1

tôi có thể giúp với câu hỏi 1. Để bỏ qua các bài kiểm tra chạy:

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

Điều này sẽ làm cho nó bỏ qua các bài kiểm tra JUnit.

Đối với câu hỏi 2, JUnit cổ điển có thể là cách để đi. Tôi không quá quen thuộc với GWT, nhưng nó có chú thích kiểm tra (@test) không? Và những gì trên dòng 42 đó là lỗi?

2

Bạn nên thêm file src vào classpath như thế này:

<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

Chỉ cần một dành cho bạn, ở hầu hết các dự án không tầm thường mà tôi đã từng tham gia với, có thành kiến ​​cực đoan đối với JUnit vì hai lý do. Đầu tiên là GWTUnit đòi hỏi một spin up của bối cảnh javascript mà là chậm, đau đớn chậm, so với một thử nghiệm JUnit.Thứ hai, có thực sự không nên quá nhiều mà bạn đang viết mà đòi hỏi một bối cảnh Javascript để kiểm tra dựa trên thiết kế của bạn và cấu trúc mã; chủ yếu là do vấn đề 1, nhưng cũng nên nhớ rằng bạn đang viết một cái gì đó với một cái nhìn GWT ngay bây giờ, nhưng bạn thực sự muốn rằng đó là bất khả tri của công nghệ xem càng nhiều càng tốt. Bằng cách đó, khi Swing làm cho chiến thắng trở nên nổi bật, bạn có thể dễ dàng chuyển nó hơn. Tôi đang đùa, một kịch bản nhiều khả năng sẽ chuyển sang Android hoặc những người biết điều gì khác trong tương lai. Về cơ bản, GWTUnit chạy rất chậm vì môi trường nó phải quay lên, và trong thực tế, bạn nên (IMHO) tính toán logic nghiệp vụ của bạn để bạn không phải luôn luôn kết hợp với bất kỳ một xem công nghệ kết xuất. Theo ý kiến ​​của tôi, hầu hết logic của bạn có thể tách ra khỏi thế giới UI thuần túy của các widget và bảng điều khiển, cho dù đó là logic kiểu luồng kiểm soát, logic xác thực hay bất cứ thứ gì khác ngoài việc đặt mọi thứ lên màn hình và nhận các giá trị vào và ra của họ. Mọi thứ khác nên ra khỏi các lớp đó trong một dự án lớn hơn, và lấy các đối tượng làm đầu vào không có liên kết với GWT theo bất kỳ cách nào. Nếu bạn làm điều đó bạn có thể JUnit phần lớn các ứng dụng của bạn, đó là ridiculously nhanh, và bạn sẽ không phải chờ đợi mãi mãi (trong một dự án lớn bao phủ nặng với GWTUnit sẽ mất giờ, có thể ngày). Tôi sẽ không nói về việc một đơn vị mạnh mẽ được kiểm tra bao gồm codebase được bảo trì như thế nào.

Khoản rant này được xác định bởi tác vụ cuối cùng tôi đã làm ở công việc hiện tại của tôi, có một tập hợp logic nghiệp vụ đã được dán lên lớp xem có (ở cuối thư giãn và xây dựng đầy đủ bộ thử nghiệm đơn vị) 178 kịch bản khác nhau mà tất cả đều phải thực thi đúng cách. Đây là cái gì đó không bao giờ nên biết rằng nó đã được chạy trong GWT, nhưng nó đã được cắt ngắn và được riddled với tài liệu tham khảo cho các lớp học công nghệ xem. Trong thực tế, đây là một cái gì đó đã được viết cho một phiên bản trước đó của phần mềm và đã không thay đổi nhiều, nhưng họ bọc logic lên trong lớp xem đó (đó là Swing). Nhóm mới vừa lặp lại các tội lỗi của nhóm trước đó, và vì phần mã này yêu cầu giờ kiểm tra bằng tay, tôi chắc chắn không bao gồm 100% các kịch bản, trái với một bài kiểm tra đơn vị nhanh thứ hai chạy tất cả.

7

Hi Tôi hiểu vấn đề của bạn và các giải pháp có thể xảy ra nằm trên trang tài liệu gwt-maven-plugin này: https://gwt-maven-plugin.github.io/gwt-maven-plugin/user-guide/testing.html

Theo các tài liệu plugin:

By ý: Mục tiêu 'test' là ràng buộc theo mặc định cho giai đoạn thử nghiệm tích hợp và GWTTestCase không được coi là kiểm thử đơn vị vì chúng yêu cầu toàn bộ Mô đun GWT chạy.

Để chạy cả kiểm tra dựa trên Surefire và gwt-maven-plugin (đối với các kiểm tra JUnit phía máy chủ thông thường với Surefire và đối với mô hình máy khách và kiểm tra bộ điều khiển với GWT), bạn cần phải phân biệt các thử nghiệm này với nhau. Điều này được thực hiện bằng cách sử dụng quy ước đặt tên.

Bạn có thể định cấu hình plugin Surefire (chịu trách nhiệm chạy thử nghiệm trong khi xây dựng maven) để bỏ qua GwtTests bằng cách sử dụng một số mẫu đặt tên.

Cách đơn giản hơn để tách các bài kiểm tra cổ điển và GWT là đặt tên cho các địa điểm là GwtTest "Something" .java. Khi chắc chắn tìm kiếm các bài kiểm tra được đặt tên là "Kiểm tra" .java theo mặc định, chúng sẽ bị bỏ qua trong giai đoạn thử nghiệm.

Theo mặc định, gwt-maven-plugin sử dụng GwtTest * .java làm mẫu chèn để các kiểm tra như vậy sẽ không khớp với mẫu Surefire chuẩn. Sử dụng quy ước này, bạn không phải thay đổi cấu hình của mình.

Các vấn đề liên quan