JUnit測(cè)試控制@Test執(zhí)行順序的三種方式小結(jié)
JUnit測(cè)試控制@Test執(zhí)行順序
第一種
@FixMethodOrder(MethodSorters.JVM)
從上到下 執(zhí)行@Test
第二種(推薦)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
按方法名字順序執(zhí)行@Test
第三種
@FixMethodOrder(MethodSorters.DEFAULT)
默認(rèn)方法,不可預(yù)期
Junit測(cè)試方法保證執(zhí)行順序
由于需要做自動(dòng)化測(cè)試,所以需要比較完善的單元測(cè)試。但是又因?yàn)槟承y(cè)試的執(zhí)行依賴(lài)另外一個(gè)測(cè)試產(chǎn)生的結(jié)果,所以希望所寫(xiě)的test case按照自己希望的順序來(lái)執(zhí)行。
隨后博主查閱資料發(fā)現(xiàn)了FixMethodOrder注解,可以有三種方式可以控制test執(zhí)行順序。
/** * Sorts the test methods by the method name, in lexicographic order, with {@link Method#toString()} used as a tiebreaker */ NAME_ASCENDING(MethodSorter.NAME_ASCENDING), /** * Leaves the test methods in the order returned by the JVM. Note that the order from the JVM may vary from run to run */ JVM(null), /** * Sorts the test methods in a deterministic, but not predictable, order */ DEFAULT(MethodSorter.DEFAULT);
大概上就是上面三種,很多大佬的博客上都對(duì)這幾種有講解以及示例,博主在這里就不啰嗦了,下面說(shuō)一下我的一些疑問(wèn)以及發(fā)現(xiàn)。
當(dāng)使用默認(rèn)排序時(shí)
@FixMethodOrder(MethodSorters.DEFAULT) public class testDemo{ @Test public void B(){ System.out.println("b"); } @Test public void C(){ System.out.println("c"); } @Test public void A(){ System.out.println("a"); } @Test public void AB(){ System.out.println("ab"); } @Test public void AC(){ System.out.println("ac"); } @Test public void A1(){ System.out.println("a1"); } }
輸出
a
b
c
a1
ab
ac
這只是博主眾多測(cè)試結(jié)果中的一個(gè),實(shí)際上與API中描述的“but not predictable”有所出入,執(zhí)行的順序是可預(yù)期的。
因?yàn)橛^察到,名字短的總排在前面,ascii碼小的總在前面,所以博主猜測(cè)有可能順序跟方法名字的字符串的hashcode有關(guān)的,于是加上hashcode方法輸出之后,得到結(jié)果:
方法A:65
方法B:66
方法C:67
方法A1:2064
方法AB:2081
方法AC:2082
所以可以得出結(jié)論,當(dāng)單元測(cè)試使用默認(rèn)執(zhí)行順序的時(shí)候,測(cè)試方法執(zhí)行的順序是跟測(cè)試方法名字符串的hashcode大小線性相關(guān)。
Junit執(zhí)行時(shí)應(yīng)該是把所有的有@test注釋的方法存到一個(gè)容器里,然后交由jvm去一一執(zhí)行(博主還沒(méi)來(lái)得及仔細(xì)去研讀Junit的源碼,這是本人的猜測(cè))。那么問(wèn)題來(lái)了,這一系列的方法是在同一個(gè)線程下還是多個(gè)線程一起執(zhí)行的呢?
其實(shí)從測(cè)試的執(zhí)行順序可以控制不難猜出,多個(gè)測(cè)試方法是串行執(zhí)行的,但是實(shí)踐才是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)。
代碼就不貼了,有興趣的同學(xué)可以自己寫(xiě)一下看看,就是在第二順位執(zhí)行的方法那里讓他休眠一下,觀察是否也會(huì)阻塞第三個(gè)方法。
最終的結(jié)果也證明了猜想。
我現(xiàn)在看的還比較淺顯,有時(shí)間的話(huà)會(huì)去研讀Junit的底層源碼。以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家
相關(guān)文章
SpringBoot整合Canal與RabbitMQ監(jiān)聽(tīng)數(shù)據(jù)變更記錄
這篇文章主要介紹了SpringBoot整合Canal與RabbitMQ監(jiān)聽(tīng)數(shù)據(jù)變更記錄,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09Springboot全局異常捕獲及try catch區(qū)別解析
這篇文章主要介紹了Springboot全局異常捕獲及try catch區(qū)別解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Java簡(jiǎn)單實(shí)現(xiàn)調(diào)用命令行并獲取執(zhí)行結(jié)果示例
這篇文章主要介紹了Java簡(jiǎn)單實(shí)現(xiàn)調(diào)用命令行并獲取執(zhí)行結(jié)果,結(jié)合實(shí)例形式分析了Java調(diào)用ping命令并獲取執(zhí)行結(jié)果相關(guān)操作技巧,需要的朋友可以參考下2018-08-08Java char[]數(shù)組轉(zhuǎn)成String類(lèi)型詳細(xì)介紹
這篇文章詳細(xì)介紹了Java char[]數(shù)組轉(zhuǎn)成String類(lèi)型(char to String)的方法,文章中有詳細(xì)的代碼示例,需要的朋友可以參考閱讀2023-04-04Java設(shè)計(jì)模式之責(zé)任鏈模式(Chain of Responsibility模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之責(zé)任鏈模式(Chain of Responsibility模式)介紹,本文講解了如何使用責(zé)任鏈模式,并給出了4種使用實(shí)例,需要的朋友可以參考下2015-03-03Java實(shí)現(xiàn)Map集合二級(jí)聯(lián)動(dòng)示例
Java實(shí)現(xiàn)Map集合二級(jí)聯(lián)動(dòng)示例,需要的朋友可以參考下2014-03-03使用Mybatis遇到的坑之Integer類(lèi)型參數(shù)的解讀
這篇文章主要介紹了使用Mybatis遇到的坑之Integer類(lèi)型參數(shù)的解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03springboot啟動(dòng)加載CommandLineRunner @PostConstruct問(wèn)題
這篇文章主要介紹了springboot啟動(dòng)加載CommandLineRunner @PostConstruct問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08解決java.sql.SQLException:The?server?time?zone?value?&apo
這篇文章主要介紹了解決java.sql.SQLException:The?server?time?zone?value?'?D1ú±ê×?ê±??'?is?unrecognized問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03Java計(jì)算兩個(gè)時(shí)間段的差的實(shí)例詳解
在本篇內(nèi)容中,我們給大家整理了關(guān)于Java計(jì)算兩個(gè)時(shí)間段的差的實(shí)例內(nèi)容,并做了詳細(xì)分析,有需要的朋友們學(xué)習(xí)下。2022-11-11