汪添生,馬朝晗,崔 蔚,劉 迪,4,趙俊峰,夏 飛
1(國(guó)網(wǎng)信息通信產(chǎn)業(yè)集團(tuán)有限公司,北京 100761)
2(廈門(mén)億力吉奧信息科技有限公司,廈門(mén) 361000)
3(國(guó)網(wǎng)信通產(chǎn)業(yè)集團(tuán)億力科技公司,北京 100053)
4(北京中電普華信息技術(shù)有限公司,北京 100085)
5(國(guó)網(wǎng)江蘇省電力公司通信分公司,南京 210008)
基于多線程并發(fā)的JUnit與TestNG測(cè)試框架比較①
汪添生1,2,馬朝晗3,崔 蔚1,劉 迪1,4,趙俊峰5,夏 飛5
1(國(guó)網(wǎng)信息通信產(chǎn)業(yè)集團(tuán)有限公司,北京 100761)
2(廈門(mén)億力吉奧信息科技有限公司,廈門(mén) 361000)
3(國(guó)網(wǎng)信通產(chǎn)業(yè)集團(tuán)億力科技公司,北京 100053)
4(北京中電普華信息技術(shù)有限公司,北京 100085)
5(國(guó)網(wǎng)江蘇省電力公司通信分公司,南京 210008)
在多線程并發(fā)測(cè)試需求面前,Junit和TestNG這兩個(gè)簡(jiǎn)單的單元測(cè)試框架一直被拿來(lái)作比較,而用戶一般更偏向于配置簡(jiǎn)單、靈活、易操作且滿足測(cè)試要求的測(cè)試框架.本文對(duì)Junit和TestNG兩種多線程并發(fā)測(cè)試方式進(jìn)行實(shí)驗(yàn)對(duì)比,目的在于驗(yàn)證兩種框架對(duì)多線程并發(fā)測(cè)試的實(shí)現(xiàn)方式,為用戶在實(shí)際測(cè)試場(chǎng)景中選擇工具提出了依據(jù).
多線程;并發(fā)測(cè)試;JUnit;TestNG
隨著社會(huì)的信息化氣味越來(lái)越濃重,催促著IT業(yè)的快速發(fā)展,軟件的需求已經(jīng)融入各個(gè)行業(yè),用來(lái)輔助業(yè)務(wù)的信息化,規(guī)范化和正規(guī)化發(fā)展.軟件的測(cè)試技術(shù)將首先解決軟件開(kāi)發(fā)過(guò)程的各種問(wèn)題,而軟件單元測(cè)試在編碼完成后用來(lái)對(duì)軟件接口等方法進(jìn)行驗(yàn)證,是整個(gè)軟件生命周期中一個(gè)必不可少的環(huán)節(jié),降低軟件使用過(guò)程中的出錯(cuò)率[1].軟件開(kāi)發(fā)人員更喜歡在軟件投入集成測(cè)試前進(jìn)行自我驗(yàn)證,減少軟件的缺陷,但這其實(shí)更是一個(gè)理所應(yīng)當(dāng)?shù)牟襟E,后面進(jìn)行集成測(cè)試或者系統(tǒng)測(cè)試的測(cè)試人員都不會(huì)花時(shí)間去測(cè)試一個(gè)編碼本身都存在問(wèn)題的軟件.
大多數(shù)的在單元測(cè)試主要由開(kāi)發(fā)人員來(lái)進(jìn)行,一般主要包括五個(gè)方面的測(cè)試任務(wù):邊界條件測(cè)試、模塊中所有獨(dú)立路徑測(cè)試、模塊的各條錯(cuò)誤處理通路測(cè)試、局部數(shù)據(jù)結(jié)構(gòu)測(cè)試、模塊接口測(cè)試[2].這些測(cè)試任務(wù)中涉及到的代碼覆蓋率、重復(fù)率、并發(fā)性等問(wèn)題,促使一些優(yōu)秀自動(dòng)化測(cè)試框架產(chǎn)品的誕生,方便了開(kāi)發(fā)人員的單元測(cè)試工作.目前比較常用的自動(dòng)化測(cè)試框架有C++的CppUnit、CXXTest,Java的Junit、TestNG等[3-5].針對(duì)JAVA語(yǔ)言開(kāi)發(fā)的軟件單元測(cè)試,Junit和TestNG在集成開(kāi)發(fā)工具Eclipse中提供了插件的支持,受到很開(kāi)發(fā)人員的喜愛(ài),它提高了單元測(cè)試的效率,大大節(jié)約的開(kāi)發(fā)人員編寫(xiě)測(cè)試用例的時(shí)間,通過(guò)最后測(cè)試分析,更容易發(fā)現(xiàn)編碼當(dāng)中存在缺陷[6-11].
在最新的Junit版本Junit4中已經(jīng)不需要測(cè)試方法以Test開(kāi)頭,不用再繼承TestCase類等,同時(shí)此版本提供了注解,注解的使用簡(jiǎn)化的測(cè)試用例的代碼量,提高測(cè)試的效率,但Junit4本身支持多線程并發(fā)測(cè)試,卻沒(méi)有提供的相應(yīng)注解,相比Junit4,TestNG在多線程測(cè)試方面則提供了相應(yīng)的注解.最簡(jiǎn)單的方式是在要測(cè)試的方法前加上注解,如:
@Test(threadPoolSize=10,invocationCount=3, timeOut=1000),通 過(guò) 在 @Test注 解 中 配 置threadPoolSize這個(gè)屬性來(lái)進(jìn)入多線程模式的.屬性threadPoolSize的值代表該測(cè)試方法將會(huì)在10個(gè)不同的線程中同時(shí)執(zhí)行,屬性invocationCount配置的是該測(cè)試方法將被執(zhí)行的總次數(shù),timeOut的值將規(guī)定每次執(zhí)行該測(cè)試方法所耗費(fèi)時(shí)間的閾值,超時(shí)則測(cè)試失敗[12-14],這是最簡(jiǎn)單的方法級(jí)別的多線程配置.
1.1 Junit多線程簡(jiǎn)介
對(duì)于傳統(tǒng)的測(cè)試方式,大家都會(huì)使用main方法來(lái)執(zhí)行測(cè)試的方法,對(duì)于要執(zhí)行多線程的方法,創(chuàng)建一個(gè)線程類,再循環(huán)執(zhí)行線程類,以此來(lái)做到測(cè)試多線程并發(fā).Junit4支持通過(guò)在要進(jìn)行測(cè)試多線程的類前加上注解:@RunWith(TestRunner.class),TestRunner是自定義的類,繼承了BlockJUnit4ClassRunner,而擴(kuò)展的TestRunner內(nèi)部則實(shí)現(xiàn)了對(duì)多線程的定義,使得加上了該注解的類按TestRunner中的實(shí)現(xiàn)來(lái)跑多線程.
盡管Junit4對(duì)比之前幾個(gè)版本的Junit,最大的一個(gè)亮點(diǎn)是提供了注解,方便很多測(cè)試需要,但遺憾的是沒(méi)有提供多線程并發(fā)測(cè)試的注解.而TestNG則彌補(bǔ)了Junit的不足,支持的多線程并發(fā)測(cè)試的XML配置.
1.2 TestNG多線程簡(jiǎn)介
TestNG支持在多線程環(huán)境中執(zhí)行的測(cè)試方法,這種靈活的配置只需在所需測(cè)試的方法前加上一個(gè)注解,如 前 面 介 紹 的 @Test(threadPoolSize = 10, invocationCount=3,timeOut=1000),不僅如此,通過(guò)XML的配置,TestNG更能支持并行執(zhí)行測(cè)試方法,測(cè)試類,測(cè)試組件.testng.xml文件的節(jié)點(diǎn)屬性parallel可以設(shè)置多線程并發(fā)運(yùn)行測(cè)試的類型,屬性thread-count可以設(shè)置并發(fā)執(zhí)行時(shí)的線程池?cái)?shù)量.
相對(duì)于傳統(tǒng)的單線程執(zhí)行測(cè)試的方式,這種多線程方式擁有很大的優(yōu)勢(shì),由于是并發(fā)測(cè)試,總體測(cè)試的運(yùn)行時(shí)間則可以大大減少,并且可以單獨(dú)驗(yàn)證某段代碼在多線程環(huán)境中運(yùn)行的正確性.
2.1 Junit4多線程實(shí)現(xiàn)
2.1.1 通過(guò)main方法實(shí)現(xiàn)多線程
現(xiàn)在我們用傳統(tǒng)的main方法來(lái)執(zhí)行線程,首先設(shè)計(jì)一個(gè)類,其中有兩個(gè)待測(cè)試的方法,方法的內(nèi)容都是打印出一行信息,打印的信息后面拼接一個(gè)線程ID,主要代碼如表1所示.
表1 Junit測(cè)試類設(shè)計(jì)代碼
通過(guò)表1的代碼,我們可以知道測(cè)試類JunitA中有兩個(gè)方法junitAMethodOne和junitAMethodTwo,這兩個(gè)方法前面標(biāo)注了@Test,說(shuō)明兩個(gè)方法是要借助Junit框架進(jìn)行測(cè)試的方法.在方法的內(nèi)部,做的主要工作就是打印出一句信息,如:System.out.println ("junitAMethodOne"+id),打印的信息拼接了一個(gè)線程ID,此線程ID可以幫助我們知道該方法是被哪個(gè)線程所執(zhí)行.線程ID的線程的標(biāo)識(shí),通過(guò)它我們就能判斷兩個(gè)方法是在不同的線程中執(zhí)行還是在同一個(gè)線程中執(zhí)行.
設(shè)計(jì)好測(cè)試類后,通過(guò)在另一個(gè)擁有main方法的類中來(lái)測(cè)試上述的兩個(gè)方法,主要代碼如表2所示.在mian方法中使用循環(huán)來(lái)開(kāi)啟多個(gè)線程Thread,這里開(kāi)啟了2個(gè)線程.線程run方法是執(zhí)行任務(wù)的地方,這里使用JUnitCore.runClasses來(lái)執(zhí)行要測(cè)試的類,這樣會(huì)以線程模式來(lái)運(yùn)行測(cè)試類中所有標(biāo)注了@Test的方法.JUnitCore是執(zhí)行所有測(cè)試類的核心入口類,通過(guò)JUnitCore調(diào)用runClassses()方法,傳遞一個(gè)我們要進(jìn)行的測(cè)試類數(shù)組,數(shù)組有一個(gè)值,即JunitA.class,運(yùn)行后,將會(huì)有2個(gè)線程來(lái)并發(fā)執(zhí)行測(cè)試類JunitA中的兩個(gè)方法.
表2 main方法內(nèi)部主要代碼
運(yùn)行表2中的代碼得到如表3所示的運(yùn)行結(jié)果,從表3的運(yùn)行結(jié)果可以看出,有兩個(gè)線程ID分別為8和9的線程執(zhí)行了測(cè)試類JunitA中的方法,線程8執(zhí)行后打印出:junitAMethodOne 8和junitAMethodTwo 8;線程 9執(zhí)行后打印出:junitAMethodOne 9和junitAMethodTwo 9.
表3 通過(guò)main方法運(yùn)行結(jié)果
2.1.2 自定義Runner實(shí)現(xiàn)多線程
Junit4框架中引入了擴(kuò)展的機(jī)制,它允許我們通過(guò)自定義Runner來(lái)個(gè)性化我們自己的測(cè)試需求.Junit中的測(cè)試用例是交由Runner去執(zhí)行的,所以擴(kuò)展這個(gè)Runner,我們也達(dá)到多程線并發(fā)測(cè)試需求.默認(rèn)情況下Junit4使用BlockJUnit4ClassRunner,在開(kāi)發(fā)我們自己的Runner類時(shí),需要繼承BlockJUnit4ClassRunner,自定義Runner類關(guān)鍵代碼如表4所示.
表4 自定義Runner類
private final FrameworkMethod method; private final RunNotifier notifier; @Override public void run() { MultiThreadedRunner.super.runChild(method,notifier);//通過(guò)參數(shù)method的傳遞運(yùn)行測(cè)試類的方法numThreads.decrementAndGet(); } } } }
從表 4代碼可以看出,自定義的MultiThreadedRunner內(nèi)部嵌套了一個(gè)實(shí)現(xiàn)了Runnable接口的內(nèi)部類,而這個(gè)內(nèi)部類是實(shí)現(xiàn)多程線的關(guān)鍵,通過(guò)實(shí)現(xiàn) Runnable接口中的 run方法來(lái)執(zhí)行MultiThreadedRunner的runChild方法,runChild是執(zhí)行測(cè)試類的測(cè)試方法,在該方法中,由變量thread_count控件著啟動(dòng)線程的個(gè)數(shù),這里設(shè)置為4,然后通過(guò)new Thread(new Test(method,notifier)).start()運(yùn)行線程,從而做到多線程并發(fā)測(cè)試的目的,所以內(nèi)部關(guān)鍵代碼其實(shí)和通過(guò)main方法的實(shí)現(xiàn)方式是類似的,只是自定義的Runner類如何運(yùn)用于測(cè)試類呢?
擴(kuò)展了Runner后,在要進(jìn)行測(cè)試的JunitA類前加上 注 解 @RunWith(MultiThreadedRunner.class),則JunitA運(yùn)行時(shí)會(huì)使用MultiThreadedRunner來(lái)跑多線程.其運(yùn)行結(jié)果如表5所示.
表5 通過(guò)自定義Runner運(yùn)行結(jié)果
從表5的運(yùn)行結(jié)果可以看出,此方式只針對(duì)測(cè)試類的第一個(gè)方法運(yùn)行多線程并發(fā)測(cè)試,因此對(duì)于實(shí)際業(yè)務(wù)測(cè)試過(guò)程中需要對(duì)某個(gè)特定的重要接口進(jìn)行多線程并發(fā)測(cè)試可以使用此方式,只要設(shè)置好thread_count變量的值,可以任意進(jìn)行測(cè)試.
2.2 TestNG多線程實(shí)現(xiàn)
TestNG的多線程一直是開(kāi)發(fā)人員在執(zhí)行方法并發(fā)測(cè)試時(shí)的首選,基于XML文件的配置簡(jiǎn)單,靈活,容易上手,滿足的場(chǎng)景多樣性,而且TestNG的多線程并發(fā)測(cè)試是安全的,XML配置文件的結(jié)構(gòu)圖如圖1所示.
圖1 XML多線程配置文件結(jié)構(gòu)圖
表6說(shuō)明了XML涉及多線程配置時(shí)各節(jié)點(diǎn)的意義.通過(guò)在XML文件中的相關(guān)節(jié)點(diǎn)的配置,我們可以只對(duì)一個(gè)類中的所有方法進(jìn)行并發(fā)測(cè)試;對(duì)多個(gè)類進(jìn)行并發(fā)測(cè)試;對(duì)同一個(gè)測(cè)試套件內(nèi)的多個(gè)測(cè)試組件進(jìn)行并發(fā)測(cè)試.
表6 XML多線程配置文件屬性節(jié)點(diǎn)說(shuō)明
接下來(lái)我們運(yùn)用TestNG通過(guò)基于XML的配置方式來(lái)實(shí)現(xiàn)對(duì)測(cè)試類的多線程實(shí)現(xiàn)設(shè)計(jì).首先設(shè)計(jì)一個(gè)測(cè)試類TestngA,類中有兩個(gè)待測(cè)試的方法,方法的內(nèi)容都是打印出一行信息,打印的信息后面拼接一個(gè)線程ID,主要代碼如表7所示.
表7 TestNG測(cè)試類設(shè)計(jì)代碼
public void testngAMethodTwo(){ long id=Thread.currentThread().getId();/獲取一個(gè)線程ID System.out.println("testngAMethodTwo"+id);//方法二打印帶有線程ID的一條信息} }
2.2.1 并發(fā)執(zhí)行測(cè)試方法
現(xiàn)在我們通過(guò)基于XML文件的配置方式來(lái)測(cè)試多線程的并發(fā)測(cè)試實(shí)驗(yàn).并發(fā)執(zhí)行測(cè)試類中的所有測(cè)試方法對(duì)應(yīng)的XML配置文件如表8所示.
表8 并發(fā)測(cè)試方法的XML文件配置
從表8中我們看到suite這個(gè)節(jié)點(diǎn)有個(gè)parallel屬性設(shè)置成了“methods”,它代表TestNG將在不同的線程內(nèi)運(yùn)行測(cè)試方法.“thread-count”代表啟用的線程個(gè)數(shù),此處設(shè)置成2,代表將有2個(gè)線程被分配來(lái)執(zhí)行測(cè)試方法.因此針對(duì)測(cè)試類TestngA中的兩個(gè)方法,將會(huì)在2個(gè)不同的線程內(nèi)被執(zhí)行.
通過(guò)右擊此XML配置文件,選擇Run as->TestNG Suite,可以看到運(yùn)行結(jié)果如表9所示,從輸出結(jié)果后面拼接的線程ID可以看出,2個(gè)方法是在不同的線程內(nèi)執(zhí)行的.
表9 TestNG并發(fā)執(zhí)行測(cè)試方法的運(yùn)行結(jié)果
2.2.2 并發(fā)執(zhí)行測(cè)試類
由于本節(jié)要以多線程的模式并發(fā)執(zhí)行測(cè)試類,因此需要再設(shè)計(jì)一個(gè)測(cè)試類TestngB,該類也有兩個(gè)測(cè)試方法:testngBMethodOne和testngBMethodTwo,其它和測(cè)試類TestngA相同,方法內(nèi)部也是打印出帶有線程ID的信息.現(xiàn)在修改上節(jié)的XML配置文件,使它能夠在測(cè)試類之間并發(fā)執(zhí)行,修改后的XML配置文件如表10所示.
表10 并發(fā)測(cè)試類的XML文件配置
對(duì)比表8的配置文件,我們可以看出,唯一不同的是為滿足并發(fā)執(zhí)行測(cè)試類,需要在classes節(jié)點(diǎn)下再增加要并發(fā)執(zhí)行的測(cè)試類的信息,我們?cè)诒纠信渲昧薚estngA和TestngB兩個(gè)測(cè)試類,運(yùn)行后的結(jié)果如表11所示.
表11 TestNG并發(fā)執(zhí)行測(cè)試類的運(yùn)行結(jié)果
從表11的運(yùn)行結(jié)果可以看出,TestngA的方法testngAMethodOne和TestngB的方法testngBMethodOne是在線程9內(nèi)執(zhí)行的,而TestngA的方法testngAMethodTwo和TestngB的方法testngBMethodTwo是在線程10內(nèi)執(zhí)行的,也就是說(shuō)TestngA和TestngB兩個(gè)測(cè)試類是并發(fā)被執(zhí)行的.
2.2.3 并發(fā)執(zhí)行測(cè)試組件
XML配置文件的test節(jié)點(diǎn)是用來(lái)配置測(cè)試組件,前面2節(jié)的配置文件中,測(cè)試類都是配置在同一個(gè)名為“test1”測(cè)試組件中的,現(xiàn)在我們修改XML配置文件,將 TestngA分配在名為“test1”的測(cè)試組件中,將TestngB分配在名為“test2”的測(cè)試組件中,修改后的XML配置文件如表12所示.
表12 并發(fā)執(zhí)行測(cè)試組件的XML文件配置
運(yùn)行表12的配置文件得到的運(yùn)行結(jié)果如表13所示.
表13 TestNG并發(fā)執(zhí)行測(cè)試組件的運(yùn)行結(jié)果
從表13的運(yùn)行結(jié)果可以看出,雖然配置文件中thread-count設(shè)置成2,表示用2個(gè)線程來(lái)運(yùn)行兩個(gè)測(cè)試組件,但對(duì)于TestngA和TestngB中的2個(gè)方法, TestNG又分別分配了2個(gè)不同的進(jìn)程來(lái)執(zhí)行.由此得到的結(jié)論是,不同的組件中的測(cè)試類TestNG保證了它們?cè)讵?dú)立的進(jìn)程中執(zhí)行,同時(shí)根據(jù)suite節(jié)點(diǎn)中的thread-count屬性的設(shè)置分配了所設(shè)置個(gè)數(shù)的線程數(shù)量來(lái)運(yùn)行各個(gè)測(cè)試組件中的測(cè)試方法.
2.3 JUnit和TestNG對(duì)比分析
通過(guò)實(shí)驗(yàn)得出的基于多線程并發(fā)測(cè)試的JUnit和TestNG兩種測(cè)試框架的技術(shù)對(duì)比結(jié)果如表14所示.
表14 多線程并發(fā)的JUnit和TestNG框架對(duì)比
從表14的框架對(duì)比內(nèi)容可以看出,兩種測(cè)試框架中都可以達(dá)到大家的多線程并發(fā)測(cè)試的需求,Junit通過(guò)main方法或者自定義的Runner來(lái)運(yùn)行測(cè)試方法,方法內(nèi)部都是執(zhí)行定義的線程類達(dá)到并發(fā)測(cè)試; TestNG則更加方便的提供了方法級(jí)的注解以及簡(jiǎn)單的XML配置,就可以輕松并發(fā)測(cè)試,同時(shí)無(wú)需再去通過(guò)編代碼來(lái)達(dá)到目的.
執(zhí)行并發(fā)測(cè)試時(shí),Junit相比TestNG來(lái)說(shuō),更多的是我們?cè)诳刂浦鴪?zhí)行的代碼,TestNG則相對(duì)偏于配置的組合,一個(gè)簡(jiǎn)單的XML配置文件便能撐起整個(gè)并發(fā)測(cè)試的需求.因此結(jié)合這幾個(gè)點(diǎn)來(lái)說(shuō),TestNG在多線程并發(fā)測(cè)試方面的優(yōu)勢(shì)則比Junit更為突出.
在java單元測(cè)試方面,JUnit和TestNG一直是開(kāi)發(fā)人員最常用的開(kāi)源自動(dòng)化測(cè)試框架,兩者各有不同的特性,而TestNG則優(yōu)于JUnit,TestNG創(chuàng)建的靈感來(lái)自于JUnit和NUnit,但它卻不是一個(gè)JUnit的擴(kuò)展.從支持多程線方面,可以看出,JUnit不管是否實(shí)現(xiàn)自定義的Runner,還是從傳統(tǒng)的定義線程類開(kāi)始,都需要用戶手動(dòng)編寫(xiě)代碼來(lái)達(dá)到測(cè)試的目的,同時(shí)對(duì)特殊場(chǎng)景,還得考慮它的線程安全問(wèn)題;TestNG基于XML配置的方式來(lái)運(yùn)行多線程或者通過(guò)方法級(jí)上的注解便可支持多種并發(fā)測(cè)試的需求,而且配置文件簡(jiǎn)單、靈活、方便,無(wú)需用戶多花時(shí)間研究它的代碼即可進(jìn)行測(cè)試.所以在進(jìn)行多線程并發(fā)測(cè)試方面,選擇TestNG單元測(cè)試框架將是一個(gè)正確的決定.
在其他測(cè)試需求方面,TestNG還有JUnit框架無(wú)法比擬的優(yōu)點(diǎn),但兩者都有自己適用的場(chǎng)景,開(kāi)發(fā)人員最需要的是選擇一個(gè)適用自己場(chǎng)景的單元測(cè)試框架,選擇最合適的會(huì)比選擇功能最多的給用戶帶來(lái)更意想不到的結(jié)果,靈活的運(yùn)用測(cè)試框架才會(huì)完成高效的測(cè)試工作.
1周瑞陽(yáng),王猛.基于三層體系結(jié)構(gòu)的單元測(cè)試框架研究與實(shí)現(xiàn).計(jì)算機(jī)應(yīng)用,2010,30(8):29–37.
2白凱,崔冬華.基于JUnit自動(dòng)化單元測(cè)試的研究.計(jì)算機(jī)與數(shù)字工程,2010,38(2):52–54.
3孔亮亮,殷兆麟.Java類測(cè)試工具JUnit的分析與擴(kuò)展.計(jì)算機(jī)工程與設(shè)計(jì),2005,26(12):3413–3416.
4董曉霞.相鄰因素組合測(cè)試用例集的最優(yōu)生成方法閉.計(jì)算機(jī)學(xué)報(bào),2007,30(2):200–210.
5 Denis A,Perez C,Priol T,et al.Padico:A component-based software infrastructure for Grid computing.Proc.of lnternational Parallel and Distributed Processing Symposium. ftp://ftp.inria.fr/INRIA/publication/publi-pdf/RR/RR-4974.pdf. [2010-03-01].
6 Bradley S.Green.Software test automation.ACM,2000,17 (9):9–45.
7 Zhu H,Wong WE,Belli F.Advancing test automation technologyto meet the challenges of model-driven software development.ACM,2008,19(15):5–10.
8 Beust C,Suleiman H.Next generation Java testing:TestNG and advanced concepts.Pearson Education,2007.
9 Wang XC,Xu PJ.Build an Auto Testing Framework Based on Seleniumand FitNesse.2009 International Conference on InformationTechnology and Computer Science.2009,2.436–439.
10余波,王樹(shù)林,張大方.基于JUnit自動(dòng)生成類測(cè)試案例框架的實(shí)現(xiàn).計(jì)算機(jī)工程與應(yīng)用,2006,42(10):60–98.
11白凱,崔冬華.基于JUnit自動(dòng)化單元測(cè)試的研究.計(jì)算機(jī)與數(shù)字工程,2010,38(2):32–35.
12王晶,樊曉婭,張盛兵,等.同時(shí)多線程結(jié)構(gòu)的2級(jí)調(diào)度策略.西北工業(yè)大學(xué)學(xué)報(bào),2007,(3):433–437.
13肖明清,朱小平,夏銳.并行測(cè)試技術(shù)綜述.空軍工程大學(xué)學(xué)報(bào)(自然科學(xué)版),2005,(3):22–25.
14夏銳,肖明清,朱小平,等.并行測(cè)試技術(shù)在自動(dòng)系統(tǒng)中的應(yīng)用.計(jì)算機(jī)測(cè)量與控制,2005,13(1):7–10.
Comparison of JUnit and TestNG Testing Framework Based on Concurrent Multi-Thread
WANG Tian-Sheng1,2,MAZhao-Han3,CUI Wei1,LIU Di1,4,ZHAO Jun-Feng5,XIAFei5
1(State Grid Information&Telecommunication Co.Ltd.,Beijing 100761,China)
2(Xiamen Great Power Geo Information Technology Co.Ltd.,Xiamen 361000,China)
3(Great Power Science and Technology Corporation State Grid Information&Telecommunication Group,Beijing100053,China)
4(Beijing China-Power Information Technology Co.Ltd.,Beijing 100085,China)
5(State Grid Jiangsu Electric Power Company&Telecommunication Branch,Nanjing 210008,China)
In front of multi-threaded concurrent test requirements,Junit and TestNG these two simple unit test framework has been used to compare,but users generally prefer to the test framework that configuration is simple, flexible,and easy to operate and satisfied the test requirements.This thesis has made an experimental comparison of Junit and TestNG on multi-threaded concurrent test methods,to verify the two frameworks implementation for multithreaded concurrent test,and provides the basis for the user to select the tool in the actual test scenario for users.
multi-thread;concurrent testing;JUnit;TestNG
2016-09-02;收到修改稿時(shí)間:2016-11-07
10.15888/j.cnki.csa.005774