啊?“測(cè)試”有這么重要?
沒(méi)有進(jìn)入TC前,在自己做過(guò)的一些小型項(xiàng)目中(或者根本不能稱(chēng)其為項(xiàng)目,只不過(guò)是自己寫(xiě)的一些程序)基本沒(méi)有做過(guò)比較體系的測(cè)試,更不用提應(yīng)用一些framework或是一些工具來(lái)進(jìn)行測(cè)試,那時(shí)候的測(cè)試往往就是在一定的位置上print出結(jié)果,與預(yù)期的結(jié)果相比較,從而知道程序的對(duì)錯(cuò)。進(jìn)入TC后,發(fā)現(xiàn)每一個(gè)開(kāi)發(fā)團(tuán)隊(duì)都有各自的QA,而且有些團(tuán)隊(duì)QA的人數(shù)并不少于開(kāi)發(fā)人員,測(cè)試的重要性在這里可見(jiàn)一斑。閱讀了一些關(guān)于測(cè)試的文章,尤其是X-Programming的一些材料后,才認(rèn)識(shí)到測(cè)試工作如此重要。“Program a little, test little”, 貌似平淡無(wú)奇的一句話(huà),但卻是所有項(xiàng)目尤其是企業(yè)級(jí)項(xiàng)目成功的保證。從某種程度上說(shuō),QA肩負(fù)著比開(kāi)發(fā)人員更重的使命。
鑒于測(cè)試有如此重要的地位,而且我有可能(只是有可能而已)參與GTSS的測(cè)試項(xiàng)目,所以近一個(gè)星期以來(lái)一直在對(duì)“測(cè)試”進(jìn)行研究。粗略的學(xué)習(xí)了一下用于測(cè)試的一些framework和工具,其中包括JUnit, JMeter, HttpUnit, JWebUnit, 并下Fund Connect近期完成的Performance Test進(jìn)行了研究。
想把學(xué)到的東西給大家看看
我的習(xí)慣是把一個(gè)階段學(xué)習(xí)到的東西總結(jié)一下,將其變成文字,這樣才能對(duì)學(xué)到的東西加深印象,也在成文過(guò)程中發(fā)現(xiàn)不明白不理解的地方。往往我寫(xiě)出的東西,都是給自己看的,加深個(gè)印象也就算了,但是這次為什么想和大家分享呢?并非炫耀自己有多么能干,學(xué)了多少東西,因?yàn)槲疑钪次疫@篇東西的人各個(gè)都比我能干,每一個(gè)人懂得都比我多。主要原因是:和大家不同,我不是做技術(shù)出身,只是單純對(duì)技術(shù)有興趣,想深入了解技術(shù),由于專(zhuān)業(yè)知識(shí)的欠缺,肯定在學(xué)習(xí)和應(yīng)用過(guò)程中會(huì)出現(xiàn)很多偏差,理解上也會(huì)有很多不對(duì)的地方,希望大家及時(shí)指出,我好及時(shí)更正。
好了不多羅嗦了,開(kāi)始正題!(歡迎大家拍轉(zhuǎn))
JUnit 單元測(cè)試的基礎(chǔ)
我可以大言不慚地說(shuō),JUnit本身是一個(gè)相當(dāng)簡(jiǎn)單的框架,想必各位也對(duì)其做過(guò)一些研究,所以直接給出一個(gè)自己寫(xiě)的簡(jiǎn)單的例子,來(lái)說(shuō)明JUnit的特點(diǎn)。







































































































































看到這里你可能會(huì)罵我把小孩子都能寫(xiě)出的東西貼到這里來(lái)丟人,其實(shí)就是這么個(gè)簡(jiǎn)單的例子足以說(shuō)明JUnit的運(yùn)作原理。class Money重載了方法equals(), 就是為了進(jìn)行Money對(duì)象之間的比較。這樣的比較在JUnit中是通過(guò)斷言的方式進(jìn)行的,由于基礎(chǔ)類(lèi)TestCase繼承于Assert類(lèi),從而繼承了Assert類(lèi)提供的所有斷言方法。所以一句話(huà)概括,JUnit是通過(guò)斷言機(jī)制進(jìn)行底層對(duì)象間的比較來(lái)判斷功能正確與否的。你可能會(huì)抬杠的說(shuō):“不僅是對(duì)象吧,JUnit也可以比較兩個(gè)int或者其他的primitive data啊!”,但在OO的理論中,Java中的primitive data也應(yīng)該是對(duì)象(如SmallTalk中的實(shí)現(xiàn)),但Java出于對(duì)性能的考慮,對(duì)primitive data沒(méi)有采取類(lèi)的實(shí)現(xiàn)方式,但同時(shí)也給出了各個(gè)primitive data 的wrapper class。
最初認(rèn)識(shí)到JUnit的這樣的工作原理,我有些失望懷疑它能否勝任復(fù)雜的商業(yè)邏輯的測(cè)試,看到了Fund Connect的performance test中測(cè)試service部分的代碼,我這樣的疑慮被消除了。下面節(jié)選一段代碼說(shuō)明:
























































































































從這個(gè)例子中可以看到,無(wú)論是多么復(fù)雜的邏輯(testGetFundProcessors)最終都能轉(zhuǎn)化成底層對(duì)象通過(guò)斷言的比較(紅色字體部分)。“Everything is object. ”, JUnit的工作原理決定了它應(yīng)該是單元測(cè)試的基礎(chǔ)。
另外,我也看了一下JUnit的源碼,代碼并不是很多多,由于應(yīng)用了一些模式,使其結(jié)構(gòu)設(shè)計(jì)較好。例如:TestCase類(lèi)中,在設(shè)計(jì)run()方法的繼承問(wèn)題時(shí),應(yīng)用了Template Method Pattern; 對(duì)于多個(gè)test方法,要有針對(duì)性地生成相應(yīng)的TestCase,應(yīng)用了Adapter Pattern;等等。大家有興趣的,可以對(duì)其源碼進(jìn)行研究。
強(qiáng)大的測(cè)試工具JMeter
我看過(guò)的所有的Apache的項(xiàng)目,都很成功。JMeter也不例外,說(shuō)其強(qiáng)大,我個(gè)人認(rèn)為有以下三個(gè)原因:
1、 較為友好的圖形用戶(hù)界面,易于測(cè)試人員使用,只要明白其中的原理用JMeter作測(cè)試是件愉快的事情而且它能夠方便的生成測(cè)試腳本。
2、 ThreadGroup概念的引進(jìn),這個(gè)概念在JMeter是相當(dāng)重要的,之所以JMeter能夠完成對(duì)各種不同服務(wù)器的壓力測(cè)試與性能測(cè)試,也仰仗著ThreadGroup。在一個(gè)ThreadGoup中可以規(guī)定應(yīng)用的線(xiàn)程數(shù)量(Number of Threads每一個(gè)線(xiàn)程代表一個(gè)用戶(hù)),也可以規(guī)定用戶(hù)行為的重復(fù)次數(shù)(loop count)。在企業(yè)級(jí)應(yīng)用的測(cè)試中,模擬多個(gè)用戶(hù)同時(shí)執(zhí)行操作或同時(shí)處理數(shù)據(jù)的操作,利用ThreadGroup可以輕松實(shí)現(xiàn)。
3、 JMeter將大量的Test Target作了非常好的封裝,用戶(hù)可以直接使用這些封裝好的部件,大大減少了測(cè)試的工作量。比如測(cè)試WebService用的WebService SOAP Request, 測(cè)試網(wǎng)頁(yè)的HttpRequest,測(cè)試數(shù)據(jù)庫(kù)連接的JDBC Request等等。測(cè)試工作進(jìn)而簡(jiǎn)化成了選擇組建,將各個(gè)組建有邏輯的組織在一起的過(guò)程。
對(duì)于JMeter的強(qiáng)大以及其應(yīng)用方法,因?yàn)榇蠹叶级晕以谶@里不多說(shuō)了。下面談?wù)剛€(gè)人認(rèn)為JMeter的不足之處。為了更清楚的說(shuō)明這個(gè)問(wèn)題,我將結(jié)合Fund Connect項(xiàng)目中,對(duì)于Server Performance Test的一些JMeter腳本進(jìn)行闡述。其中的一個(gè)Requirement如下:
Investors submit trades via GUI
Description: 15 investors log into FundConnect via GUI. Each investor submits 20 orders via a file upload.
Precondition: 20 investor institutions and 20 investors (one investor per investor institution) are set up in FundConnect.
Step: A JMeter script will execute the following steps: Log In à Start in Investor Home à Upload Multiple Orders à Select upload file à Submit file à Return to Investor Home.
Note: Each investor should upload a different file. The script should record the average time to execute the entire loop (Investor Home to Investor Home).
想必大家對(duì)這個(gè)需求再清楚不過(guò)了(畢竟剛完成測(cè)試工作)。用JMeter測(cè)試中有一個(gè)關(guān)鍵的組件(其余省略不說(shuō)了):
HttpRequest
Name:/fundconnect/FCUploadOrdersServlet
Send Parameters With the Request
Name value
thisURL /inv/upload_orders.jsp
submitURL /inv/upload_orders_summary.jsp
cancelURL /adm/index.jsp
Send a file with request
File name: D:\datatest\datatest\20order_upload\testdata\uploadorders_20_acct1.csv
Parameter Name: uploadfile
MIME Type: application/octet-stream
這個(gè)Request是向FCUploadOrdersServlet發(fā)出,其間傳遞了三個(gè)參數(shù)和一個(gè)文件,完成上傳order文件的工作。這個(gè)需求到此也就結(jié)束了,但大家有沒(méi)有想過(guò),如果把需求改成: 15 investors log into FundConnect via GUI. Each investor submits 20 orders via web page. 即如果要求這15個(gè)投資者通過(guò)web(非上傳文件方式)遞交20不同的order,模擬這樣的測(cè)試該如何進(jìn)行呢?JMeter針對(duì)這樣的Web頁(yè)面操作的測(cè)試,實(shí)現(xiàn)起來(lái)比較復(fù)雜。(如果誰(shuí)認(rèn)為不對(duì),可以聯(lián)系我,把你的方法告訴我)。我個(gè)人認(rèn)為做Web Application頁(yè)面上的功能測(cè)試,使用下面談到的兩個(gè)框架,實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單。
Web Application自動(dòng)化測(cè)試FrameWorks:HttpUnit JWebUnit
HttpUnit本身并沒(méi)有測(cè)試功能, 說(shuō)白了, 它不過(guò)包含了一些類(lèi)庫(kù), 可以用來(lái)模擬出一個(gè)瀏覽器(WebConversation類(lèi))并可以模擬用戶(hù)在網(wǎng)頁(yè)上的多種行為。HttpUnit沒(méi)有測(cè)試的功能,所以它要結(jié)合JUnit來(lái)完成Web測(cè)試的工作,例如下面是一段簡(jiǎn)單的代碼:































































你可以發(fā)現(xiàn)上面的一個(gè)例子, 已經(jīng)完成了對(duì)于在google中查找HttpUnit關(guān)鍵字的測(cè)試。
在此基礎(chǔ)上,JWebUnit更近一步,它實(shí)際上是建立在HttpUnit和JUnit框架之上,將二者功能結(jié)合、重構(gòu)后的產(chǎn)物。同時(shí),JWebUnit提供了更加易用的API來(lái)模擬用戶(hù)對(duì)web界面的操作,同樣是上面的代碼,JWebUnit的實(shí)現(xiàn)如下:



















































我相信不用加任何注釋, 大家也可以輕松的理解每一步操作。接下來(lái)我應(yīng)用了JWebUnit測(cè)試了Fund Connect web頁(yè)面上的一些功能, 下面列出了以Admin身份登陸, 對(duì)增加Fund這樣一個(gè)功能的測(cè)試:






















































































































































由此看出, JWebUnit可以完成Web頁(yè)面上復(fù)雜應(yīng)用的測(cè)試。可以在以后的項(xiàng)目中逐漸使用。
寫(xiě)在后面
首先得感謝你,能夠耐得住性子看到這里,浪費(fèi)了你寶貴的時(shí)間深表歉意。以上就是我對(duì)近期對(duì)于測(cè)試工具及FrameWork研究的小結(jié),有不對(duì)或不妥之處還請(qǐng)指正。
小川
馬天一你給我出來(lái),幫我改大點(diǎn)
沒(méi)有3.5的阿?