亚洲好骚综合-亚洲黄色录像-亚洲黄色网址-亚洲黄色网址大全-99久久99久久-99久久99久久精品国产

您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 > junit
Junit單元測試多線程的問題
作者:Mr.Yanphet 發布時間:[ 2016/8/18 11:24:34 ] 推薦標簽:多線程 Junit 單元測試

  下午很快完成了一個接口的監控功能,然后屁顛屁顛地用Junit開始單元測試。然后我開始陷入崩潰的邊緣...
  監控結束后需要將監控結果以郵件的形式發送給運營的小伙伴維護,前面測試還是很順利,到了開多線程發郵件時不行了,
  程序也不報錯,也接收不到郵件。然后改代碼再測試,再冥思一會兒,再改再測試,還是無果,后選擇度娘一下,結論是:
  Junit單元測試不支持多線程
  然后,整個人都不好了...浪費了我好多時間,是因為這個!!
  雖然知道了結果,但是筆者還是需要親自驗證一下。
/**
* @Title: TestDoWork.java
* @Describe:
* @author: Mr.Yanphet
* @Email: mr_yanphet@163.com
* @date: 2016年8月15日 下午5:50:03
* @version: 1.0
*/
public class TestDoWork {
class DoWork implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
long milliSecond = System.currentTimeMillis();
System.out.println("i=" + i + ",milliSecond=" + milliSecond);// 輸出循環次數和當前的系統時間
}
}
}
@Test
public void test() {
DoWork dw = new DoWork();
Thread t = new Thread(dw);
t.start();
}
}
  輸出結果如下(筆者省略了部分輸出):
  .....
  i=751,milliSecond=1471257586416
  i=752,milliSecond=1471257586416
  i=753,milliSecond=1471257586416
  i=754,milliSecond=1471257586416
  i=755,milliSecond=1471257586416
  i=756,milliSecond=1471257586416
  i=757,milliSecond=1471257586416
  i=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[]) {
TestRunner aTestRunner = new TestRunner();
try {
TestResult r = aTestRunner.start(args);
if (!r.wasSuccessful())
System.exit(FAILURE_EXIT);
System.exit(SUCCESS_EXIT);
} catch (Exception e) {
System.err.println(e.getMessage());
System.exit(EXCEPTION_EXIT);
}
}
  再貼上TestResult部分源碼,以供參考
protected  List<TestFailure>    fFailures
protected  List<TestFailure>    fErrors
public synchronized boolean wasSuccessful() {
return failureCount() == 0 && errorCount() == 0;
}
public synchronized int errorCount() {
return fErrors.size();
}
public synchronized int failureCount() {
return fFailures.size();
}
  在TestRunner中可以看出,如果是單線程,當測試主線程執行結束后,不管子線程是否結束,都會回調TestResult的wasSuccessful方法,
  然后判斷結果是成功還是失敗,后調用相應的System.exit()方法。大家都知道這個方法是用來結束當前正在運行中的java虛擬機,jvm都
  自身難保了,所以子線程也對不住你咧...
  解決辦法:
  1 簡單粗暴地讓主線程休眠一段時間,然后讓子線程能夠運行結束。但是這個方法的弊端是,你不知道子線程的運行時間,所以需要看臉=_=
  Thread.sleep();
  2 使用CountDownLatch工具類,讓主線程阻塞,直到子線程運行結束或者阻塞超時,這個方法要比第一個方法好點。
  countDownLatch.await(5, TimeUnit.MINUTES);
  至于還有其他方法,筆者看到很多大神自己寫的Junit支持多線程,有興趣的讀者自行度娘...

軟件測試工具 | 聯系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網站地圖
滬ICP備07036474 2003-2017 版權所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd
主站蜘蛛池模板: 欧美最新一区二区三区四区 | 欧美日韩一二三区 | 亚洲成人一级 | 亚洲操片| 日本黄在线 | 久久99操 | 欧美日韩一区二区三区免费不卡 | 韩国伦理片在线免费观看 | 欧美一区二三区 | 涩涩漫画入口 | 羞羞人成午夜爽爽影院 | 九九热在线精品视频 | 亚洲综合九九 | 亚洲日本视频在线观看 | 欧美xxxx新一区二区三区 | 狠狠色丁香久久婷婷综合五月 | 中文字幕欧美亚洲 | 国产精品久久久久久亚洲伦理 | 欧美特黄一级大黄录像 | 国产丝袜美女 | 欧美第一页在线 | 亚洲三级黄色 | 看黄网站在线看 | 波多野结衣亚洲 | 国产手机精品视频 | 五月激情六月丁香 | 欧美成人三级网站 | 欧美五月激情 | 欧美国产日韩在线播放 | 第九色激情 | 人人爽人人拍 | 日本欧美人xxxxx在线观看 | 亚洲人成黄网在线观看 | 午夜欧美激情 | 很很色在线视频 | 天天上天天干 | 日韩美女在线观看 | 久国产视频 | 国产成人欧美一区二区三区的 | 欧美日本一区二区三区 | 一级黄色大片免费 |