GWT - การรวม JUnit

GWT ให้การสนับสนุนที่ยอดเยี่ยมสำหรับการทดสอบโค้ดฝั่งไคลเอ็นต์อัตโนมัติโดยใช้กรอบการทดสอบ JUnit ในบทความนี้เราจะสาธิตการรวม GWT และ JUNIT

ดาวน์โหลด Junit archive

เว็บไซต์อย่างเป็นทางการของ JUnit - https://www.junit.org

ดาวน์โหลด Junit-4.10.jar

ระบบปฏิบัติการ ชื่อที่เก็บถาวร
Windows junit4.10.jar
ลินุกซ์ junit4.10.jar
Mac junit4.10.jar

จัดเก็บไฟล์ jar ที่ดาวน์โหลดไว้ในบางตำแหน่งในคอมพิวเตอร์ของคุณ เราเก็บไว้ที่C:/ > JUNIT

ค้นหาโฟลเดอร์การติดตั้ง GWT

ระบบปฏิบัติการ โฟลเดอร์การติดตั้ง GWT
Windows C: \ GWT \ gwt-2.1.0
ลินุกซ์ /usr/local/GWT/gwt-2.1.0
Mac /Library/GWT/gwt-2.1.0

คลาส GWTTestCase

GWT ให้ GWTTestCaseคลาสพื้นฐานที่ให้การรวม JUnit การรันคลาสที่คอมไพล์ซึ่งขยาย GWTTestCase ภายใต้ JUnit เปิดตัวเบราว์เซอร์ HtmlUnit ซึ่งทำหน้าที่เลียนแบบพฤติกรรมแอปพลิเคชันของคุณในระหว่างการดำเนินการทดสอบ

GWTTestCase เป็นคลาสที่ได้รับมาจาก TestCase ของ JUnit และสามารถเรียกใช้โดยใช้ JUnit TestRunner

ใช้ webAppCreator

GWT มีเครื่องมือบรรทัดคำสั่งพิเศษ webAppCreator ซึ่งสามารถสร้างกรณีทดสอบเริ่มต้นสำหรับเรารวมทั้งเป้าหมายมดและการกำหนดค่าการปล่อยคราสสำหรับการทดสอบทั้งในโหมดการพัฒนาและโหมดการผลิต

เปิดพรอมต์คำสั่งแล้วไปที่ C:\ > GWT_WORKSPACE > ที่คุณต้องการสร้างโปรเจ็กต์ใหม่พร้อมการสนับสนุนการทดสอบรันคำสั่งต่อไปนี้

C:\GWT_WORKSPACE>C:\GWT\gwt-2.1.0\webAppCreator 
   -out HelloWorld 
   -junit C:\JUNIT\junit-4.10.jar 
   com.tutorialspoint.HelloWorld

จุดสำคัญ

  • เรากำลังเรียกใช้ยูทิลิตีบรรทัดคำสั่ง webAppCreator
  • HelloWorld เป็นชื่อของโครงการที่จะสร้างขึ้น
  • อ็อพชัน -junit สั่งให้ webAppCreator เพิ่ม junit suppport ในโปรเจ็กต์
  • com.tutorialspoint.HelloWorld คือชื่อของโมดูล

ตรวจสอบผลลัพธ์

Created directory HelloWorld\src
Created directory HelloWorld\war
Created directory HelloWorld\war\WEB-INF
Created directory HelloWorld\war\WEB-INF\lib
Created directory HelloWorld\src\com\tutorialspoint
Created directory HelloWorld\src\com\tutorialspoint\client
Created directory HelloWorld\src\com\tutorialspoint\server
Created directory HelloWorld\src\com\tutorialspoint\shared
Created directory HelloWorld\test\com\tutorialspoint
Created directory HelloWorld\test\com\tutorialspoint\client
Created file HelloWorld\src\com\tutorialspoint\HelloWorld.gwt.xml
Created file HelloWorld\war\HelloWorld.html
Created file HelloWorld\war\HelloWorld.css
Created file HelloWorld\war\WEB-INF\web.xml
Created file HelloWorld\src\com\tutorialspoint\client\HelloWorld.java
Created file 
HelloWorld\src\com\tutorialspoint\client\GreetingService.java
Created file 
HelloWorld\src\com\tutorialspoint\client\GreetingServiceAsync.java
Created file 
HelloWorld\src\com\tutorialspoint\server\GreetingServiceImpl.java
Created file HelloWorld\src\com\tutorialspoint\shared\FieldVerifier.java
Created file HelloWorld\build.xml
Created file HelloWorld\README.txt
Created file HelloWorld\test\com\tutorialspoint\HelloWorldJUnit.gwt.xml
Created file HelloWorld\test\com\tutorialspoint\client\HelloWorldTest.java
Created file HelloWorld\.project
Created file HelloWorld\.classpath
Created file HelloWorld\HelloWorld.launch
Created file HelloWorld\HelloWorldTest-dev.launch
Created file HelloWorld\HelloWorldTest-prod.launch

การทำความเข้าใจคลาสทดสอบ: HelloWorldTest.java

package com.tutorialspoint.client;

import com.tutorialspoint.shared.FieldVerifier;
import com.google.gwt.core.client.GWT;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;

/**
 * GWT JUnit tests must extend GWTTestCase.
 */
public class HelloWorldTest extends GWTTestCase {

   /**
    * must refer to a valid module that sources this class.
    */
   public String getModuleName() {
      return "com.tutorialspoint.HelloWorldJUnit";
   }

   /**
    * tests the FieldVerifier.
    */
   public void testFieldVerifier() {
      assertFalse(FieldVerifier.isValidName(null));
      assertFalse(FieldVerifier.isValidName(""));
      assertFalse(FieldVerifier.isValidName("a"));
      assertFalse(FieldVerifier.isValidName("ab"));
      assertFalse(FieldVerifier.isValidName("abc"));
      assertTrue(FieldVerifier.isValidName("abcd"));
   }

   /**
    * this test will send a request to the server using the greetServer
    *  method in GreetingService and verify the response.
    */
   public void testGreetingService() {
      /* create the service that we will test. */
      GreetingServiceAsync greetingService = 
      GWT.create(GreetingService.class);
      ServiceDefTarget target = (ServiceDefTarget) greetingService;
      target.setServiceEntryPoint(GWT.getModuleBaseURL() 
      + "helloworld/greet");

      /* since RPC calls are asynchronous, we will need to wait 
       for a response after this test method returns. This line 
       tells the test runner to wait up to 10 seconds 
       before timing out. */
      delayTestFinish(10000);

      /* send a request to the server. */
      greetingService.greetServer("GWT User", 
         new AsyncCallback<String>() {
         public void onFailure(Throwable caught) {
            /* The request resulted in an unexpected error. */
            fail("Request failure: " + caught.getMessage());
         }

         public void onSuccess(String result) {
            /* verify that the response is correct. */
            assertTrue(result.startsWith("Hello, GWT User!"));

            /* now that we have received a response, we need to 
             tell the test runner that the test is complete. 
             You must call finishTest() after an asynchronous test 
             finishes successfully, or the test will time out.*/
            finishTest();
         }
      });
   }
}

จุดสำคัญ

ซีเนียร์ บันทึก
1 คลาส HelloWorldTest ถูกสร้างขึ้นในแพ็คเกจ com.tutorialspoint.client ภายใต้ไดเร็กทอรี HelloWorld / test
2 คลาส HelloWorldTest จะมีกรณีทดสอบหน่วยสำหรับ HelloWorld
3 คลาส HelloWorldTest ขยายคลาส GWTTestCase ในแพ็คเกจ com.google.gwt.junit.client
4 คลาส HelloWorldTest มีเมธอดนามธรรม (getModuleName) ที่ต้องส่งคืนชื่อของโมดูล GWT สำหรับ HelloWorld นี่คือ com.tutorialspoint.HelloWorldJUnit
5 คลาส HelloWorldTest ถูกสร้างขึ้นด้วยกรณีทดสอบตัวอย่างสองกรณี testFieldVerifier, testSimple เราได้เพิ่ม testGreetingService
6 วิธีการเหล่านี้ใช้หนึ่งในฟังก์ชัน assert * จำนวนมากที่สืบทอดมาจากคลาส JUnit Assert ซึ่งเป็นบรรพบุรุษของ GWTTestCase
7 ฟังก์ชัน assertTrue (บูลีน) ยืนยันว่าอาร์กิวเมนต์บูลีนที่ส่งผ่านในการประเมินเป็นจริง ไม่เช่นนั้นการทดสอบจะล้มเหลวเมื่อรันใน JUnit

GWT - JUnit Integration Complete Example

ตัวอย่างนี้จะนำคุณผ่านขั้นตอนง่ายๆในการแสดงตัวอย่างของการรวม JUnit ใน GWT

ทำตามขั้นตอนต่อไปนี้เพื่ออัปเดตแอปพลิเคชัน GWT ที่เราสร้างไว้ด้านบน -

ขั้นตอน คำอธิบาย
1 นำเข้าโปรเจ็กต์ด้วยชื่อHelloWorldใน eclipse โดยใช้ตัวช่วยสร้างโปรเจ็กต์ที่มีอยู่ (ไฟล์→นำเข้า→ทั่วไป→โปรเจ็กต์ที่มีอยู่ไปยังพื้นที่ทำงาน)
2 แก้ไขHelloWorld.gwt.xml , HelloWorld.css , HelloWorld.htmlและHelloWorld.javaตามที่อธิบายด้านล่าง เก็บไฟล์ที่เหลือไว้ไม่เปลี่ยนแปลง
3 คอมไพล์และเรียกใช้แอปพลิเคชันเพื่อตรวจสอบผลลัพธ์ของตรรกะที่ใช้งาน

ต่อไปนี้จะเป็นโครงสร้างโครงการในคราส

ต่อไปนี้เป็นเนื้อหาของตัวอธิบายโมดูลที่แก้ไข src/com.tutorialspoint/HelloWorld.gwt.xml.

<?xml version = "1.0" encoding = "UTF-8"?>
<module rename-to = 'helloworld'>
   <!-- Inherit the core Web Toolkit stuff.                        -->
   <inherits name = 'com.google.gwt.user.User'/>

   <!-- Inherit the default GWT style sheet.                       -->
   <inherits name = 'com.google.gwt.user.theme.clean.Clean'/>
   <!-- Inherit the UiBinder module.                               -->
   <inherits name = "com.google.gwt.uibinder.UiBinder"/>
   <!-- Specify the app entry point class.                         -->
   <entry-point class = 'com.tutorialspoint.client.HelloWorld'/>
  
   <!-- Specify the paths for translatable code                    -->
   <source path = 'client'/>
   <source path = 'shared'/>

</module>

ต่อไปนี้เป็นเนื้อหาของไฟล์ Style Sheet ที่แก้ไข war/HelloWorld.css.

body {
   text-align: center;
   font-family: verdana, sans-serif;
}

h1 {
   font-size: 2em;
   font-weight: bold;
   color: #777777;
   margin: 40px 0px 70px;
   text-align: center;
}

ต่อไปนี้เป็นเนื้อหาของไฟล์โฮสต์ HTML ที่แก้ไข war/HelloWorld.html.

<html>
   <head>
      <title>Hello World</title>
      <link rel = "stylesheet" href = "HelloWorld.css"/>
      <script language = "javascript" src = "helloworld/helloworld.nocache.js">
      </script>
   </head>

   <body>
      <h1>JUnit Integration Demonstration</h1>
      <div id = "gwtContainer"></div>
   </body>
</html>

แทนที่เนื้อหาของ HelloWorld.java ใน src/com.tutorialspoint/client แพคเกจดังต่อไปนี้

package com.tutorialspoint.client;

import com.google.gwt.core.client.EntryPoint;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;

import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DecoratorPanel;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

public class HelloWorld implements EntryPoint {
	
   public void onModuleLoad() {
      /*create UI */
      final TextBox txtName = new TextBox(); 
      txtName.setWidth("200");
      txtName.addKeyUpHandler(new KeyUpHandler() {
         @Override
         public void onKeyUp(KeyUpEvent event) {
            if(event.getNativeKeyCode() == KeyCodes.KEY_ENTER){
               Window.alert(getGreeting(txtName.getValue()));
            }				
         }
      });
      Label lblName = new Label("Enter your name: ");

      Button buttonMessage = new Button("Click Me!");

      buttonMessage.addClickHandler(new ClickHandler() {			
         @Override
         public void onClick(ClickEvent event) {
            Window.alert(getGreeting(txtName.getValue()));
         }
      });

      HorizontalPanel hPanel = new HorizontalPanel();	
      hPanel.add(lblName);
      hPanel.add(txtName);
      hPanel.setCellWidth(lblName, "130");

      VerticalPanel vPanel = new VerticalPanel();
      vPanel.setSpacing(10);
      vPanel.add(hPanel);
      vPanel.add(buttonMessage);
      vPanel.setCellHorizontalAlignment(buttonMessage, 
      HasHorizontalAlignment.ALIGN_RIGHT);

      DecoratorPanel panel = new DecoratorPanel();
      panel.add(vPanel);

      // Add widgets to the root panel.
      RootPanel.get("gwtContainer").add(panel);
   }  
   
   public String getGreeting(String name){
      return "Hello "+name+"!";
   }
}

แทนที่เนื้อหาของ HelloWorldTest.java ใน test/com.tutorialspoint/client แพคเกจดังต่อไปนี้

package com.tutorialspoint.client;

import com.tutorialspoint.shared.FieldVerifier;
import com.google.gwt.core.client.GWT;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;

/**
 * GWT JUnit tests must extend GWTTestCase.
 */
public class HelloWorldTest extends GWTTestCase {

   /**
    * must refer to a valid module that sources this class.
    */
   public String getModuleName() {
      return "com.tutorialspoint.HelloWorldJUnit";
   }

   /**
    * tests the FieldVerifier.
    */
   public void testFieldVerifier() {
      assertFalse(FieldVerifier.isValidName(null));
      assertFalse(FieldVerifier.isValidName(""));
      assertFalse(FieldVerifier.isValidName("a"));
      assertFalse(FieldVerifier.isValidName("ab"));
      assertFalse(FieldVerifier.isValidName("abc"));
      assertTrue(FieldVerifier.isValidName("abcd"));
   }

   /**
      * this test will send a request to the server using the greetServer
      *  method in GreetingService and verify the response.
   */
   public void testGreetingService() {
      /* create the service that we will test. */
      GreetingServiceAsync greetingService = 
      GWT.create(GreetingService.class);
      ServiceDefTarget target = (ServiceDefTarget) greetingService;
      target.setServiceEntryPoint(GWT.getModuleBaseURL() 
      + "helloworld/greet");

      /* since RPC calls are asynchronous, we will need to wait 
       for a response after this test method returns. This line 
       tells the test runner to wait up to 10 seconds 
       before timing out. */
      delayTestFinish(10000);

      /* send a request to the server. */
      greetingService.greetServer("GWT User", 
         new AsyncCallback<String>() {
         public void onFailure(Throwable caught) {
            /* The request resulted in an unexpected error. */
            fail("Request failure: " + caught.getMessage());
         }

         public void onSuccess(String result) {
            /* verify that the response is correct. */
            assertTrue(result.startsWith("Hello, GWT User!"));

            /* now that we have received a response, we need to 
             tell the test runner that the test is complete. 
             You must call finishTest() after an asynchronous test 
             finishes successfully, or the test will time out.*/
            finishTest();
         }
      });
	
      /**
         * tests the getGreeting method.
      */
      public void testGetGreeting() {
         HelloWorld helloWorld = new HelloWorld();
         String name = "Robert";
         String expectedGreeting = "Hello "+name+"!";
         assertEquals(expectedGreeting,helloWorld.getGreeting(name));
      }
   }
}

รันกรณีทดสอบใน Eclipse โดยใช้คอนฟิกูเรชันการเรียกใช้ที่สร้างขึ้น

เราจะเรียกใช้การทดสอบหน่วยใน Eclipse โดยใช้การกำหนดค่าการเปิดตัวที่สร้างโดย webAppCreator สำหรับทั้งโหมดการพัฒนาและโหมดการผลิต

เรียกใช้การทดสอบ JUnit ในโหมดการพัฒนา

  • จากแถบเมนู Eclipse เลือก Run → Run Configurations ...
  • ภายใต้ส่วน JUnit เลือก HelloWorldTest-dev
  • ในการบันทึกการเปลี่ยนแปลงอาร์กิวเมนต์ให้กดใช้
  • ในการเรียกใช้การทดสอบให้กดเรียกใช้

หากทุกอย่างเรียบร้อยกับแอปพลิเคชันของคุณสิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

รันการทดสอบ JUnit ในโหมดการผลิต

  • จากแถบเมนู Eclipse เลือก Run → Run Configurations ...
  • ภายใต้ส่วน JUnit เลือก HelloWorldTest-prod
  • ในการบันทึกการเปลี่ยนแปลงอาร์กิวเมนต์ให้กดใช้
  • ในการเรียกใช้การทดสอบให้กดเรียกใช้

หากทุกอย่างเรียบร้อยกับแอปพลิเคชันของคุณสิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -