今天下午很快完成了乙個介面的監控功能,然後屁顛屁顛地用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原始碼就知道了
publicstatic
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 listffailuresprotected 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...