天天看點

JUnit測試架構的使用經驗分享

  a、junit使用方法示例1

  1)把junit引入目前項目庫中

  單元測試代碼是不會出現在最終軟體産品中的,是以最好為單元測試代碼與被測試代碼建立單獨的目錄,并保證測試代碼和被測試代碼使用相同的包名。這樣既保證了代碼的分離,同時還保證了查找的友善。遵照這條原則,在項目 cooljunit 根目錄下添加一個新目錄 testsrc,并把它加入到項目源代碼目錄中。

  3)在工程中添加類

  添加類samplecaculator,類中有兩個方法,分别計算加減法。編譯代碼。

public class samplecalculator {

//計算兩整數之和

public int add(int augend, int addend){

return augend + addend;

}

//計算兩整數之差

public int subtration(int minuend, int subtrahend){

return minuend - subtrahend;

  4)寫單元測試代碼

  junit自動生成測試類samplecalculatortest,修改其中的代碼(如下)。

  其中assertequals斷言,用來測試預期目标和實際結果是否相等。

  assertequals( [sting message], expected, actual )

  expected是期望值(通常都是寫死的),actual是被測試代碼實際産生的值,message是一個可選的消息,如果提供的話,将會在發生錯誤時報告這個消息。

  如想用斷言來比較浮點數(在java中是類型為float或者double的數),則需指定一個額外的誤差參數。

  assertequals([sting message], expected, actual, tolerance)

  其它斷言參見課本和參考書介紹。測試方法需要按照一定的規範書寫:

  1. 測試方法必須使用注解 org.junit.test 修飾。

  2. 測試方法必須使用 public void 修飾,而且不能帶有任何參數。

  5)檢視運作結果

  在測試類上點選右鍵,在彈出菜單中選擇 run as junit test。運作結果如下圖,綠色的進度條提示我們,測試運作通過了。

 b、junit使用方法示例2

  1)在工程中添加類

  類worddealutil中的方法wordformat4db( )實作的功能見檔案注釋。

import java.util.regex.matcher;

import java.util.regex.pattern;

public class worddealutil {

/**

* 将java對象名稱(每個單詞的頭字母大寫)按照

* 資料庫命名的習慣進行格式化

* 格式化後的資料為小寫字母,并且使用下劃線分割命名單詞

* 例如:employeeinfo 經過格式化之後變為 employee_info

* @param name java對象名稱

*/

public static string wordformat4db(string name){

pattern p = pattern.compile("[a-z]");

matcher m = p.matcher(name);

stringbuffer strbuffer = new stringbuffer();

while(m.find()){

//将目前比對子串替換為指定字元串,

//并且将替換後的子串以及其之前到上次比對子串之後的字元串段添加到一個stringbuffer對象裡

m.appendreplacement(strbuffer, "_"+m.group());

//将最後一次比對工作後剩餘的字元串添加到一個stringbuffer對象裡

return m.appendtail(strbuffer).tostring().tolowercase();

  2)寫單元測試代碼

import static org.junit.assert.*;

import org.junit.test;

public class worddealutiltest {

@test

public void testwordformat4db() {

string target = "employeeinfo";

string result = worddealutil.wordformat4db(target);

assertequals("employee_info", result);

  3)進一步完善測試用例

  單元測試的範圍要全面,如對邊界值、正常值、錯誤值的測試。運用所學的測試用例的設計方法,如:等價類劃分法、邊界值分析法,對測試用例進行進一步完善。繼續補充一些對特殊情況的測試:

//測試 null 時的處理情況

@test public void wordformat4dbnull(){

string target = null;

assertnull(result);

//測試空字元串的處理情況

@test public void wordformat4dbempty(){

string target = "";

assertequals("", result);

//測試當首字母大寫時的情況

@test public void wordformat4dbegin(){

//測試當尾字母為大寫時的情況

@test public void wordformat4dbend(){

string target = "employeeinfoa";

assertequals("employee_info_a", result);

//測試多個相連字母大寫時的情況

@test public void wordformat4dbtogether(){

string target = "employeeainfo";

assertequals("employee_a_info", result);

  4)檢視分析運作結果,修改錯誤代碼

  再次運作測試。junit 運作界面提示我們有兩個測試情況未通過測試(見圖6),當首字母大寫時得到的處理結果與預期的有偏差,造成測試失敗(failure);而當測試對 null 的處理結果時,則直接抛出了異常——測試錯誤(error)。顯然,被測試代碼中并沒有對首字母大寫和 null 這兩種特殊情況進行處理,修改如下:

//修改後的方法wordformat4db

if(name == null){

return null;

stringbuffer sb = new stringbuffer();

if(m.start() != 0)

m.appendreplacement(sb, ("_"+m.group()).tolowercase());

return m.appendtail(sb).tostring().tolowercase();

  2、使用junit架構對類date和類dateutil(參見附錄)進行單元測試。

  隻對包含業務邏輯的方法進行測試,包括:

  類date中的

  isdayvalid(int year, int month, int day)

  ismonthvalid(int month)

  isyearvalid(int year)

  類dateutil中的

  isleapyear(int year)

  getdayofyear(date date)

最新内容請見作者的github頁:http://qaseven.github.io/