2008年3月13日 星期四

[Eclipse Plug-in] CodeCover : An open-source glass box testing tool

Introduction

對於測試人員來說,也許 JUnit[3] 就已經夠用了,但畢竟對於非測試人員來說,JUnit 無法滿足他們的要求,圖形化、數據化的報告是必要的。一個 open-source 的工具 CodeCover[1] 就是一項不錯的支援工具。他不僅可以像一般的 standalone application 來使用,對於 eclipse[2] IDE 也有支援的 plug-in。

本文將以安裝、使用以及產生測試報告的架構來說明 CodeCover 工具。

Install

若您是想要使用 standalone 的版本,請由下列網址下載:

http://downloads.sourceforge.net/codecover/codecover-batch-1.0.tar.bz2

若您是想要使用 eclipse[2] plug-in的版本,請遵循以下的安裝步驟:

1. 啟動您的 Eclipse[2]

2. 從功能列中選擇 [Help] -> [Software Updates] -> [Find and Install]

clip_image002

圖一:安裝 eclipse plug-in

3. 在開啟的新視窗中選擇 [Search for new features to install] 並且按下確定

clip_image005

圖二:搜尋新的plug-in

4. 接著在視窗的右邊按下 [New Remote Site]

clip_image008

圖三:新增 Remote Site

5. 在新的 New Remote Site 視窗中填入以下資訊:

               Name: CodeCover Update Site

               URL:  http://update.codecover.org/

6. 新增了新的 Remote Site 之後,原先的 Install 視窗會自動將您剛才新增的 Remote Site 勾選好,接著就是按下 [Finish]

7. 接下來的視窗會出現目前有哪些更新或是新的 plug-in 可供您安裝,請勾選 CodeCover[1] ,並按下 [Next]

8. 接下來的安裝 Eclipse[2] 也許會問您是否要安裝此元件,請您就選擇 [Install All] 來安裝全部的 plug-in

How to

1. 首先要請您先安裝 statement coverage plug-in,請參考 Install Section

2. 對於該專案要使要 statement coverage plug-in ,請記得對該專案開啟 statement coverage plug-in

對該專案按下右鍵,選擇 properties

clip_image010

圖四:開啟專案的 Properties 視窗

開啟視窗後,選擇 CodeCover[1],在右邊會出現設定,請將 Enable CodeCover 勾起,並且至少選擇一項需要用到的功能

clip_image012

圖五:對該專案開啟 CodeCover 功能

3. 再來就是要開啟對哪些 class 需要作 statement coverage,並對該package (如此會對所有的 package 底下的所有 sub-packages 都執行相同的動作)按下右鍵,將Use For Coverage Measurement 打勾

clip_image015

圖六:勾選欲使用 CodeCover 的package

4. 接著就是對某個 test code 作執行的動作,例如使用testcode.basic_data.Basic_dataTestSuit ,開啟該檔案後,在功能列表中按下 run按鈕右邊的下拉式選單

clip_image018

圖七:開啟執行的功能

接著選擇 Run As -> CodeCover Measurement For JUnit。

clip_image019

圖八:對測試檔執行 CodeCover Measurement For JUnit

5. 在等待測試後會出現 JUnit[3] 的測試視窗,告知是否有測試成功,綠色的 bar就是代表成功,而紅色的bar 就是表示測試中有出現錯誤或是與測試的期望值不符的情況,此時您就可以在錯誤的回報視窗中了解錯誤的來源。

clip_image021

圖九:JUnit 測試結果視窗

6. 接著就是開啟 CodeCover[1] 的報告視窗並將剛剛的測試結果勾起,接著就可以到 Coverage 視窗中觀看測試的百分比。

Coverage 視窗開啟方式:[window] -> [show view] -> [other...] -> [CodeCover]之下選擇 [Coverage] 就可以開啟。

clip_image023

圖十:選擇 CodeCover 測試結果報告

您可以透過觀看所有 class 來方便觀察,或是您希望使用哪種方式觀看,在coverage 視窗右上角的按鈕可以選擇。

clip_image026

圖十一:觀看 CodeCover 的測試結果

Create a report

1. 經由 Eclipse[2] 來產生 CodeCover[1] 測試過後的測試報告,請您先選擇功能列中的 [File] -> [Export]

clip_image028

圖十二:產生測試報告的匯出步驟

2. 在 Export 視窗中,請您選擇 [CodeCover] 階層之下的 [Coverage Result Export] 並按下 [Next]

clip_image031

圖十三:選擇 Coverage Result Export

3. 在 [Export Wizard] 視窗中選擇您剛才所測試過的測試結果,在下方的 [Export Type and Destination] 中的 [Type] 請選擇 [Report],並且選擇您想要匯出的目的地的檔案(預設的檔案格式為 *.xml),並按下 [Next]

clip_image033

圖十四:選擇欲匯出的測試結果、測試報告的形式以及測試報告的目的地

4. 在下一個視窗畫面中,您必須選擇您的 [Report Template] (請您先下載 CodeCover 的 standalone 版本,並且在解壓縮後的資料夾內您會有 /report-templates/,若您想要 export 為 HTML 樣式,請選擇 HTML_Report_Hierarchic.xml),按下 [Next] 之後就會開始產生結果報告

clip_image035

圖十五:選擇測試報告的 Report Template

5. 在產生完結果報告後,請您到您方才指定的匯出位置觀看報告結果。產生的結果報告會以資料夾的方式出現,請您選擇資料夾中任一個index.html,並且以瀏覽器開啟該檔案,報告會以階層式的排列來產生報告。

clip_image037

圖十六:測試報告的HTML形式範例

Reference

[1] CodeCover 官方網站 http://codecover.org/index.html

[2] Eclipse IDE 官方網站 http://www.eclipse.org/

[3] JUnit 官方網站 http://www.junit.org/

2008年3月12日 星期三

[iText] iText : A free java-PDF library

Introduction

iText 是一個可以讓Java program 產生 PDF 檔案的 library。其安裝的方式如下列步驟:

1) 經由 iText 官方網站[1]下載此 library,如下圖一

請選擇左邊的 [Download iText](圖一藍圈處) -> [Compiled Code]

clip_image004

圖一 官方下載的網頁

2) 下載的 iText-2.0.8.jar (後面的版本編號可能有所不同),若是一般的 Java Application 要使用,請設定 classpath 位置;若是需要在 Web Server 上面的 Web Application 使用,請放置該 Web Application 的 WEB-INF / lib 之下。

Example

我們在此展現一個將 iText 使用在 Struts framework 上的範例。

(1) 首先就是要先建立一個 PDFAction extends Action

public class PDFAction extends Action
{
    public ActionForward execute(...)  throws Exception
    {}
}

(2)再來就是要建立一個 Document 物件,此物件是 iText library 中最核心的物件,因為他會幫我們展現我們最後的 PDF 內容。

Document document = new Document(PageSize.A4, 50, 50, 30, 30);

(3)建立完核心的物件後,最重要的就是設定該 document 的輸出,一般的 application 就可以直接設定成檔案的輸出,不過在網頁中的輸出卻是 user 的 browser,所以輸出的設定也是一項考驗。

ByteArrayOutputStream out = new ByteArrayOutputStream();
PdfWriter.getInstance(document, out);
document.open();

//PDF Wrinting begin=================================

//PDF Wrinting end==================================

document.close();
response.setContentType("application/pdf");
ServletOutputStream sout = response.getOutputStream();
out.writeTo(sout);
sout.flush();
sout.close();
return null;

首先我們要建立一個 ByteArrayOutputStream 物件,他會負責幫我們將結果輸出成 ByteArray 的形式(類似 row data),並且我們要將 document 的輸出串流指定成剛剛的 ByteArrayOutputStream,接著就是啟動 document 物件。

設定好撰寫內容的起始設定後,當我們內容撰寫完後,我們也必須設定一些物件的狀態。當然,第一步就是關閉我們的 document 物件的寫入,這就當之後有程式碼要對他在進行寫入的動作時,系統會 throw an exception 給我們。另外,告知 browser 我們所要給他的文件格式也是很重要的,所以,我們就設定 response 物件的 content type 為 application/pdf。

接下來就是比較神奇的設定,我們要從 response 中獲得一個 output stream,並且將他指定為 ServletOutputStream,因為 ServletOutputStream 物件可以將我們的 PDF 內容轉換成 Binary data 傳送給 client 端,並且,我們要將先前建立的 ByteArrayOutputStream 的寫出導到 ServletOutputStream,最後就是將 stream 給 flush 並且關閉他。Action 的 execute method 最後回傳的 ActionForward 物件必須為 null,因為我們不需要在做任何的轉換,也不需要在將 controller (也就是此 Action) 的控制權轉交給某個頁面,因為我們已經將輸出的 content type and content 給設定好,所以是回傳 null 的 ActionForward。

(3)再來就是我們要輸出的 PDF 內容囉!從上述的程式碼,我們撰寫 PDF 的內容是在兩段 comments 之間。另外,在官方網站中的範例,他的程式碼都是 run 在單機上,不過對於 PDF 內容的撰寫卻可以移植到我們的 action 中,也就是接下來,您可以參考官方網站的範例程式,將 PDF 撰寫的程式碼放在上面程式碼中的 comments 之間,就可以執行了。當然,Struts 的基本設定是少不了的,在此就不再贅述了~

References

[1] iText 官方網站 http://www.lowagie.com/iText/

該網站提供所有相關於 iText 的所有資訊

[2] iText API http://itext.ugent.be/library/api/

[3] iText Tutorial : iText by Example http://itextdocs.lowagie.com/tutorial/

該網站提供許多線上的基本範例,除了提供範例程式外,還提供程式產生 PDF 的結果以供參考

2008年3月11日 星期二

[Java] JUnit 3.8.1 : An Unit Test Framework for Java

Introduction

對於 programmers 來說,如何確保自己的程式碼是正確的,通常都必須要自己親自去執行程式碼,然後自己扮演使用者的角色來手動測試,這已經是早期的 programmers 會做的是了。JUnit 就是一套 framework,他幫助 programmers 解決測試中繁雜的工作,透過撰寫 unit test code 來達到測試的效果,並且採用自動化、可重複測試的功能來降低 programmers 的工作。

clip_image002

圖一 JUnit 官方網頁

在 Eclipse 中,JUnit 是核新的 plug-in,除非您將他反安裝了,否則您可以在 Eclipse 中找到。

Example

要撰寫一個 unit test code 其實是一件很簡單的事,因為 JUnit library 都已經將繁雜的工作改以簡短的程式碼來解決。

(1) 首先,我們要先建立一個 JUnit 的 class,點選 eclipse 中的 [File] -> [New] -> [Others],接著您就會看到如圖二的畫面出現。

clip_image004

圖二 建立新的元件視窗

(2) 點選該視窗的 [JUnit Test Case],並且會出現如圖三的畫面。其中我們選擇上方的 [New JUnit 3 test],並且我們將我們的 unit test case class name 填入 name 欄位,接著選擇下方的 [Class under test] 右方的 [Browse…] 按鈕,接著會出現視窗讓我們選擇我們想要測試的 class。

clip_image006

圖三 建立新的 JUnit Test Case

(3) 選擇好上述的資訊並填寫完畢後,按下 [Next>] 後會出現如圖四的視窗。我們可以由此視窗中選擇我們對於該 class 中我們想要測試的 methods,並將他打勾,eclipse 會自動幫我們產生測試的基本程式框架,以方便我們測試。按下 [Finish] 後就會開啟測是的程式碼,我們會看到剛才我們所勾選的 methods 會以 testXXX() 的方式出現。

NOTE:本文件示範的 JUnit 版本為 JUnit 3,若您有興趣可以自行研究 JUnit 4,不過要先對於 JDK 5.0 的 Annotation 有基本的概念才行。

clip_image008

圖四 選擇目標 class 我們想要測試的 methods

(4) 有了程式的框架,我們當然還是要自己撰寫測試的 scenarios。首先我們從新假設我們要測試的目標 class 內容如下:

public class Math {

    public int add(int x, int y) { return x + y; }

    public int subtract(int x, int y) { return x - y; }

}

(5) 接著我們就用上述的 eclipse 工具幫我們產生測試程式碼的框架:

public class MathTest extends TestCase {

    public void setUp() { super.setUp(); }

    public void testAdd() {}

    public void testSubtract() {}

}

上述程式碼中的 setup() method 是用於起始設定的 method,也就是 JUnit 在呼叫每個測試 methods 前都會先執行 setup() method,如上面的測試程式碼中,JUnit 會依照下面的順序執行測試:setUp(), testAdd(), setUp(), testSubtract()。如果您的測試中是需要先建利一些物件,如:資料庫的連線 class等,您就不必在每個測試 methods 中撰寫建立這些物件的程式碼,您可以統一撰寫在 setup() method 中。

您所有的測試 methods 都必須以 test作為開頭,因為 JUnit 測試會根據 method 前面為 test 開頭的來進行測試。

(6) 接著我們就要開始撰寫測試的 scenario,在此我們就只示範 testAdd() method。

public class MathTest extends TestCase {

    public void setUp() { super.setUp(); }

    public void testAdd() {

        int x = 10;

        int y = 50;

        int expected = 60;

        int result = this.math.add(x, y);

        super.assertEquals(result, expected);

    }

}

上述程式碼中,我們先宣告一個class內部變數 math他是我們測試的目標,並且我們在 setup() method 中將他初始化。接著假設我們要輸入的 x and y 的值,以及我們所期望的輸出結果 expected 變數,然後我們就呼叫 Math 的 add() method 來獲得結果並存在 result 變數中,最後我們就呼叫 super class 中的 assertEquals 來斷定結果一定是要相同。

(7) 再來就是執行我們的測試案例,選擇 [Run] -> [Run As] -> [JUnit Test]。測試結果會如圖五。

clip_image013

圖五 測試結果報告視窗

如果您的測試無誤的話,就會在右邊出現綠色的 bar,左邊上方有一些測試的結果資訊,紀錄著您總共測試的 methods、測試中出現的 Errors 與測試中測試與您結果不符合的 Failures。

References

[1] JUnit 官方網站 http://junit.sourceforge.net/junit3.8.1/index.html

[2] Eclipse 官方網站 http://www.eclipse.org