1. 程式人生 > >Junit單元測試不支援多執行緒測試--原因分析和問題解決

Junit單元測試不支援多執行緒測試--原因分析和問題解決

問題現象

  1. import org.junit.Test;
  2. /**
  3. * @Title: junit多執行緒測試
  4. * @ClassName: JunitMultiThreadTest.java
  5. * @Description:
  6. *
  7. * @Copyright 2016-2018 - Powered By 研發中心
  8. * @author:
  9. * @date: 2018-01-30 19:31
  10. * @version V1.0
  11. */
  12. publicclassJunitMultiThreadTest{
  13. privateint i =5;
  14. @Test
  15. publicvoid test(){
  16. for(int i =0; i <this.i
    ; i ++){
  17. newThread(newRunner(),"JUNIT多執行緒測試").start();
  18. }
  19. }
  20. classRunner implements Runnable{
  21. @Override
  22. publicvoid run(){
  23. System.out.println("【當前執行緒ID】:"+Thread.currentThread().getId());
  24. }
  25. }
  26. }
輸出結果
  1. 【當前執行緒ID】:13
  • 多次執行,要麼沒有任何輸出結果,要麼輸出補全

原因分析

  • TestRunner原始碼:
  1. publicstaticfinalint SUCCESS_EXIT =0;
  2. public
    staticfinalint FAILURE_EXIT =1;
  3. publicstaticfinalint EXCEPTION_EXIT =2;
  4. publicstaticvoid main(String args[]){
  5. TestRunner aTestRunner=newTestRunner();
  6. try{
  7. TestResult r= aTestRunner.start(args);
  8. if(!r.wasSuccessful())
  9. System.exit(FAILURE_EXIT);
  10. System.exit(SUCCESS_EXIT);
  11. }catch(Exception e){
  12. System.
TestResult類
  1. /**
  2. * Returns whether the entire test was successful or not.
  3. */
  4. publicsynchronizedboolean wasSuccessful(){
  5. return failureCount()==0&& errorCount()==0;
  6. }
  1. 在這裡我們明顯可以看到:
  2. aTestRunner呼叫start方法後不會去等待子執行緒執行完畢在關閉主執行緒,而是直接呼叫TestResult.wasSuccessful()方法,
  3. 當這個方法返回的是false,主執行緒接下來就會執行System.exit
  4. 這個放回會結束當前執行的jvm虛擬機器,所以使用junit測試多執行緒方法的結果異常就正常了;

問題解決

  1. 想要正常輸出的話可以讓主執行緒不要結束,等待子執行緒全部執行結束後在結束主執行緒,輸出結果就會正常

解決方式1

  1. Thread.sleep();
  1. import org.junit.Test;
  2. /**
  3. * @Title: junit多執行緒測試
  4. * @ClassName: JunitMultiThreadTest.java
  5. * @Description:
  6. *
  7. * @Copyright 2016-2018 - Powered By 研發中心
  8. * @author:
  9. * @date: 2018-01-30 19:31
  10. * @version V1.0
  11. */
  12. publicclassJunitMultiThreadTest{
  13. privateint i =5;
  14. @Test
  15. publicvoid test() throws InterruptedException{
  16. for(int i =0; i <this.i; i ++){
  17. newThread(newRunner(),"JUNIT多執行緒測試").start();
  18. }
  19. Thread.sleep(100000);
  20. }
  21. classRunner implements Runnable{
  22. @Override
  23. publicvoid run(){
  24. System.out.println("【當前執行緒ID】:"+Thread.currentThread().getId());
  25. }
  26. }
  27. }
  1. 【當前執行緒ID】:11
  2. 【當前執行緒ID】:15
  3. 【當前執行緒ID】:12
  4. 【當前執行緒ID】:14
  5. 【當前執行緒ID】:13

解決方式2

  1. 執行緒計數器CountDownLatch
  1. import org.junit.Test;
  2. import java.util.concurrent.CountDownLatch;
  3. /**
  4. * @Title: junit多執行緒測試
  5. * @ClassName: JunitMultiThreadTest.java
  6. * @Description:
  7. *
  8. * @Copyright 2016-2018 - Powered By 研發中心
  9. * @author:
  10. * @date: 2018-01-30 19:31
  11. * @version V1.0
  12. */
  13. publicclassJunitMultiThreadTest{
  14. privateint i =5;
  15. /*
  16. * 執行緒計數器
  17. * 將執行緒數量初始化
  18. * 每執行完成一條執行緒,呼叫countDown()使計數器減1
  19. * 主執行緒呼叫方法await()使其等待,當計數器為0時才被執行
  20. */
  21. privateCountDownLatch latch =newCountDownLatch(i);
  22. @Test
  23. publicvoid test() throws InterruptedException{
  24. for(int i =0; i <this.i; i ++){
  25. newThread(newRunner(),"JUNIT多執行緒測試").start();
  26. }
  27. try{
  28. latch.await();// 主執行緒等待
  29. }catch(InterruptedException e){
  30. e.printStackTrace();
  31. }
  32. }
  33. 相關推薦

    Junit單元測試支援執行測試--原因分析問題解決

    問題現象 import org.junit.Test;/** * @Title: junit多執行緒測試 * @ClassName: JunitMultiThreadTest.java *

    [C#原始碼]網路資料流讀寫封裝類,支援執行下同時讀寫,自動資源管理,字串分隔符\r\n

    using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using Syst

    7. 執行併發相關問題解決技巧

    一. 如何使用多執行緒 實際案例 https://intrinio.com/tutorial/web_api 我們通過上述網站提供的API獲取了股市資訊的CSV資料, 現在要下載大量CSV資料檔案, 並將其轉化為xml檔案 如何使用執行緒來提高下載並處理的效率? 解決方案

    Junit單元執行測試執行執行

    Junit單元測試子執行緒不執行 環境 - Junit:4 - jdk:1.8 1、現象描述 在測試CountDownLatch類時,使用main函式能夠正常執行的功能,改用Junit測試時,Debug除錯時不進入子執行緒執行,直接執行時,有時候能

    Live555 的一個缺陷--例子支援執行(已經修改成支援執行)

    1)我對Live555進行了一次封裝,但是Live555 是單執行緒的,裡面定義的全域性變數太多,我封裝好dll庫後,在客戶端呼叫,因為多個對話方塊中要使用碼流,我就定義了多個物件從裝置端接收碼流,建立多個連線,但是當一路碼流退出,然後在退出另外的一路碼流時,庫裡面出現問題

    怎麼使用Junit進行執行測試

    Junit本身是不支援普通的多執行緒測試的,這是因為Junit的底層實現上,是用System.exit退出用例執行的,主執行緒終止jvm都停了,其他執行緒肯定執行不了了(具體分析檢視原始碼org.junit.runner.JUnitCore)。 本文介紹一款第

    Java 單元測試中的執行無故退出

    原文:https://my.oschina.net/heweipo/blog/497176 問題發現 最近在複習多執行緒相關知識,結果一動手就出現了問題,問題是這樣的,在單元測試中使用多執行緒測試,發現只要子執行緒在睡眠一段時間,程式就退出了,毫無徵兆!!!! 看看

    spring-junit執行測試

    使用junit進行單元測試的時候,並不能對多執行緒的操作進行測試。一般情況下是使用main方法來進行測試。但如果專案需要載入大量的配置的情況下,測試類寫起來很複雜,需要去寫載入各種配置檔案的程式碼

    為什麼當前大多數應用程式是執行的,為什麼要使用支援執行的庫

    原文 http://www.nynaeve.net/?p=198         大部分的Win32 程式在執行的時候,其程序中至少有一段時間是超過一個執行緒的,儘管有時程式沒有明確的建立一個執行緒。這是因

    【學習筆記】Java-Concurrent-執行測試模板

    import java.util.concurrent.CountDownLatch; /** * 多執行緒測試模板 * * @author Mairuis * @date 2018/10/11 */ public class ConcurrentTest { public s

    XUtils開源框架的使用(HttpUtils支援執行斷點續傳)

    XUtils專案下載地址:https://github.com/wyouflf/xUtils •XUtils中包含的四大模組: 1、DbUtils模組 2、ViewUtils模組 3、HttpUtils模組: ◦支援同步,非同步方式的請求; ◦支援大檔案上傳,上傳大檔案不會oom

    執行測試程式碼

    package com.yy.read;import java.util.HashSet;import java.util.List;import java.util.Random;import java.util.Set;import java.util.concurrent.Callable

    TestNG執行測試-用xml檔案實現

    MultiThreadOnXml類: package com.janson.multiThread; import org.testng.annotations.Test; public class MultiThreadOnXml { @Test public void tes

    Qt下實現支援執行的單例模式

    1. 程式碼介紹 實現單例模式的程式碼很多。 本文的單例模式實現程式碼是本人一直在工程專案中使用的,現拿出和大家交流分享。 本文實現的單例模式,支援多執行緒,採用雙重校驗檢索的方式,整合析構類,杜絕記憶體洩漏,穩定性好。 使用C++/Qt的朋友們可以瞭解一下。 不再廢話,直接上程式碼。

    java ftp支援 執行與否總結

    問題發生的直觀描述:在使用者用Bootstarp Fileinput通過非同步的方式上傳多張圖片檔案至ftp時出現檔案有的成功,有的失敗。完全隨機的。 debug結論:在FtpClient.storeFile()時報connect is not open 的IO異常有的還有connect

    Messengeraidl的關係&aidl支援執行嗎,messenger呢

    1 Messenger封裝了Aidl,使用時不用再寫aidl,其實是原始碼中已經寫好了aidl: IMessenger.aidl. package android.os; import android.os.Message; /** @hide */ o

    scala actor 執行測試

    package com.Actor import java.io.File import scala.actors.Actor import scala.io.Source /** * author pg * date 2018-12-17 */ //本程式是用scala 原生的a

    Java-Concurrent-執行測試模板

    import java.util.concurrent.CountDownLatch; /** * 多執行緒測試模板 * * @author Mairuis * @date 2018/10/11 */ public class ConcurrentTest {

    我用java寫的搶紅包用的紅包類,支援執行

    import java.util.concurrent.atomic.AtomicInteger; public class CashGift { public static class OverException extends Exception { }

    讓libevent支援執行

    libevent的使用方式是最開始呼叫event_init初始化一個全域性的event_base指標,以後使用其中的API新增新的事件均是對這個指標進行的操作.試想如下一種典型的場景:主執行緒使用libevent處理網路IO事件,接收新連線以及接收完客戶端的資料之後將該事件交給輔助執行緒進行處理,輔助