您的位置:軟件測(cè)試 > 開源軟件測(cè)試 > 開源單元測(cè)試工具 > junit
擴(kuò)展JUnit測(cè)試并行程序
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2016/6/16 16:25:39 ] 推薦標(biāo)簽:單元測(cè)試 軟件測(cè)試工具

  測(cè)試并行程序與以往有什么不同 ?
  隨著多核的普及,并行程序的開發(fā)已經(jīng)提上日程。相對(duì)串行程序而言,并行程序更有可能出錯(cuò)。一方面,并行程序的執(zhí)行序列具有很強(qiáng)的隨機(jī)性,線程交錯(cuò)執(zhí)行的序列可能每次都不一樣,而只要一個(gè)序列有問題,整個(gè)程序是不正確的。另一方面,并行程序?qū)Υ蠖鄶?shù)程序員來說,都是一個(gè)新的領(lǐng)域,經(jīng)驗(yàn)相對(duì)較少,這是容易出錯(cuò)的另外一個(gè)因素。
  既然如此,我們更需要仔細(xì)的測(cè)試我們的并行程序和組件了。目前已經(jīng)有一些 JUnit 擴(kuò)展可以創(chuàng)建多個(gè)線程,同時(shí)運(yùn)行多個(gè)測(cè)試用例,從而加快測(cè)試用例集的執(zhí)行速度,如 p-unit 。但對(duì)于測(cè)試并行程序和組件,這些功能并不能滿足所有的需求。因?yàn)殚_發(fā)人員通常希望可以精確地控制多個(gè)線程之間的同步。
  與測(cè)試順序程序相同,我們希望能在測(cè)試并行操作之前,首先準(zhǔn)備一些測(cè)試數(shù)據(jù)。然后,啟動(dòng)多個(gè)線程測(cè)試執(zhí)行不同的操作。后,等待所有線程結(jié)束之后,檢驗(yàn)結(jié)果的正確性。在第二階段中,多個(gè)線程能以任意的次序交錯(cuò)執(zhí)行。結(jié)果的正確性檢查應(yīng)與線程的執(zhí)行測(cè)序無關(guān)。
  標(biāo)準(zhǔn) JUnit 只捕捉來自主線程的 Exception 。而其他線程中產(chǎn)生的 Exception 則會(huì)安靜地被忽略掉,使得我們?cè)谧泳程運(yùn)行出錯(cuò)的情況下仍舊能得到“ Green Bar ”。這顯然不是程序員喜歡的測(cè)試行為,我們希望測(cè)試結(jié)果能正確地反映所有線程的運(yùn)行結(jié)果。
  這種用于并行程序的測(cè)試模式會(huì)在測(cè)試并行程序時(shí)會(huì)不斷的重復(fù)。如果開發(fā)人員每次都需要重復(fù)創(chuàng)建這些框架,不僅繁瑣,而且容易引入錯(cuò)誤。通過使用以下介紹的簡(jiǎn)單擴(kuò)展,可以使并行程序的測(cè)試變得和順序程序一樣簡(jiǎn)單。這種擴(kuò)展并不影響 JUnit 的其他特性以及各種 IDE 的 JUnit 插件的使用。
  下載并使用擴(kuò)展框架
  首先,我們給出一個(gè)使用新擴(kuò)展進(jìn)行并行測(cè)試的例子。
  例 1. 使用 JUnit 擴(kuò)展進(jìn)行并行測(cè)試
  /**
  * @author Zhi Gan
  *
  */
  @RunWith(Parallelized.class)
  @ParallelSetting(threadNumber = { 1, 2, 4, 8 })
  public class TestThreaded {
  Set<String> strSet;
  @Before
  public void setUp() {
  strSet = new LockFreeSet();
  }
  @Test
  public void doNothing() {
  }
  @InitFor("testThread")
  public void putSomeData(int size){
  strSet.add("putSomeData");
  }
  @Threadedpublic void testThread(int rank, int size) {
  // every thread adds element to set
  strSet.add("abcde" + rank);
  }
  @CheckFor("testThread")
  public void checkResult(int size) {
  assertEquals(size+1, strSet.size());
  }
  public static void main(String[] args) {
  for (int i = 0; i < 10; i++)
  JUnitCore.runClasses(TestThreaded.class);
  }
  }
  如果我們?cè)?Eclipse 中運(yùn)行測(cè)試,那么測(cè)試完畢之后的 JUnit 視圖如下所示:
  圖 1. 并行測(cè)試的完成結(jié)果

  Sample figure containing an image
  接下來,我們模擬子線程在運(yùn)行時(shí)拋出異常。
  例 2. 子線程運(yùn)行時(shí)異常
  /**
  * @author Zhi Gan
  *
  */
  @RunWith(Parallelized.class)
  @ParallelSetting(threadNumber = { 1, 2, 4, 8 })
  public class TestThreaded {
  Set<String> strSet;
  @Before
  public void setUp() {
  strSet = new LockFreeSet();
  }
  @Test
  public void doNothing() {
  }
  @InitFor("testThread")
  public void putSomeData(int size){
  strSet.add("putSomeData");
  }
  @Threadedpublic void testThread(int rank, int size) {
  // throw a runtime error in spawned thread
  throw new RuntimeError();
  }
  @CheckFor("testThread")
  public void checkResult(int size) {
  assertEquals(size+1, strSet.size());
  }
  public static void main(String[] args) {
  for (int i = 0; i < 10; i++)
  JUnitCore.runClasses(TestThreaded.class);
  }
  }

上一頁(yè)12下一頁(yè)
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd