Junit 内部解密之一: Test + TestCase + TestSuite
轉(zhuǎn)自:http://blog.sina.com.cn/s/blog_6cf812be0100wbhq.html
nterface: Test?整個(gè)測(cè)試的的基礎(chǔ)接口
Method 1: abstract int countTestCases() ?這個(gè)方法主要是用來計(jì)算要運(yùn)行的test case的數(shù)量的。
Method 2:abstract void?run(TestResult result) ?這個(gè)方法主要是用來執(zhí)行一個(gè)測(cè)試用例并且在測(cè)試結(jié)果的實(shí)例中收集它的測(cè)試結(jié)果。
?
Class:TestCase
定義:abstract class?TestCase?extends Assert implements Test 繼承了Assert類并且實(shí)現(xiàn)了Test接口。而且是個(gè)抽象類。
?
Class: TestSuite
定義:class TestSuite implements Test;??Test接口的實(shí)現(xiàn)類,和TestCase一樣. 但是TestSuite是一系列testcase的集合,將所有要運(yùn)行的testcase add到TestSuite。
??????????????????????????????????????????
觀察一:TestCase 和 TestSuite類都實(shí)現(xiàn)了Test 接口。
好處一:由于當(dāng)你給TestSuite增加一個(gè)對(duì)象時(shí),實(shí)際上增加的是Test,而不只是個(gè)TestCase,這樣我們就既可以在TestSuite里面增加另一個(gè)TestSuite,也可以加入一個(gè)TestCase。如果是TestCase,那么就會(huì)運(yùn)行那個(gè)單獨(dú)的測(cè)試;如果是TestSuite,那么就運(yùn)行一組測(cè)試。
如何實(shí)現(xiàn):那么是如何實(shí)現(xiàn)上面說的那個(gè)好處呢?看下TestSuite的一個(gè)addtest方法就明白了:
Public void?addTest(Test test)?????新增一個(gè)test到testsuite,直接使用fTests.add(test)來新增。
這里可以新增的入?yún)⑹荰est接口,而不是一個(gè)TestCase對(duì)象,所以只要實(shí)現(xiàn)了Test接口的實(shí)現(xiàn)類,包括TestCase和TestSuite,都可以不斷的增加下去。這樣就引出了好處二和設(shè)計(jì)模式。
?
好處二:當(dāng)我們?yōu)樽约旱膽?yīng)用程序創(chuàng)建特殊的suite或組合出TestAll類非常容易。簡(jiǎn)單說明下TestAll類:僅僅包含了一個(gè)靜態(tài)的suite方法,會(huì)注冊(cè)需要定期執(zhí)行的所有的Test對(duì)象(包括TestCase對(duì)象和TestSuite對(duì)象)。
Java設(shè)計(jì)模式:Composite模式
定義:把對(duì)象組合(composite)成樹狀結(jié)構(gòu)來表示部分-整體層次關(guān)系,Composite模式可以讓客戶一致的對(duì)待單個(gè)對(duì)象和對(duì)象的組合。
?
我們來看下Junit的Test接口和TestCase和TestSuite類是如何實(shí)現(xiàn)Composite模式的:
先搞清楚Junit里面的部分-整體分別是什么,這里單個(gè)的TestCase可以看作是部分,把復(fù)合的TestCase(TestSuite)看作是整體,看下面的圖:
?
我們可以看到這樣的模式會(huì)帶來另外一些好處:
簡(jiǎn)化了JUnit的代碼??JUnit可以統(tǒng)一處理組合結(jié)構(gòu)TestSuite和單個(gè)對(duì)象TestCase。使JUnit開發(fā)變得簡(jiǎn)單容易,因?yàn)椴恍枰獏^(qū)分部分和整體的區(qū)別,不需要寫一些充斥著if else的選擇語(yǔ)句。
好處三:TestCase是個(gè)抽象實(shí)現(xiàn)類,而且繼承了Assert類,這里為啥要繼承Assert類呢?因?yàn)樵谝粋€(gè)testcase中是肯定需要用的Assert斷言的,如果不繼承Assert類,那么testcase方法中要寫成Assert.assert(),不是很簡(jiǎn)潔,現(xiàn)在繼承了Assert類后,我們就可以在繼承了TestCase類的測(cè)試類中直接assert(),使測(cè)試代碼看得非常簡(jiǎn)潔和清楚。
?
定義了TestCase對(duì)象和TestSuite的類層次結(jié)構(gòu)??基本對(duì)象TestCase可以被組合成更復(fù)雜的組合對(duì)象TestSuite,而這些組合對(duì)象又可以被組合,如我們上個(gè)例子,這樣不斷地遞歸下去。客戶代碼中,任何使用基本對(duì)象的地方都方便的使用組合對(duì)象,大大簡(jiǎn)化系統(tǒng)維護(hù)和開發(fā)。
?
仔細(xì)看看Test接口的方法,它存在一個(gè)是countTestCases方法,它來統(tǒng)計(jì)這次測(cè)試有多少個(gè)TestCase,另外一個(gè)方法run。還有一個(gè)參數(shù)TestResult,它來統(tǒng)計(jì)測(cè)試結(jié)果。這里為啥存在一個(gè)run方法呢? 我們想想Junit在run testcase的時(shí)候,需要把這些testcase的組成打包后成為請(qǐng)求發(fā)送到Junit Framework,這樣我們實(shí)現(xiàn)TestCase類的時(shí)候,可以自由的實(shí)現(xiàn)run方法去打包發(fā)送請(qǐng)求。這樣我們?cè)趯憸y(cè)試用例時(shí)候,只需繼承TestCase,來完成run方法即可,把測(cè)試結(jié)果記錄到TestResult中,這樣的做法就好引出另外的Java設(shè)計(jì)模式。
Java設(shè)計(jì)模式:Command模式
定義:將一個(gè)請(qǐng)求封裝成一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求進(jìn)行排隊(duì)或記錄請(qǐng)求日志...,Command告訴我們可以為一個(gè)操作生成一個(gè)對(duì)象并給出它的一個(gè)execute(執(zhí)行)方法。
run()就是我們的Command模式的Excecute方法:
?
我們可以看到這樣的模式會(huì)帶來另外一些好處:
Command模式將實(shí)現(xiàn)請(qǐng)求的一方(TestCase開發(fā))和調(diào)用一方(JUnit Fromwork)分離開。
Command模式可以將多個(gè)TestCase進(jìn)行組合成一個(gè)復(fù)合命令,實(shí)際你將看到TestSuit就是它的復(fù)合命令。
轉(zhuǎn)載于:https://www.cnblogs.com/daxiong2014/p/4501171.html
總結(jié)
以上是生活随笔為你收集整理的Junit 内部解密之一: Test + TestCase + TestSuite的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: discuz x2.5用户注册后邮箱认证
- 下一篇: 两种方法解决tomcat的 Failed