1. install the following software
jre 1.5 or 1.6, tomcat 5525, eclipse, axis2
and in eclipse preferences set tomcat to web server, set jre env and set axis2's runtime
2. create a java project and add axis2 runtime library to its build library
test ws client sample code:
public class TestSms
{
private static EndpointReference targetEPR = new EndpointReference(
"http://cdl:8080/axis2/services/Version");
public static OMElement getGetLeftElement(){
OMFactory fac=OMAbstractFactory.getOMFactory();
OMNamespace omNs=fac.createOMNamespace("此處填寫WS的命名空間","hw");
OMElement method=fac.createOMElement("WS 方法名",omNs);
OMElement value = fac.createOMElement("參數(shù)一", omNs);
value.addChild(fac.createOMText(value, "值一"));
method.addChild(value);
value = fac.createOMElement("參數(shù)二", omNs);
value.addChild(fac.createOMText(value, "值2"));
method.addChild(value);
return method;
}
public static void main(String[] args){
try{
Options options=new Options();
options.setTo(targetEPR);
options.setAction("命名空間/WS 方法名");
ServiceClient sender=new ServiceClient();
sender.setOptions(options);
OMElement sayHello=TestSms.getGetLeftElement();
//WSDLConstants.
OMElement result=sender.sendReceive(sayHello);
OMElement elem = result.getFirstElement();
System.out.println(elem.getText());
//System.out.println(result);
}
catch(Exception axisFault){
axisFault.printStackTrace();
}
}
}
ref:
http://zhangjunhd.blog.51cto.com/113473/23690
http://randomcoder.com/articles/jsessionid-considered-harmful
最近總是打不開網(wǎng)頁中的JAVA程序, 本來機(jī)器上有JAVA開發(fā)環(huán)境, 重裝系統(tǒng)一般不安裝JAVA,反正設(shè)置java_home和path中添加javac/java就可以了. 結(jié)果IE總是打不開,也不找到原因. 今天沒辦法了, 要參加一項考試,只好在網(wǎng)上搜索了一下, 原來出問題總是有原因的.
參考官方幫助:
http://www.java.com/zh_CN/download/help/win_offline.xml下載jre運(yùn)行環(huán)境.安裝.
- 雙擊該圖標(biāo)打開“Java 控制面板”
- 在“Java 控制面板”中選擇“瀏覽器”選項卡
- 確保選中“Internet Explorer”、“Netscape”或“Mozilla”旁邊的復(fù)選框
- 如果尚未選中,請選中對應(yīng)的復(fù)選框,為您的 Web 瀏覽器啟用 JRE
- 單擊“應(yīng)用”按鈕
Internet Explorer 4.x 及更高版本
- 單擊“工具”-->“Internet 選項”
- 選擇“高級”選項卡,并向下滾動到“Java (Sun)”
- 選中“使用 Java 2 版本”旁邊的復(fù)選框
- 接下來選擇“安全”選項卡,然后選擇“自定義級別”按鈕
- 向下滾動到“Java 小程序腳本”
- 確保選中“啟用”單選按鈕。
- 單擊“確定”保存您的首選設(shè)置。
最后不要忘了在這里測試一下是否安裝成功: http://www.java.com/zh_CN/download/help/testvm.xml
久未在這里練筆了.今天突然想到為什么JAVA在國內(nèi)始終對初學(xué)者而言不容易. 是因為網(wǎng)上的DEMO或示例感覺比.net的少,而且有示例也不是直接能在eclipse或jbuilder中打開的. 一般初學(xué)者估計IDE不是很熟悉,因此要把示例代碼運(yùn)行起來就不容易了, 更何況要分析別人的代碼. 相比之下,.net的示例一般是整個工程,而且由于只有vs IDE,因此提供的示例一般是針對此平臺的, 要學(xué)也就容易多了.
聽說goolge要收購sun java了,如果真是這樣, 應(yīng)該是一件好事, 又多了一個強(qiáng)有力的競爭者, JAVA的前途就光明了.
一點個人淺見.
明天就是2005年最后一天了, 本想休一天假, 只是最近手頭上的項目跟別的公司有關(guān), 脫不了身, 煩燥呀, 準(zhǔn)LP又在罵了, 要生存, 沒辦法。
去年底搞了個今年十大目標(biāo),看了一下,沒幾個完成了,估計只有30-40%完成了。
整天都在忙,不管是公司的事還是自己的研究,這一年就沒有幾天晚上是12點之前睡的,在上一個公司經(jīng)常是晚上11點回去睡覺,現(xiàn)在這家公司是回去之后繼續(xù)搞,所有的業(yè)余愛好都沒有了,買了個DC,也沒怎么用,什么都沒有心情,事情總是在那里等著,視力又下降了,身體感覺不如從前了。記憶力也下降了,前一陣子的事都不記得了,只知道這兩天做了些啥。
雖然又長了一歲,其它到是沒什么長進(jìn):
- 五一節(jié)前終于換了家公司,計劃之內(nèi)的事,也算是完成了一項計劃任務(wù);
- 今年開始聽《余世維》的講座了,學(xué)以致用,沒地方用,聽了也沒多少長進(jìn);
- 上周終于把兩年前買的MP3搞懂如何快進(jìn)了,便宜貨就是不好用;
- MS出vs2k5,裝上了,也感覺蠻好用,只是機(jī)器跑不動了;
- 開始使用Eclipse開發(fā)真正的JAVA項目,發(fā)現(xiàn)自己真的是很菜,眼高手低的毛病還是沒改;
- 常年出差在外,跟準(zhǔn)LP吵了無數(shù)次,已經(jīng)是家常便飯了,計劃明年結(jié)婚,還不知道是否會途中有變;
- 聯(lián)系上以前的同學(xué),可是要么不敢說話,要么就是沒話說;
- 那個買的房子還有問題,不是我家里漏水,就是別人家漏水來淹我,唉,人倒霉了擋都擋不??;
- 周圍的同學(xué)和以前的同事要么結(jié)婚,要么就是準(zhǔn)備當(dāng)爸媽了,想想自己還在外面打工,感覺自己真是沒多少出息;
- 還有,想不起來了,。。。
每天都是新的一天,努力做好現(xiàn)在的事才是最重要的,把去年的計劃拿來改改,爭取在元旦這幾天弄個2006年計劃了,日子再艱難,也得過呀,畢竟這也是一種生活。
最近要在一個項目中使用java, 本來是用.net開發(fā)的, 可是驗收時用戶要求用java平臺,只好進(jìn)行移植工作了. 一直使用的是.net開發(fā), JAVA只是關(guān)注, 沒有深入研究, 等實際應(yīng)用時才發(fā)現(xiàn)自己水平有限, 問題一堆.
把最近碰上的問題做些整理:
使用JAVA平臺的問題:
1. 開發(fā)工具太多, 什么Eclipse, jbuilder等,各有不同, 讓人熟悉就花時間了, 本為以為對JB比較熟悉,又有2006版本了, 就用它吧, 可是才兩天, 就發(fā)現(xiàn)自己的代碼文件中的中文變?yōu)閬y碼了, 當(dāng)然網(wǎng)上有一堆解決方案, 只是心里不爽, 直接不用了, 改為eclipse了, 操作界面不是很熟悉, 與VS.NET IDE還是有不少區(qū)別, 只是用多了自然就熟悉了,
又從網(wǎng)上當(dāng)了一堆插件, 什么tomcat, xml編輯器, 沒有用myeclipse, 雖然支持JSP,以前用過一下, 也不太好用, 其它的就沒找到什么好東西了, 時間也不允許, 至少現(xiàn)在可以調(diào)度JAVA代碼了, JSP的調(diào)試再說吧.
2. 開始整的時候,發(fā)現(xiàn)自己在WEB開發(fā)方面熟悉的是VS的ASPX事件模型, 反而不知道如何處理JSP了, 只好使用以前ASP的模式, 使用form提交, 感覺真是太落伍了, 雖然現(xiàn)在有許多AJAX之類的東西, 也支持客戶端事件模型, 實在沒時間研究這些東西了. 先做出來再說.
數(shù)據(jù)庫連接類使用了以前jive中的幾個類, 支持在xml中配置連接等, 再自己寫了一個類, 從XML中讀取SQL語句, 差不多能用.
3。在網(wǎng)上搜索了一把,未找到在eclipse中對web service支持比較好的plugin,發(fā)現(xiàn)版本都比較低,似乎久未更新了,JB下到是有不錯的設(shè)計和編譯界面,只是JB其它太爛。
字符集問題:
使用java首先就要碰上一個中文字符的顯示和處理問題, 這些問題總是很煩, 要對request進(jìn)行編碼才能解決.
既然使用非MS平臺, 數(shù)據(jù)庫可能就不會用到mssql server了, 使用mysql, 發(fā)現(xiàn)要移植以前的數(shù)據(jù)還是比較容易, 但mysql的驅(qū)動實在不好弄, 剛開始使用純JDBC的驅(qū)動, 結(jié)果發(fā)現(xiàn)在中文字符的處理上始終有問題, 只好
網(wǎng)上查原因, 發(fā)現(xiàn)jdbc驅(qū)動的版本太低, 在判斷中文字符上有問題, 升級驅(qū)動程序, 可以插入和顯示了, 但SQL中是中文, 可是進(jìn)了數(shù)據(jù)庫就是亂碼, 試了N遍也不行, 只好改為jdbc-odbc.
但接下來在執(zhí)行batch sql時又報錯了, 說mysql odbc driver 的SQL語法錯, 檢查了半天, SQL也能在mysql中執(zhí)行的, 就是不能通過JAVA提交執(zhí)行. 用的是mysql 5.0.X, 支持unicode 的編碼建表. 最后只能采用一個折衷的辦法,自己寫一個批量執(zhí)行SQL的類,采用“;”分隔多個SQL,在調(diào)用時仍然一行一行的執(zhí)行,郁悶。
最終的字符集解決辦法:
頁面上要設(shè)置字符集的輸出格式,如GBK或GB2312,另外,如果使用統(tǒng)一的包含文件定義輸出字符集,還是不行,必須在每個頁面中單獨(dú)定義,也可能是我的INCLUDE方式不對;
數(shù)據(jù)庫連接字符串中也要設(shè)置編碼;
在傳遞數(shù)據(jù)到DB的SQL還要對中文進(jìn)行編碼;
String key = new String(request.getParameter("txtKey").getBytes("ISO8859_1"));
最后還有一個問題是,如果TOMCAT編譯JSP文件生成的JAVA文件有亂碼,那么在訪問的時候頁面上總是要報錯,什么"delete tokens"之類的,此時要刪除掉tomcat\work目錄下的中間編譯代碼才行;
控件及常用庫
WEB控件, 網(wǎng)上有一堆各種各樣的lib和控件, 但這些東西太浪費(fèi)時間, 光是上網(wǎng)找就比較花時間了, 下回來試用也有各種各樣的問題,
每個控件有自己的特色, 而且每個總是滿足了這個,滿足不了那個需求, 要都滿足, 還是要收費(fèi)的才行, 畢竟天下沒有多少免費(fèi)的午餐;
主要有幾個:
1。數(shù)據(jù)顯示表格控件,應(yīng)該能支持排序,有緩存機(jī)制,能分頁,能設(shè)置格式,支持ResultSet或ArrayList之類的,還要有導(dǎo)出excel等功能;最好要能簡單使用。
2。圖表控件,最有名的當(dāng)然是cewolf/jfreechart,只是要使用它自己定義的DatasetProducer,不能直接使用ResultSet,也是個麻煩事,不過的確是很不錯的控件了。
小結(jié)
1。經(jīng)過這次移植,發(fā)現(xiàn)JAVA還是有許多很牛的地方,采用hashmap來緩存數(shù)據(jù),效率的確很不錯,只是用得太多,缺乏管理機(jī)制,有點混亂了,下一階段再重構(gòu)一下,形成一個管理框架最好;
2。eclipse開發(fā)的確很不錯,與vs ide差別是比較大,只是使用習(xí)慣了之后發(fā)現(xiàn)其功能強(qiáng)大,而且可以找些plugin來擴(kuò)展功能,估計我只是看到了點皮毛而已。
3。在JAVA下開發(fā),使用Javascript太多,還沒找到更好解決辦法,水平有限;
4。與另一個人一起開發(fā),大家的編程風(fēng)格和代碼不夠規(guī)范,使用了一些重復(fù)的類和方法,這在后期維護(hù)是個工作,時間太緊,項目總是這樣,就沒得多少提高了;
個人水平實在有限,上面只是一面之詞,項目月底才結(jié)束,有什么變更再補(bǔ)充。
不用說,這種事情一般人如果沒有經(jīng)歷過,或旁邊沒有人經(jīng)歷過,要想搞得很清楚,一會兒就搞定是不可能的。
在N天前就到辦證中心去拿了一張清單,上面有需要用到的證明文件。查看了一下家里的百寶箱,差不多都有。趁著8月份的五天請假,星期四的時候去辦理。過程到不是很復(fù)雜,只拿了張一式兩聯(lián)的準(zhǔn)遷證,當(dāng)時根本就未在意準(zhǔn)遷證上的內(nèi)容,上面有個有效期的說法。這也只能怪自己粗心大意了。有效期是40天,到差不多過了一個月之后即9。10我還在出差,順便讓老婆看了一下,才發(fā)現(xiàn)是有有效期的,趕緊打電話問能否延長,這下麻煩了。17號在成都的時候,本想托人帶回樂山給我老爸,可是我再仔細(xì)看了一下,發(fā)現(xiàn)必須在9.20之前回成都辦理好,算了一下時間,已然來不及。19號,到辦證中心希望能延長一下有效期,幸好,他們把有效期延長了一個月,趕快EMS給老爸,周三收到,周四到樂山辦理銷戶并寄回成都,周六在成都收到。9。30,以請了一天假,到辦證中心辦理戶口及身份證,按照要求需要提供:戶口銷戶證明,準(zhǔn)遷證第二聯(lián),身份證及照片兩張。本以為辦證中心旁邊的照相中心說不能照非身份證照,慘,又趕快去找了一家普通相館照相。交上各手續(xù),終于拿到了成都市的戶口薄,正準(zhǔn)備辦身份證,說是照相的聯(lián)網(wǎng)有問題,不能照,旁邊的一群人立刻炸開了鍋,大罵政府辦事有問題,甚至有人開始打電話投訴,沒過多久,也不知道如何又搞好了,反正又排起長隊開始照,我前面有20個人左右,差不多等了一個小時,造成老爸的生日午飯也沒來得及趕回去吃。照完后又到柜臺辦理身份證,交上各手續(xù)和20元錢,說兩個月之內(nèi)可以拿到了。唉,真是好事多磨。不僅花了不少郵寄費(fèi),也花了不少時間和精力。政府為何就不改善一下局面,明知效率低,有問題,非得經(jīng)過這些瑣碎的步驟才行。對于沒經(jīng)歷過的人而言,真的是要耽擱不少時間。
An early look at JUnit 4
Upcoming release promises evolution in testing
|
難度級別: 中
Elliotte Harold (elharo@metalab.unc.edu),
Adjunct Professor, Polytechnic University
2005-9-15 (譯)
原文:http://www-128.ibm.com/developerworks/java/library/j-junit4.html
JUnit 是JAVA語言事實上的標(biāo)準(zhǔn)測試庫。JUnit
4是三年以來最具里程碑意義的一次發(fā)布。它的新特性主要是針對JAVA5中的標(biāo)記(annotation)來簡化測試,而不是利用子類、反射或命名機(jī)制。本文將講述如何使用JUnit
4,當(dāng)前前提是你最好具有JUnit的使用經(jīng)驗.
JUnit, 由Kent Beck?和 Erich Gamma開發(fā),幾乎是JAVA開發(fā)最重要的第三方工具。正如Martin Fowler
所說,“在軟件開發(fā)領(lǐng)域,從來就沒有如此少的代碼起到了如此重要的作用“。由于JUnit,JAVA代碼變得更健壯,更可靠,BUG也比以前更少。由于JUnit
(由Smalltalk's的SUnit得來) 的出現(xiàn),隨后產(chǎn)生了許多xUnit的測試工具,如nUnit (.NET), pyUnit (Python),
CppUnit (C++), dUnit (Delphi) 和其它不同平臺及語言的測試相關(guān)的工具。
雖然JUnit也只是一個工具,但其產(chǎn)生的思想和技術(shù)卻較其架構(gòu)更意義重大。單元測試,測試先行的編程方式,測試驅(qū)動的開發(fā)方式,并非必須由JUNIT實現(xiàn),也不一定要用SWing實現(xiàn)GUI界面。JUNIT最近的一次更新是在三年前,但它比其它大多數(shù)有BUG的框架都要健壯,更重要的是,JAVA一直在改進(jìn)?,F(xiàn)在JAVA支持泛型,枚舉,可變長度參數(shù),以及標(biāo)記語言(開創(chuàng)了開發(fā)可重用框架的新局面)。
JUnit's的停滯不前使得那些想要變革的開發(fā)人員換其它測試工具.挑戰(zhàn)者有Bill Venners的Artima SuiteRunner和Cedric
Beust的TestNG.這些工具庫雖然有值得推薦的功能,但沒有任何一款的地位能與JUNIT相比,沒有任何一款工具被其它業(yè)界產(chǎn)品如Ant, Maven,
Eclipse廣泛支持.因此Beck
和Gamma雙開始利用JAVA5的新特性來開發(fā)新版的JUNIT,目的是利用JAVA5中的標(biāo)記特性使得單元測試開發(fā)更容易。Beck說:“JUNIT4的主要目的是通過簡化JUNIT的使用鼓勵更多的開發(fā)人員寫更多的測試”。雖然會與以前的版本兼容,但JUNIT4與從JUNIT1.0就開始的版本相比會有一個非常大的變化.
注意: 修改基本框架是一把雙刃劍,雖然JUNIT4的目的是清晰的,但細(xì)節(jié)仍有許多不同,因此本文只是一個簡單的介紹,并不是最終文檔.
測試方法
以前所有版本的JUNIT都使用命名機(jī)制和反射來定位測試,下面的代碼測試1+1= 2:
import junit.framework.TestCase;
public class AdditionTest extends TestCase {
private int x = 1;
private int y = 1;
public void testAddition() {
int z = x + y;
assertEquals(2, z);
}
}
|
而在JUNIT 4中,測試方法由@Test 標(biāo)記說明,如下:
import org.junit.Test;
import junit.framework.TestCase;
public class AdditionTest extends TestCase {
private int x = 1;
private int y = 1;
@Test public void testAddition() {
int z = x + y;
assertEquals(2, z);
}
}
|
使用標(biāo)記的好處是你不用將所有測試方法命名為 testFoo() , testBar()等等以"test"開頭的方法,下面的方法也同樣可以工作:
import org.junit.Test;
import junit.framework.TestCase;
public class AdditionTest extends TestCase {
private int x = 1;
private int y = 1;
@Test public void additionTest() {
int z = x + y;
assertEquals(2, z);
}
}
|
下面的代碼也同樣正確:
import org.junit.Test;
import junit.framework.TestCase;
public class AdditionTest extends TestCase {
private int x = 1;
private int y = 1;
@Test public void addition() {
int z = x + y;
assertEquals(2, z);
}
}
|
這種命名機(jī)制最大的優(yōu)點是更適合你的待測試類或方法名稱,例如,你可以使用ListTEst.contains()測試 List.contains() ;使用ListTest.addAll()測試
List.add()等等.
TestCase還可以繼續(xù)使用,但你沒有必須再擴(kuò)展為子類,只要你聲明了@Test,你可以將測試方法放在任何類中,當(dāng)然如要訪問assert等方法,你必須要引用junit.Assert類,如下:
import org.junit.Assert;
public class AdditionTest {
private int x = 1;
private int y = 1;
@Test public void addition() {
int z = x + y;
Assert.assertEquals(2, z);
}
}
|
你也可以使用JDK5中的新特性(static import)使得跟以前版本一樣簡單:
import static org.junit.Assert.assertEquals;
public class AdditionTest {
private int x = 1;
private int y = 1;
@Test public void addition() {
int z = x + y;
assertEquals(2, z);
}
}
|
這種方法測試受保護(hù)的方法非常容易,因為你可以在測試類中繼承有受保護(hù)方法的類.
SetUp 和TearDown
JUnit 3 中test runners 會在每個測試之前自動調(diào)用 setUp()方法。此方法主要用于初始化變量,打開日志,重置環(huán)境變量等。下面是XOM's
XSLTransformTest中的 setUp()方法:
protected void setUp() {
System.setErr(new PrintStream(new ByteArrayOutputStream()));
inputDir = new File("data");
inputDir = new File(inputDir, "xslt");
inputDir = new File(inputDir, "input");
}
|
在JUnit 4中,你仍然可以在每個測試前初始化變量和配置環(huán)境,,然而,這些操作可以不用在Setup()中完成,你可以在初始化方法前面添加@Beforer
來表示,如下:
@Before protected void initialize() {
System.setErr(new PrintStream(new ByteArrayOutputStream()));
inputDir = new File("data");
inputDir = new File(inputDir, "xslt");
inputDir = new File(inputDir, "input");
}
|
你也可以有多個方法標(biāo)記有@Before,所有方法都會在每個測試之前執(zhí)行:
@Before protected void findTestDataDirectory() {
inputDir = new File("data");
inputDir = new File(inputDir, "xslt");
inputDir = new File(inputDir, "input");
}
@Before protected void redirectStderr() {
System.setErr(new PrintStream(new ByteArrayOutputStream()));
}
|
清除環(huán)境與JUNIT3 差不多,在JUNIT3中使用 tearDown()方法,下面的代碼是結(jié)束測試時回收內(nèi)存:
protected void tearDown() {
doc = null;
System.gc();
}
|
在JUnit 4中,你還可以使用@After標(biāo)記來說明:
@After protected void disposeDocument() {
doc = null;
System.gc();
}
|
與 @Before一樣,你也可以有多個標(biāo)記有 @After的清除方法,每個都會在執(zhí)行完每個測試后執(zhí)行。
最后,你不需要在父類中明確調(diào)用這些初始化或清除方法.test
runner會自動調(diào)用這些標(biāo)記的方法.子類中的@Before方法在父類的@Before方法之后執(zhí)行(這與構(gòu)造函數(shù)的執(zhí)行順序一樣),而@After方法剛好相反,子類中的@After方法先執(zhí)行.然而,多個@Before和@After方法的執(zhí)行順序就是未知的.
測試集范圍的初始化
JUnit
4中引入了一項JUNIT3沒有的新特性,類級別的setUp()和tearDown(),即在一個類的所有測試前執(zhí)行初始化,并在所有測試完成后執(zhí)行清除。
例如,一個測試類中的每個測試都要用到一個數(shù)據(jù)庫連接或網(wǎng)絡(luò)連接,或其它很耗資源初始化或釋放的資源,用不著在每個測試方法前后進(jìn)行操作,而只需要在測試類開始前后執(zhí)行即可。下面的示例是使用第三方的庫進(jìn)行錯誤,在執(zhí)行所有測試前將錯誤先重定向到非標(biāo)準(zhǔn)輸出,然后在所有測試結(jié)束后再輸出到需要的地方,這樣就不會影響到測試過程中產(chǎn)生的其它信息。
// This class tests a lot of error conditions, which
// Xalan annoyingly logs to System.err. This hides System.err
// before each test and restores it after each test.
private PrintStream systemErr;
@BeforeClass protected void redirectStderr() {
systemErr = System.err; // Hold on to the original value
System.setErr(new PrintStream(new ByteArrayOutputStream()));
}
@AfterClass protected void tearDown() {
// restore the original value
System.setErr(systemErr);
}
|
上面的操作沒有必須在每個測試前后執(zhí)行。然而要注意的是,這種方法可能影響測試間的結(jié)果,如果一個測試改變了初始化的對象,而這個對象可能是其它測試的輸入,那么測試的結(jié)果可能不正確,這種方法將依賴測試的順序并可能引入BUG。當(dāng)優(yōu)化測試性能,并且當(dāng)你改進(jìn)了配置和基準(zhǔn)測試后而仍然很慢時,如數(shù)據(jù)庫連接或網(wǎng)絡(luò)問題,你才需要考慮使用這種方法。只有這樣,你才能每天執(zhí)行多次測試。
異常測試
異常測試是JUNIT4中的最大的改進(jìn),以前異常測試是通過try catch實現(xiàn),當(dāng)拋出異常時,在try的最后添加一條fail()語句實現(xiàn).如下:
public void testDivisionByZero() {
try {
int n = 2 / 0;
fail("Divided by zero!");
}
catch (ArithmeticException success) {
assertNotNull(success.getMessage());
}
}
|
這種方法不僅難看,而且造成無論成功或失敗,代碼覆蓋工具都不能執(zhí)行某些代碼.而在JUnit 4中,你可以在要拋出異常的代碼中添加標(biāo)記來聲明一個異常是期望的:
@Test(expected=ArithmeticException.class) public void divideByZero() {
int n = 2 / 0;
}
|
如果沒有異常拋出,上面的測試則會失敗,如果你想知道異常的詳細(xì)信息或其它情況,你還是要使用try catch才行
需要忽略的測試
也許你有些測試需要很長時間才能執(zhí)行完成,并非是這個測試應(yīng)該跑得快,而是它做的很復(fù)雜和很慢的工作造成的.如訪問遠(yuǎn)程網(wǎng)絡(luò)錯誤,需要很久才能有反饋.如果你不想讓這種測試破壞你整個測試過程,你可能想跳過這個測試.當(dāng)然也有可能某個測試超出控制范圍而失?。鏦3C
XInclude測試集中自動識別一些JAVA不支持的Unicode代碼.為了防止這些測試總是通不過,可以使用標(biāo)記 @Ignore跳過這些測,如下:
// Java doesn't yet support the UTF-32BE and UTF32LE encodings
@Ignore public void testUTF32BE()
throws ParsingException, IOException, XIncludeException {
File input = new File(
"data/xinclude/input/UTF32BE.xml"
);
Document doc = builder.build(input);
Document result = XIncluder.resolve(doc);
Document expectedResult = builder.build(
new File(outputDir, "UTF32BE.xml")
);
assertEquals(expectedResult, result);
}
|
test runner不會執(zhí)行這些測試,但會說明這些測試被跳過了。在命令行測試界面中,字母“I”會表示測試跳過,或“E”表示測試失敗,而不是用點”."表示成功.
$ java -classpath .:junit.jar org.junit.runner.JUnitCore nu.xom.tests.XIncludeTest
JUnit version 4.0rc1
.....I..
Time: 1.149
OK (7 tests)
|
要注意的是,假設(shè)這些測試由于某種理由放在最開始,如果你以后一直忽略這些測試,那些需要被測試的代碼可能有問題而不會被檢測到。因此忽略測試只是一個臨時解決方法,并不是一個解決任何問題的真正辦法。
時間測試
性能測試是單元測試中最頭疼的問題,JUnit 4也未完全解決此問題,
你可以在JUNIT4的測試方法中添加一個時間參數(shù)。如果測試時間超過參數(shù),則測試失敗。如下,如果測試時間超過0.5秒,則此測試失敗:
@Test(timeout=500) public void retrieveAllElementsInDocument() {
doc.query("http://*");
}
|
除基準(zhǔn)性能測試外,時間測試在網(wǎng)絡(luò)測試方面也很有用.如果一個遠(yuǎn)端的主機(jī)或數(shù)據(jù)當(dāng)?shù)艋蛱?,你可以跳過此測試而不用阻塞在這里,好的測試集可以在作了一些改動后很快的一遍一遍的執(zhí)行,可能一天數(shù)十次.設(shè)置一個超時讓測試更快的執(zhí)行,下面的示例中如果分析http://www.ibiblio.org/xml
的時間超過2秒,則測試失敗.
@Test(timeout=2000)
public void remoteBaseRelativeResolutionWithDirectory()
throws IOException, ParsingException {
builder.build("http://www.ibiblio.org/xml");
}
|
新的斷言
JUnit 4 增加了兩上斷文方法用于比較數(shù)組:
public static void assertEquals(Object[] expected, Object[] actual)
public static void assertEquals(String message, Object[] expected,
Object[] actual)
|
這兩個方法采用最直接方法比較,如果數(shù)組長度相同,且每個對應(yīng)的元素相同,則比較成功,否則不成功.參數(shù)為空的情況也作了考慮.
需要補(bǔ)充的地方
JUnit 4是一個非?;镜目蚣?,還不是以前版本的升級。JUNIT3的開發(fā)人員會發(fā)現(xiàn)有些功能沒有。
-
最大的特點就是沒有GUI測試界面,當(dāng)測試正確時是綠色條,而出錯時紅色的,你也可以在Eclipse中集成JUNIT使用,但JUNIT4既沒有AWT也沒有SWING的GUI測試界面;
-
另一個讓人吃驚的是失敗(期望錯誤)和錯誤(未預(yù)計的異常錯誤)沒有明顯區(qū)別,在JUNIT3中開發(fā)人員可以區(qū)分這兩種情況,而在JUNIT4中不行;
-
最后一個特點是JUNIT中沒有用于建立一堆測試類的
suite()方法,取而代之的是,采用變長參數(shù)傳遞未知數(shù)量的測試給test
runner。
沒有GUI測試界面的確不方便,但其它改變簡化了JUNIT的使用,從當(dāng)前JUNIT的操作手冊和FAQ的數(shù)量就知道,而JUNIT4的文檔將不會需要這么多。
編譯和運(yùn)行JUnit 4
現(xiàn)在JUnit 4還沒有發(fā)布編譯版本,如果想體驗版本的樂趣,則需要從CVS中獲取源代碼。分支標(biāo)簽是"Version4" (see
Resources ).要注意的是大部分文檔是根據(jù)JUNIT3編寫的,還未同步更新。需要Java 5才能編譯JUnit
4,因為大量使用了標(biāo)記,泛型其其它JDK5中的新特性。
執(zhí)行測試的命令行方式與JUNIT3有點區(qū)別,你現(xiàn)在要使用 org.junit.runner.JUnitCore 類進(jìn)行測試,如下:
$ java -classpath .:junit.jar org.junit.runner.JUnitCore
TestA TestB TestC...
JUnit version 4.0rc1
Time: 0.003
OK (0 tests)
|
兼容性
Beck 和Gamma在努力保持后向和前向兼容性。JUnit 4可以直接運(yùn)行根據(jù)JUNIT3編寫的測試類,而不用任何修改,直接將各測試類的全名傳遞給test
runner即可.test runner會根據(jù)不同的測試類調(diào)用不同的測試框架版本.
后向兼容性有點麻煩,即在JUNIT3中執(zhí)行根據(jù)JUNIT4寫的測試類,之所以要這樣是因為在一個集成環(huán)境如Ecplise中,不需要升級到JUNIT4也可以測試JUNIT4的測試類,從而避免工具IDE的升級。為了讓JUNIT4的測試類在JUNI3中能執(zhí)行,你需要一個適配類JUnit4TestAdapter封裝JUNIT3的測試類,如下代碼:
public static junit.framework.Test suite() {
return new JUnit4TestAdapter(AssertionTest.class);
}
|
而JAVA方面,JUNIT4一點兼容性都沒有,因為完全依賴于JDK5的新特性,因此不可能在JAVA1.4上面執(zhí)行JUNIT4。
還有...
JUnit 4遠(yuǎn)未結(jié)束,還有許多需要補(bǔ)充,如文檔,現(xiàn)在不推薦將以前的測試類升級到JUNIT4。當(dāng)然JUNIT4的開發(fā)速度很快,其計劃也很快會實現(xiàn),JAVA1.4的開發(fā)人員仍然可以使用JUNIT3.8,而使用JAVA5的人員可以考慮是否采用JUNIT4了,因為在特性上更適合。
資源
-
Pragmatic
Unit Testing in Java with JUnit (Andy Hunt and Dave Thomas,
Pragmatic Programmers, 2003): An excellent introduction to unit testing.
-
JUnit
Recipes: Practical Methods for Programmer Testing (J. B.
Rainsberger, Manning, 2004): One of the most widely cited and referenced books
on JUnit.
-
TestNG: Cedric Beust's framework
pioneered the annotation based testing style now used in JUnit 4.
-
"TestNG makes
Java unit testing a breeze" (Filippo Diotalevi, developerWorks, January
2005): An introduction to TestNG.
-
"Incremental development
with Ant and JUnit" (Malcolm Davis, developerWorks, November 2000):
Explores the benefits of unit testing, in particular using Ant and JUnit, with
code samples.
-
"Demystifying
Extreme Programming: Test-driven programming" (Roy Miller,
developerWorks, April 2003): Find out how test-driven programming can
revolutionize your productivity and quality as a programmer, and learn the
mechanics of writing tests.
-
"Keeping
critters out of your code" (David Carew, et. al., developerWorks, June
2003): Learn how you can use JUnit in conjunction with WebSphere Application
Developer.
-
"Measure test
coverage with Cobertura" (Elliotte Rusty Harold, developerWorks, May
2005): Learn to identify untested code and locate bugs with this handy open
source tool.
下載測試版本
-
JUnit 4: Download the newest version of JUnit the SourceForge CVS
repository; be sure to use the branch tag "Version4."
|