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

2021-07-31 23:29:18 字數 2191 閱讀 3963

今天看《高併發》書,寫了乙個多執行緒的類,發現測試方法輸出的結果並不對;

同樣的**,經過main方法後輸出的結果卻是正常的;經過研究後發現單元測試@test並不支援多執行緒測試;以下為分析過程:

private static executorservice ex = executors.newfixedthreadpool(5);

public static class mytask implements runnable catch (interruptedexception e)

} }/**

* @discription 這個測試類只能輸出5條執行緒資料,原因為在@test的junit_jar包中testrunner方法有個特性:當測試類的主線程完成後回直接關閉jvm(system.exit),不會等待子執行緒執行完;所以主線程會在第一批執行緒處理完成後直接退出

* @author liu_l

* @created 2023年5月12日 上午10:21:26

* @throws interruptedexception

*/@test

public void test() throws interruptedexception

}

輸出結果為:

time:1494558540525____threadid:10

time:1494558540525____threadid:11

time:1494558540525____threadid:12

time:1494558540526____threadid:13

time:1494558540526____threadid:14

time:1494558751747____threadid:9

time:1494558751747____threadid:11

time:1494558751747____threadid:10

time:1494558751747____threadid:12

time:1494558751747____threadid:13

time:1494558752747____threadid:10

time:1494558752747____threadid:11

time:1494558752747____threadid:9

time:1494558752747____threadid:13

time:1494558752747____threadid:12

那麼問題來了,why?這時候我想起來看下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類:
/**

* returns whether the entire test was successful or not.

*/public synchronized boolean wassuccessful()

在這裡我們明顯可以看到:當atestrunner呼叫start方法後不會去等待子執行緒執行完畢在關閉主線程,而是直接呼叫testresult.wassuccessful()方法,而這個方法始終返回的是false,所以主線程接下來就會執行system.exit,這個放回會結束當前執行的jvm虛擬機器,所以使用junit測試多執行緒方法的結果異常就正常了;

(ps:想要正常輸出的話可以讓主線程不要結束,等待子執行緒全部執行結束後在結束主線程,輸出結果就會正常,下面會junit測試多執行緒正常輸出的方法:`@test

public void test1() throws interruptedexception

thread.sleep(100000);

}`)

junit不支援多執行緒

昨天學習redis的時候嘗試去寫一些測試用例,結果嘗試模擬生產者消費者模式的時候出問題了,沒有資料插入到redis,於是上來發了個問答 今天在用junit寫多執行緒的時候也出現了這個問題,頓時恍然大悟 莫非是junit的問題,上網搜了一下果然如此 原因 junit的原始碼 public static...

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

今天下午很快完成了乙個介面的監控功能,然後屁顛屁顛地用junit開始單元測試。然後我就開始陷入崩潰的邊緣.監控結束後需要將監控結果以郵件的形式傳送給運營的小夥伴維護,前面測試還是很順利,到了開多執行緒發郵件時就不行了,程式也不報錯,也接收不到郵件。然後改 再測試,再冥思一會兒,再改再測試,還是無果,...

Junit 測試不支援多執行緒踩記及解決方案

背景 下面模擬下junit測試不支援多執行緒的場景.import org.junit.jupiter.api.test public class junitdemo class runner implements runnable 多次執行上述程式,會發現不會列印出10行結果。junit測試,在程勳...