junit测试线程_一个在自己的线程中运行测试的JUnit规则
junit測試線程
有時,能夠在單獨的線程中運行JUnit測試會很有幫助。 特別是在編寫與封裝的ThreadLocal或類似對象進行交互的集成測試時,這可能會派上用場。 單獨的線程將隱式確保每次測試運行都未初始化threadlocal的與線程相關(guān)的引用。 這篇文章介紹了提供此類功能的JUnit 規(guī)則 ,并說明了如何使用它。
首先,請看以下示例。 它描述了一個導致testB間歇性故障的testB 。 原因是結(jié)果取決于副作用1導致的所有測試的執(zhí)行順序。 更精確地說, Display.getDefault()原則上返回延遲實例化的單例,而Display.getCurrent()是此單例的簡單訪問器。 結(jié)果,如果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();} }為了避免出現(xiàn)幕后魔術(shù),這種魔術(shù)會使代碼難以理解,我們可以確保在實際測試執(zhí)行之前就放置了現(xiàn)有的顯示器3 。
@Beforepublic void setUp() {if( Display.getCurrent() != null ) {Display.getCurrent().dispose();}}不幸的是,這種方法不能在運行PDE測試的集成測試套件中使用。 PDE運行時將創(chuàng)建一個Display實例,其生存期跨越所有測試運行。 因此,顯示處置將不是一個選擇,并且testB在PDE測試套件執(zhí)行期間testB會失敗4 。
此時,請務必記住, Display單例已綁定到其創(chuàng)建線程(準ThreadLocal ) 5 。 因此,如果在自己的線程中執(zhí)行,則testB應該運行可靠。
但是,線程處理通常充其量是比較麻煩的,并且會造成很多混亂,從而降低了測試方法的可讀性。 這給了我創(chuàng)建一個TestRule實現(xiàn)的想法,該實現(xiàn)封裝了線程處理并保持測試代碼干凈:
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類允許在其自己的線程中運行單個測試方法。 它負責守護程序線程的創(chuàng)建,測試執(zhí)行,等待線程終止以及將測試結(jié)果轉(zhuǎn)發(fā)到主線程。 為了將測試標記為在單獨的線程中運行,測試方法必須使用@RunInThread注釋,如上所示。
這樣, testB現(xiàn)在就獨立于測試的執(zhí)行順序,并且成功可靠。 但是請注意不要過度使用RunInThreadRule 。 盡管@RunInThread批注表示測試在單獨的線程中運行,但未解釋原因。 這可能很容易混淆這種測試的真實范圍。 因此,我通常僅將此作為萬不得已的解決方案。 例如,當?shù)谌綆煲蕾囉跓o法通過API功能清除或重置的封裝ThreadLocal ,這可能是合理的。
對于那些想了解RunInThreadRule實現(xiàn)的人,我創(chuàng)建了一個GitHub gist:
https://gist.github.com/fappel/65982e5ea7a6b2fde5a3
對于現(xiàn)實世界的使用,您還可以查看托管在以下位置的Gonsole項目的PgmResourceBundlePDETest實現(xiàn):
https://github.com/rherrmann/gonsole 。
翻譯自: https://www.javacodegeeks.com/2014/07/a-junit-rule-to-run-a-test-in-its-own-thread.html
junit測試線程
總結(jié)
以上是生活随笔為你收集整理的junit测试线程_一个在自己的线程中运行测试的JUnit规则的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓淘汰32位应用(安卓淘汰)
- 下一篇: 带有HttpClient的自定义HTTP