利用 JUnit 和 IBM Rational Application Developer 測試一個基於資料來源的應用

CloudSpace發表於2008-09-10

在典型的組合模版的企業應用軟體中,單元應該專門提供與資料庫相關的服務。通常情況下,這樣專門的單元會利用定義在 J2EE 應用軟體伺服器上(例如, IBM®WebSphere®Application Server)的資料來源。由於這些單元存在於這個應用軟體伺服器中,所以對它們進行測試有時會比較複雜。一種常用的測試它們的方法是建立使用基於這個資料來源元件的測試應用軟體,然後在這個應用軟體伺服器中部署那個測試軟體。在這樣的情況下,部署測試軟體您可能需要付出相當大的努力。這篇文章描述了一種測試部署在應用軟體伺服器(比如 WebSphere Application Server V6.0.2), 利用 IBM®Rational®Application Developer V7.0 平臺上的 JUnit 。這篇文章中的樣本元件是一個簡單的基於 Java 的™應用軟體,它提供了一個簡單的使用者鑑定服務。這篇文章的目標客戶端主要是對 JUnit 框架已經比較熟悉的開發人員,以及那些已經應用過 Rational Application Developer 知識的人群。

引言

通常情況下,元件化的應用軟體往往會使用那些利用伺服器中的資源以及在這個伺服器環境中執行的元件。例如,一套 Java 類可能會為配置在這個伺服器中的一個常見的 RDBMS (關係資料管理系統)而使用資料來源。這些 Java 物件,因此會在執行時使用這個伺服器環境下的資料來源。

測試使用伺服器資源的元件是有挑戰性的,因為這些元件存在於這個伺服器環境中。您可以用下面的方法之一在這個單元水平測試這樣的元件:

  • 單元測試這個元件是以本地資源為背景的。例如,支援元件使用配置在這個應用軟體伺服器中的 RDBMS 資料來源,測試這個元件可能包括為一個本地 RDBMS 或者任何其它檔案系統對它進行配置。儘管當您只想在不對這個伺服器資源有任何依賴的情況下快速測試套件件時,它會對您有幫助,但是它也有一個弊端,因為它不能真實反映這個元件所在的實時環境。
  • 通過在這個測試套件件上方建立一個包裝應用軟體來對這個元件進行單元測試,並將在這個伺服器中隨著這個元件來部署這個包裝器。然而,這種方法的弊端是,開發一個包裝器測試應用軟體可能會花費相當大的精力。
  • 通過在與這個元件相同的環境中執行這個測試程式碼來進行單元測試。例如,在這個伺服器自身中執行這個測試程式碼,並且這個元件將在這裡執行。

這篇文章描述了最後一種方法。它描述了利用 JUnit 和 Rational Application Developer 平臺,如何測試部署在應用軟體伺服器中的基於資料來源的元件。

必備軟體

由於這篇文章目的的原因,我們假設下面的軟體已經適當地安裝和配置:

  1. WebSphere Application Server V6.0.2 或者更新的版本 (以後 WebSphere 為參考)
  2. IBM®DB2®Enterprise Server V9.0或者更新的版本(以後以 DB2 為參考)
  3. Rational Application Developer V7.0 或者更新的版本
  4. JUnit V3.8.1 或者更新的版本(此後以 JUnit 為參考)

要獲得更多以上軟體的資訊,請看參考資料部分。

應用軟體樣例

為了使這篇文章中的概念聯絡更緊密以及更容易理解,本文使用了下面的樣例應用軟體,它是利用 DB2 來儲存和檢索它的資料的。

假設這個應用軟體鑑定了一個特定的使用者名稱和密碼。同時還假設已經下載了一個使用者名稱和密碼的清單到這個資料庫中,並且當使用者每次試圖登陸到這個應用軟體時,這個應用軟體都會對它進行驗證。

現在,在這種情形下,這個鑑定應用軟體元件將利用這個使用者名稱和密碼輸入,在這個資料庫中進行驗證,然後返回一個適當的關於這個使用者鑑定情況的訊息。這個鑑定元件從而就可能使用這些元件 (如圖1 所示):

  • 一個在這個應用軟體中選取使用者的 User 類
  • 一個將會為這個資料庫和應用軟體提供通訊的 DataSource 類
  • 一個在資料庫中真實驗證特定使用者的 Authenticator 類

圖 1. 鑑定元件樣例類圖表
class diagram with use associations

當您建立一個應用軟體樣例後,您還將建立一個包含應用軟體樣本 JUnit 測試用例的應用軟體客戶端專案。這個客戶端專案將由這個伺服器託管,並在這個測試用例也將在這裡執行。

下面的部分將具體描述如何測試這個樣本元件。

準備應用軟體

當您建立這個帶有鑑定元件和測試應用軟體客戶端的樣本應用軟體之前,先要在這個資料庫中建立必要的資料庫物件,同時還要在 WebSphere 中配置這個資料。

建立必要的資料庫物件和資料

您將建立一個樣本資料庫以及一個包含使用者資料的樣本表格。

  1. 在 DB2 中建立一個叫做 SAMPLEDB 的樣本資料庫。
  2. 利用列表 1中顯示的命令建立一個叫做 SAMPLEUSER 的樣本表格。

列表 1. 建立一個樣本表格
				
CONNECT TO SAMPLEDB;
CREATE TABLE SAMPLEUSER (
  USERNAME VARCHAR (50) NOT NULL, 
  PASSWORD VARCHAR (20) NOT NULL
);
CONNECT RESET;

  1. 在這個樣本表格中新增列表 2中顯示的使用者資料。

列表 2. 建立這個樣本資料
				
CONNECT TO SAMPLEDB;
INSERT INTO SAMPLEUSER (USERNAME, PASSWORD) VALUES ('Mohan','mohan');

在 WebSphere Application Server 中配置 DB2 的資料來源

要用 DB2 在 WebSphere 中為樣本資料庫配置資料來源,請看 WebSphere InfoCenter

要想獲得更多 WebSphere 中關於資料來源的資訊,請看參考資源

測試這個樣本應用軟體

既然這篇文章 已經大概描述了這些步驟,並且定義了您的樣本應用軟體,那麼您現在需要執行這些任務,從而最終測試這個樣本應用軟體:

  1. 建立這個樣本應用軟體
  2. 建立一個測試應用軟體客戶端專案
  3. 為這個應用客戶端專案配置資源
  4. 為這個應用軟體建立 JUnit 測試用例
  5. 為這個應用客戶端專案建立一個執行時配置

建立這個樣本應用軟體

您不需要建立先前所描述的鑑定元件。

  1. 開啟 Rational Application Developer 並建立一個新的 Java專案叫做 SampleDataSourceApp
  2. SampleDataSourceApp專案的原始檔下建立兩個包叫做 com.ibm.datasource.samplecom.ibm.datasource.sample.db
  3. 建立類 User.javaSampleDataSource.java,以及 Authenticator.java,如列表 3至列表 5所示。

列表 3. User.java
				
package com.ibm.datasource.sample;
public class User {
  private String userName; 
  private String password; 
  
  public User() {} 
  public User(String name, String pwd) {
    userName = name;
    password = pwd;
  }
  
  public String getUserName() { return userName; }
  public String getPassword() { return password; }
  public void setUserName(String userName) { this.userName = userName; }
  public void setPassword(String password) { this.password = password; }
}
				


列表 4. Authenticator.java
				
package com.ibm.datasource.sample;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import com.ibm.datasource.sample.db.SampleDataSource;

public class Authenticator {
  public static boolean isAuthentic(User user) {
    boolean authentic = false;
    
    try {
      SampleDataSource sampleDataSource = SampleDataSource.getDataSource();	
      Connection connection = sampleDataSource.getConnection();		
      Statement statement = connection.createStatement();		
      String sql = "SELECT count(*) AS count FROM SAMPLEUSER WHERE username='" 
        + user.getUserName() + "' and password='" + user.getPassword() + "'";		
      ResultSet resultSet = statement.executeQuery(sql);	
      
      if(resultSet != null) {
        if(resultSet.next()) {
          int count = resultSet.getInt("count");
          if(count > 0) { authentic = true; }
        }
      }
    } catch(Exception e) { e.printStackTrace(); }
    return authentic;
  }
}
				


列表 5. SampleDataSource.java
				
package com.ibm.datasource.sample.db;

import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class SampleDataSource {
  public static final String resourceRefName="jdbc/SampleDataSource";
  private static SampleDataSource sampleDataSource = null;	
  private DataSource dataSource = null;	
  
  protected SampleDataSource() {}	
  private void setupDataSource() throws SQLException {
    try {
      InitialContext ctx = new InitialContext();
      dataSource = (DataSource)ctx.lookup(resourceRefName);
    } catch(NamingException e) { e.printStackTrace(); }
  }
  
  public static synchronized SampleDataSource getDataSource() throws SQLException {
    if(sampleDataSource == null) {
      try {
        sampleDataSource = new SampleDataSource();
        sampleDataSource.setupDataSource();
      } catch(SQLException e) { e.printStackTrace(); }
    }
    return sampleDataSource;
  }
  
  public Connection getConnection() throws SQLException	{
    return dataSource.getConnection();
  }
}
				

  1. 這個專案看起來應該如圖 2所示。

    圖 2. SampleDataSourceApp 專案
    SampleDataSourceApp 專案

建立這個應用客戶端專案

在先前的版本中,您建立了您的鑑定元件,其中 Authenticator 類中的 isAuthentic() 方法利用了 User 類的一個例項,並且在資料庫中驗證的這個使用者。

鑑定程式碼現在已經準備好了,因此您將在這個部分中建立這個測試客戶端專案。

  1. 進入New > Project > Application client project
  2. 在 Application 客戶端模組頁面,鍵入如圖 3所示的細節。c

    圖 3. 應用軟體客戶端模組
    應用軟體客戶端模組

  3. 點選 Next
  4. 在 Project Facets 頁面中,保留預設值,如圖 4所示。

    圖 4. Project 元件
    Project 元件

  5. 點選 Next
  6. 清除 Create a default main class 的選項,如圖 5所示。

    圖 5. 應用軟體客戶端模組
    應用軟體客戶端模組

  7. 點選 Finish

為這個應用軟體客戶端專案配置資源

您已經建立了您的樣本應用軟體和一個您將用來測試這個樣本應用軟體的應用客戶端專案。

在這個部分中,您將為這個應用客戶端專案配置必要的資源,這樣它才能包含這個伺服器資源。

  1. 在 Project Explorer 檢視中,開啟 SampleDataSourceAppTest 專案並雙擊這個部署描述符。
  2. 開啟如圖 6所示的參考資料製表。

    圖 6. 應用客戶端模組
    指定 WebSphere 繫結

  3. 點選 Add
  4. 選擇如圖 7所示的 Resource reference

    圖 7. 新增資源引數
    新增資源引數

  5. 點選 Next
  6. 填寫如下的資料(圖 8):
    • Name: SampleDataSource
    • Type:javax.sql.DataSource
    • Authentication:Container
    • Sharing scope:Shareable
    • Description: Sample data source

      圖 8. 資源引數
      資源引數

  7. 點選 Finish
  8. JAAS login information 板塊,選擇 Use default method。此外,給這個鑑定別名一個與您在 WebSphere 中的定義這個資料來源相同的別名(如圖 9所示)。

    圖 9. 設定鑑定條目
    設定鑑定條目

  9. 儲存這個部署描述符。

為這個應用軟體建立 JUnit 測試用例

在這個部分中,我們將為這個樣本應用軟體新增 JUnit 測試用例。

  1. appClientModule檔案下下建立一個 com.ibm.datasource.sample.test 包,如圖 10所示。

    圖 10. 為 JUnit 測試建立一個包
    為 JUnit 測試建立一個包

  2. 右鍵點選這個包並選擇 New > Other > JUnit Test Case。您將看到如 圖 11所示的螢幕。

    圖 11. JUnit 測試用例
    JUnit 測試用例

  3. 在圖 11中顯示的對話方塊底部,這個嚮導要求您通過點選 Click here 連結新增這個 JUnit 函式庫。點選並新增 JUnit 函式庫到這個應用客戶端專案中。
  4. 鍵入 UserAuthenticationTest 作為這個測試用例的 Name
  5. 新增如列表 6所示的程式碼到這個測試類中。

列表 6. UserAuthenticationTest
				
package com.ibm.datasource.sample.test;

import com.ibm.datasource.sample.Authenticator;
import com.ibm.datasource.sample.User;
import junit.framework.TestCase;

public class UserAuthenticationTest extends TestCase {
  public void testAuthenticUser() {
    User user = new User("Mohan","mohan");
    assertTrue(Authenticator.isAuthentic(user));
  }
  
  public void testNonAuthenticUser() {
	// the password for user "Mohan" is not valid
    User user = new User("Mohan","");		
    assertFalse(Authenticator.isAuthentic(user));	
  }
}
				


這個測試類包含兩個測試:一個是鑑定一個無效使用者,另一個是鑑定一個有效的使用者。

  1. SampleDataSourceAppTest 下建立一個 lib 資料夾,並匯出 SampleDataSourceApp 專案作為一個 Java™ archive (JAR) 檔案到這個 lib 檔案中。
  2. 新增以上的 JAR 檔案到這個 SampleDataSourceAppTest 專案的構建路徑中。
  3. 構建這個專案。
  4. 現在您將為這些測試建立一個測試套件。右鍵點選 com.ibm.datasource.sample.test 包並選擇 New > Other > JUnit Test Suite。您將看到如圖 12所示的對話方塊。

    圖 12. JUnit 測試套件
    JUnit 測試套件

  5. 點選 Finish
  6. 這個應用客戶端專案需要一個包含有即將被執行的標準 Java main 方法的強制性的 類。您將新增一個 main 方法到這個 AllTests.java 類中。新增一個 main() 方法到這個 AllTests.java 中,如列表 7所示。

列表 7. AllTests.java
				
package com.ibm.datasource.sample.test;

public class AllTests {
  public static void main(String[] av) {  
    junit.textui.TestRunner.run(UserAuthenticationTest.class);
  }
}
				

  1. 現在,開始配置 AllTests.java 作為這個應用客戶端專案的 main類。再次開啟這個應用客戶端專案的部署描述符。
  2. 在這個 Overview 標籤,編輯 Main Class 從而它就可以指向這個 AllTests.java 類,如圖 13所示。

    圖 13. 配置這個 Main Class
    配置這個 Main Class

  3. 儲存這個部署描述符。

為這個應用客戶端建立執行時配置

在先前的部分,您在 Rational Application Developer中建立了樣本應用軟體和一個測試應用客戶端專案。您還在一個測試用例中建立了兩個 JUnit 測試,並將這個服務資源新增到這個測試應用客戶端專案中。

在這個部分中,您將為執行時配置這個測試應用客戶端專案。通常情況下,在這個任務中,您將新增任何 JAR 檔案,系統二進位制,以及在它執行過程中這個測試應用客戶端所需的其它資源。

  1. 右鍵點選這個應用客戶端專案並選擇 Run As > Run
  2. 自從您建立了這個應用客戶端專案,而且將 WebSphere Application Server V6.0 作為目標,選擇左邊皮膚的 WebSphere v6.0 App Client,如圖 14所示。

    圖 14. 新建執行時配置
    新建執行時配置

  3. 點選螢幕左上方的圖示,建立一個新的配置。
  4. 為這個配置取一個名稱(在這個案例中,SampleDataSource App test) 如圖 15所示。

    圖 15. 建立、管理,以及執行配置
    建立、管理,以及執行配置

  5. 確保 Enterprise application 以及 Application client module 區域指向正確的值。
  6. 同樣,確保 SampleDataSourceApp.jar 包含在這個類路徑中,如圖 16所示。

    圖e 16. 執行時的類路徑
    執行時的類路徑

  7. 此外,在這個配置路徑中新增這個 DB2 驅動器 JARs 。
  8. 點選 Apply,從而儲存這個配置的設定。

在接下來的部分,您將真實地執行這個測試。

執行這個 JUnit 測試用例來測試這個樣本應用軟體

既然您已經完成了這個測試應用客戶端專案的整個配置需求,那麼現在您將執行這個客戶端專案,從而它就可以執行所有的 JUnit 測試。

  1. 通過選擇 Rational Application Developer 工作空間中的 Window > Show View > Other > Server > Servers 來開啟 Servers 檢視。
  2. 右鍵點選 Servers 檢視中的 WebSphere Application Server v6.0 開始執行 WebSphere ,如圖 17所示。

    圖 17. Servers 檢視
    Servers 檢視

  3. 現在 WebSphere 已經開始執行,右鍵點選整個應用客戶端專案,並選擇 Run As > Run
  4. 選擇您在先前部分配置的配置,如圖 18所示。

    圖 18. 選擇執行時配置
    選擇執行時配置

  5. 點選Run,從而執行這個 JUnit tests。
  6. 您應該在這個控制檯可以看到測試結果,如圖 19所示。

    圖 19. 控制檯中的測試結果
    控制檯中的測試結果

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14789789/viewspace-442881/,如需轉載,請註明出處,否則將追究法律責任。

相關文章