JUnit测试框架的使用经验分享
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
?
1、學(xué)習(xí)Junit框架的使用
可通過(guò)以下兩個(gè)示例進(jìn)行學(xué)習(xí)。
A、Junit使用方法示例1
1)把Junit引入當(dāng)前項(xiàng)目庫(kù)中
新建一個(gè) Java 工程—coolJUnit,打開(kāi)項(xiàng)目coolJUnit 的屬性頁(yè) -> 選擇“Java Build Path”子選項(xiàng) -> 點(diǎn)選“Add Library…”按鈕 -> 在彈出的“Add Library”對(duì)話框中選擇 JUnit,并在下一頁(yè)中選擇版本 Junit 4 后點(diǎn)擊“Finish”按鈕。這樣便把 JUnit 引入到當(dāng)前項(xiàng)目庫(kù)中了。
2)新建單元測(cè)試代碼目錄
單元測(cè)試代碼是不會(huì)出現(xiàn)在最終軟件產(chǎn)品中的,所以最好為單元測(cè)試代碼與被測(cè)試代碼創(chuàng)建單獨(dú)的目錄,并保證測(cè)試代碼和被測(cè)試代碼使用相同的包名。這樣既保證了代碼的分離,同時(shí)還保證了查找的方便。遵照這條原則,在項(xiàng)目 coolJUnit 根目錄下添加一個(gè)新目錄 testsrc,并把它加入到項(xiàng)目源代碼目錄中。
3)在工程中添加類
添加類SampleCaculator,類中有兩個(gè)方法,分別計(jì)算加減法。編譯代碼。
public class SampleCalculator {
//計(jì)算兩整數(shù)之和
public int add(int augend, int addend){
return augend + addend;
}
//計(jì)算兩整數(shù)之差
public int subtration(int minuend, int subtrahend){
return minuend - subtrahend;
}
}
4)寫(xiě)單元測(cè)試代碼
為類SampleCalculator添加測(cè)試用例。在資源管理器SampleCalculator.java文件處右擊選new>選Junit Test Case(見(jiàn)圖4),Source foler選擇testsrc目錄,點(diǎn)擊next,選擇要測(cè)試的方法,這里把a(bǔ)dd和subtration方法都選上,最后點(diǎn)finish完成。
Junit自動(dòng)生成測(cè)試類SampleCalculatorTest,修改其中的代碼(如下)。
其中assertEquals斷言,用來(lái)測(cè)試預(yù)期目標(biāo)和實(shí)際結(jié)果是否相等。
assertEquals( [Sting message], expected, actual )
expected是期望值(通常都是硬編碼的),actual是被測(cè)試代碼實(shí)際產(chǎn)生的值,message是一個(gè)可選的消息,如果提供的話,將會(huì)在發(fā)生錯(cuò)誤時(shí)報(bào)告這個(gè)消息。
如想用斷言來(lái)比較浮點(diǎn)數(shù)(在Java中是類型為float或者double的數(shù)),則需指定一個(gè)額外的誤差參數(shù)。
assertEquals([Sting message], expected, actual, tolerance)
其它斷言參見(jiàn)課本和參考書(shū)介紹。測(cè)試方法需要按照一定的規(guī)范書(shū)寫(xiě):
1.?測(cè)試方法必須使用注解 org.junit.Test 修飾。
2.?測(cè)試方法必須使用 public void 修飾,而且不能帶有任何參數(shù)。
5)查看運(yùn)行結(jié)果
在測(cè)試類上點(diǎn)擊右鍵,在彈出菜單中選擇 Run As JUnit Test。運(yùn)行結(jié)果如下圖,綠色的進(jìn)度條提示我們,測(cè)試運(yùn)行通過(guò)了。
B、Junit使用方法示例2
1)在工程中添加類
類WordDealUtil中的方法wordFormat4DB( )實(shí)現(xiàn)的功能見(jiàn)文件注釋。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class WordDealUtil {
/**
* 將Java對(duì)象名稱(每個(gè)單詞的頭字母大寫(xiě))按照
* 數(shù)據(jù)庫(kù)命名的習(xí)慣進(jìn)行格式化
* 格式化后的數(shù)據(jù)為小寫(xiě)字母,并且使用下劃線分割命名單詞
* 例如:employeeInfo 經(jīng)過(guò)格式化之后變?yōu)?employee_info
* @param name Java對(duì)象名稱
*/
public static String wordFormat4DB(String name){
Pattern p = Pattern.compile("[A-Z]");
Matcher m = p.matcher(name);
StringBuffer strBuffer = new StringBuffer();
while(m.find()){
//將當(dāng)前匹配子串替換為指定字符串,
//并且將替換后的子串以及其之前到上次匹配子串之后的字符串段添加到一個(gè)StringBuffer對(duì)象里
m.appendReplacement(strBuffer, "_"+m.group());
}
//將最后一次匹配工作后剩余的字符串添加到一個(gè)StringBuffer對(duì)象里
return m.appendTail(strBuffer).toString().toLowerCase();
}
}
2)寫(xiě)單元測(cè)試代碼
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)進(jìn)一步完善測(cè)試用例
單元測(cè)試的范圍要全面,如對(duì)邊界值、正常值、錯(cuò)誤值的測(cè)試。運(yùn)用所學(xué)的測(cè)試用例的設(shè)計(jì)方法,如:等價(jià)類劃分法、邊界值分析法,對(duì)測(cè)試用例進(jìn)行進(jìn)一步完善。繼續(xù)補(bǔ)充一些對(duì)特殊情況的測(cè)試:
//測(cè)試?null 時(shí)的處理情況
@Test public void wordFormat4DBNull(){
String target = null;
String result = WordDealUtil.wordFormat4DB(target);
assertNull(result);
}
//測(cè)試空字符串的處理情況
@Test public void wordFormat4DBEmpty(){
String target = "";
String result = WordDealUtil.wordFormat4DB(target);
assertEquals("", result);
}
//測(cè)試當(dāng)首字母大寫(xiě)時(shí)的情況
@Test public void wordFormat4DBegin(){
String target = "EmployeeInfo";
String result = WordDealUtil.wordFormat4DB(target);
assertEquals("employee_info", result);
}
//測(cè)試當(dāng)尾字母為大寫(xiě)時(shí)的情況
@Test public void wordFormat4DBEnd(){
String target = "employeeInfoA";
String result = WordDealUtil.wordFormat4DB(target);
assertEquals("employee_info_a", result);
}
//測(cè)試多個(gè)相連字母大寫(xiě)時(shí)的情況
@Test public void wordFormat4DBTogether(){
String target = "employeeAInfo";
String result = WordDealUtil.wordFormat4DB(target);
assertEquals("employee_a_info", result);
}
4)查看分析運(yùn)行結(jié)果,修改錯(cuò)誤代碼
再次運(yùn)行測(cè)試。JUnit 運(yùn)行界面提示我們有兩個(gè)測(cè)試情況未通過(guò)測(cè)試(見(jiàn)圖6),當(dāng)首字母大寫(xiě)時(shí)得到的處理結(jié)果與預(yù)期的有偏差,造成測(cè)試失敗(failure);而當(dāng)測(cè)試對(duì) null 的處理結(jié)果時(shí),則直接拋出了異常——測(cè)試錯(cuò)誤(error)。顯然,被測(cè)試代碼中并沒(méi)有對(duì)首字母大寫(xiě)和 null 這兩種特殊情況進(jìn)行處理,修改如下:
//修改后的方法wordFormat4DB
public static String wordFormat4DB(String name){
if(name == null){
return null;
}
Pattern p = Pattern.compile("[A-Z]");
Matcher m = p.matcher(name);
StringBuffer sb = new StringBuffer();
while(m.find()){
if(m.start() != 0)
m.appendReplacement(sb, ("_"+m.group()).toLowerCase());
}
return m.appendTail(sb).toString().toLowerCase();
}
2、使用Junit框架對(duì)類Date和類DateUtil進(jìn)行單元測(cè)試。
只對(duì)包含業(yè)務(wù)邏輯的方法進(jìn)行測(cè)試,包括:
類Date中的
isDayValid(int year, int month, int day)
isMonthValid(int month)
isYearValid(int year)
類DateUtil中的
isLeapYear(int year)
getDayofYear(Date date)?
本文選自:http://www.spasvo.com/news/html/2014123144207.html
?轉(zhuǎn)載于:https://my.oschina.net/spasvo/blog/352138
總結(jié)
以上是生活随笔為你收集整理的JUnit测试框架的使用经验分享的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 为什么禁止使用325水泥
- 下一篇: 魔兽猎人名字563个