Junit單元測試多執行緒的問題

2022-09-08 04:45:12 字數 2156 閱讀 1336

今天下午很快完成了乙個介面的監控功能,然後屁顛屁顛地用junit開始單元測試。然後我就開始陷入崩潰的邊緣...

監控結束後需要將監控結果以郵件的形式傳送給運營的小夥伴維護,前面測試還是很順利,到了開多執行緒發郵件時就不行了,

程式也不報錯,也接收不到郵件。然後改**再測試,再冥思一會兒,再改再測試,還是無果,最後選擇度娘一下,結論是:

junit單元測試不支援多執行緒

然後,整個人都不好了...浪費了我好多時間,就是因為這個!!!

雖然知道了結果,但是筆者還是需要親自驗證一下。

/**

* @title: testdowork.j**a

* @describe:

* @author

: mr.yanphet

* @email: [email protected]

* @date: 2023年8月15日 下午5:50:03

* @version

: 1.0 */

public

class

testdowork }}

@test

public

void

test()

}

輸出結果如下(筆者省略了部分輸出):

.....

i=751,millisecond=1471257586416i=752,millisecond=1471257586416i=753,millisecond=1471257586416i=754,millisecond=1471257586416i=755,millisecond=1471257586416i=756,millisecond=1471257586416i=757,millisecond=1471257586416i=758,millisecond=1471257586416

從結果可以看到,迴圈到了759次後就沒再輸出了,說明子執行緒還沒結束任務,整個程式就被強迫結束了。

既然知道了現象,那麼為什麼會出現這樣的現象呢,貼出部分junit4 testrunner原始碼就知道了

public

static

final

int success_exit = 0;

public

static

final

int failure_exit = 1;

public

static

final

int exception_exit = 2;

public

static

void

main(string args)

catch

(exception e)

}

再貼上testresult部分原始碼,以供參考

protected  listffailures

protected listferrors

public

synchronized

boolean

wassuccessful()

public

synchronized

interrorcount()

public

synchronized

intfailurecount()

在testrunner中可以看出,如果是單執行緒,當測試主線程執行結束後,不管子執行緒是否結束,都會**testresult的wassuccessful方法,

然後判斷結果是成功還是失敗,最後呼叫相應的system.exit()方法。大家都知道這個方法是用來結束當前正在執行中的j**a虛擬機器,jvm都自身難保了,所以子執行緒也就對不住你咧...

解決辦法:

1 簡單粗暴地讓主線程休眠一段時間,然後讓子執行緒能夠執行結束。但是這個方法的弊端是,你不知道子執行緒的執行時間,所以需要看臉=_=

thread.sleep();

2 使用countdownlatch工具類,讓主線程阻塞,直到子執行緒執行結束或者阻塞超時,這個方法要比第乙個方法好點。

countdownlatch.await(5, timeunit.minutes);

至於還有其他方法,筆者看到很多大神自己寫的junit支援多執行緒,有興趣的讀者自行度娘...

Junit單元測試時碰上了多執行緒問題

今天在做多執行緒功能的時候,用junit做測試的時候發現,其他的執行緒默默的跑了一會就直接不見了,檢查了半天發現 也沒有出問題,也沒有異常,就是莫名其妙的不見了!哇!又是乙個坑!然後屁顛屁顛的去查了一下問題,發現junit根本就不支援多執行緒,底層的 在跑完自己之後,直接就關閉了,根本就不管別的執行...

JUnit單元測試中多執行緒的坑

junit單元測試方法不輸出 在junit的 test方法中啟用多執行緒,新啟動的執行緒會隨著 test主線程的死亡而不輸出 test public void testmultithread catch interruptedexception e thread.start try catch in...

junit單元測試不支援多執行緒測試

今天看 高併發 書,寫了乙個多執行緒的類,發現測試方法輸出的結果並不對 同樣的 經過main方法後輸出的結果卻是正常的 經過研究後發現單元測試 test並不支援多執行緒測試 以下為分析過程 private static executorservice ex executors.newfixedthr...