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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个在自己的线程中运行测试的JUnit规则 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有時,能夠在單獨的線程中運行JUnit測試會很有幫助。 特別是在編寫與封裝的ThreadLocal或類似對象交互的集成測試時,這可能會派上用場。 單獨的線程將隱式確保每次測試運行都未初始化threadlocal的與線程相關的引用。 這篇文章介紹了提供此類功能的JUnit 規則 ,并說明了如何使用它。

首先,請看以下示例。 它描述了一個導致testB間歇性故障的testB 。 原因是結果取決于副作用1導致的所有測試的執行順序。 更準確地說, Display.getDefault()原則上返回延遲實例化的單例,而Display.getCurrent()是此單例的簡單訪問器。 結果,如果testB在testA 2之后運行,則它失敗。

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

為了避免出現幕后魔術,這種魔術會使代碼難以理解,我們可以確保在實際測試執行之前就放置了現有的顯示器3

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

不幸的是,這種方法不能在運行PDE測試的集成測試套件中使用。 PDE運行時創建一個Display實例,該實例的生命周期跨越所有測試運行。 因此,顯示處置將不是一個選擇,并且testB在PDE測試套件執行期間testB會失敗4

此時,請務必記住, Display單例已綁定到其創建線程(準ThreadLocal ) 5 。 因此,如果在自己的線程中執行,則testB應該運行可靠。

但是,線程處理通常最好情況下比較麻煩,并且會造成很多混亂,從而降低了測試方法的可讀性。 這給了我創建一個TestRule實現的想法,該實現封裝了線程處理并保持測試代碼干凈:

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類允許在其自己的線程中運行單個測試方法。 它負責守護程序線程的創建,測試執行,等待線程終止以及將測試結果轉發到主線程。 為了將測試標記為在單獨的線程中運行,必須使用@RunInThread注釋測試方法,如上所示。

有了這個適當的位置, testB現在就獨立于測試的執行順序,并且成功可靠。 但是請注意不要過度使用RunInThreadRule 。 盡管@RunInThread批注表示測試在單獨的線程中運行,但未解釋原因。 這可能很容易混淆這種測試的真實范圍。 因此,我通常僅將此作為最后的解決方案。 例如,當第三方庫依賴于無法通過API功能清除或重置的封裝ThreadLocal ,這可能是合理的。

對于那些想了解RunInThreadRule實現的人,我創建了一個GitHub要點:

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

對于現實世界的使用,您還可以查看托管在以下位置的Gonsole項目的PgmResourceBundlePDETest實現:

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

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

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。