日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

junit测试线程_一个在自己的线程中运行测试的JUnit规则

發(fā)布時(shí)間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 junit测试线程_一个在自己的线程中运行测试的JUnit规则 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

junit測(cè)試線程

有時(shí),能夠在單獨(dú)的線程中運(yùn)行JUnit測(cè)試會(huì)很有幫助。 特別是在編寫(xiě)與封裝的ThreadLocal或類似對(duì)象進(jìn)行交互的集成測(cè)試時(shí),這可能會(huì)派上用場(chǎng)。 單獨(dú)的線程將隱式確保每次測(cè)試運(yùn)行都未初始化threadlocal的與線程相關(guān)的引用。 這篇文章介紹了提供此類功能的JUnit 規(guī)則 ,并說(shuō)明了如何使用它。

首先,請(qǐng)看以下示例。 它描述了一個(gè)導(dǎo)致testB間歇性故障的testB 。 原因是結(jié)果取決于副作用1導(dǎo)致的所有測(cè)試的執(zhí)行順序。 更精確地說(shuō), Display.getDefault()原則上返回延遲實(shí)例化的單例,而Display.getCurrent()是此單例的簡(jiǎn)單訪問(wèn)器。 結(jié)果,如果testB在testA 2之后運(yùn)行,則它失敗。

public class FooTest {@Testpublic void testA() {Display actual = Display.getDefault();assertThat( actual ).isNotNull();}@Testpublic void testB() {Display actual = Display.getCurrent();assertThat( actual ).isNull();} }

為了避免出現(xiàn)幕后魔術(shù),這種魔術(shù)會(huì)使代碼難以理解,我們可以確保在實(shí)際測(cè)試執(zhí)行之前就放置了現(xiàn)有的顯示器3

@Beforepublic void setUp() {if( Display.getCurrent() != null ) {Display.getCurrent().dispose();}}

不幸的是,這種方法不能在運(yùn)行PDE測(cè)試的集成測(cè)試套件中使用。 PDE運(yùn)行時(shí)將創(chuàng)建一個(gè)Display實(shí)例,其生存期跨越所有測(cè)試運(yùn)行。 因此,顯示處置將不是一個(gè)選擇,并且testB在PDE測(cè)試套件執(zhí)行期間testB會(huì)失敗4

此時(shí),請(qǐng)務(wù)必記住, Display單例已綁定到其創(chuàng)建線程(準(zhǔn)ThreadLocal ) 5 。 因此,如果在自己的線程中執(zhí)行,則testB應(yīng)該運(yùn)行可靠。

但是,線程處理通常充其量是比較麻煩的,并且會(huì)造成很多混亂,從而降低了測(cè)試方法的可讀性。 這給了我創(chuàng)建一個(gè)TestRule實(shí)現(xiàn)的想法,該實(shí)現(xiàn)封裝了線程處理并保持測(cè)試代碼干凈:

public class FooTest {@Rulepublic RunInThreadRule runInThread = new RunInThreadRule();@Testpublic void testA() {Display actual = Display.getDefault();assertThat( actual ).isNotNull();}@Test@RunInThreadpublic void testB() {Display actual = Display.getCurrent();assertThat( actual ).isNull();} }

RunInThreadRule類允許在其自己的線程中運(yùn)行單個(gè)測(cè)試方法。 它負(fù)責(zé)守護(hù)程序線程的創(chuàng)建,測(cè)試執(zhí)行,等待線程終止以及將測(cè)試結(jié)果轉(zhuǎn)發(fā)到主線程。 為了將測(cè)試標(biāo)記為在單獨(dú)的線程中運(yùn)行,測(cè)試方法必須使用@RunInThread注釋,如上所示。

這樣, testB現(xiàn)在就獨(dú)立于測(cè)試的執(zhí)行順序,并且成功可靠。 但是請(qǐng)注意不要過(guò)度使用RunInThreadRule 。 盡管@RunInThread批注表示測(cè)試在單獨(dú)的線程中運(yùn)行,但未解釋原因。 這可能很容易混淆這種測(cè)試的真實(shí)范圍。 因此,我通常僅將此作為萬(wàn)不得已的解決方案。 例如,當(dāng)?shù)谌綆?kù)依賴于無(wú)法通過(guò)API功能清除或重置的封裝ThreadLocal ,這可能是合理的。

對(duì)于那些想了解RunInThreadRule實(shí)現(xiàn)的人,我創(chuàng)建了一個(gè)GitHub gist:

https://gist.github.com/fappel/65982e5ea7a6b2fde5a3

對(duì)于現(xiàn)實(shí)世界的使用,您還可以查看托管在以下位置的Gonsole項(xiàng)目的PgmResourceBundlePDETest實(shí)現(xiàn):

https://github.com/rherrmann/gonsole 。

  • 請(qǐng)注意,默認(rèn)情況下,JUnit以確定性但不可預(yù)測(cè)的順序?qū)y(cè)試方法進(jìn)行排序
  • 還考慮testA可能在另一個(gè)測(cè)試用例中并且僅在運(yùn)行大型套件時(shí)才會(huì)出現(xiàn)問(wèn)題的可能性
  • 再說(shuō)一次,我也不喜歡這種做法,因此,對(duì)于更復(fù)雜的解決方案,您可以查看一下“簡(jiǎn)化SWT測(cè)試設(shè)置的JUnit規(guī)則”一文。
  • 同時(shí),您可能已經(jīng)認(rèn)識(shí)到,簡(jiǎn)單的示例測(cè)試用例不是很有用,但我希望足以說(shuō)明動(dòng)機(jī)。
  • 這使這樣的線程成為SWT中的用戶界面線程。 SWT實(shí)現(xiàn)通常稱為單元線程的單線程UI模型
  • 翻譯自: https://www.javacodegeeks.com/2014/07/a-junit-rule-to-run-a-test-in-its-own-thread.html

    junit測(cè)試線程

    總結(jié)

    以上是生活随笔為你收集整理的junit测试线程_一个在自己的线程中运行测试的JUnit规则的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。