今天看《高併發》書,寫了乙個多執行緒的類,發現測試方法輸出的結果並不對;
同樣的**,經過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測試,在程勳...