<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經轉移至github,大家請訪問 http://qaseven.github.io/

    單元性能測試之使用JUnitPerf測試多線程并發

    簡介:

      單元測試性能測試在測試領域屬于要求相對較高的測試活動,也是測試工程師成長、向上發展的反向。單元測試評測我們的代碼實現功能的情況,性能測試則企圖分析應用程序的性能表現和負載能力。那么“單元性能測試”能做什么?我們可以這樣說,單元性能測試以單元測試的形式對代碼進行性能測試。單元性能測試像單元測試一樣,需要測試人員編寫測試代碼,但現在關注的不是代碼的功能實現情況了,而是想得到被測試代碼的性能數據,包括執行方法耗時、多線程并發是否線程安全、內存是否泄漏、是否存在短期循環對象等。單元性能測試相對于系統性能測試更容易定位問題,對關鍵的方法進行測試,可以降低系統性能風險,減少系統集成后系統性能測試的工作量。本篇文檔演示如何使用JUnitPerf程序包對代碼進行多線程并發測試。

      待測代碼DateUtil:

      我們待測的程序代碼為com.loggingselenium.DateUtil類。這個類中有一個私有靜態成員timeFormator和一個靜態方法compareDateTime(String dateTime1, String dateTime2)。

    package com.loggingselenium;
    import java.util.Date;
    import java.text.SimpleDateFormat;
    public class DateUtil {
     private  static SimpleDateFormat timeFormator =
      new SimpleDateFormat("yyyyMMdd HH:mm:ss");
     public synchronized static int compareDateTime(String dateTime1, String dateTime2) {
      try {
       Date date1 = timeFormator.parse(dateTime1);
       Date date2 = timeFormator.parse(dateTime2);
       if (date1.before(date2))
        return -1;
       if (date1.after(date2))
        return 1;
       else
        return 0;
      } catch (Exception e) {
       throw new RuntimeException("解析日期時間格式出錯,期望的字符串格式為[yyyyMMdd HH:mm:ss]");
      }
     }
    }

      單元測試代碼UnitTestDateUtil:

      我們的測試代碼com.loggingselenium.UnitTestDateUtil如下:

    package com.loggingselenium;
    import junit.framework.TestCase;
    public class UnitTestDateUtil extends TestCase {
     protected void setUp() throws Exception {
      super.setUp();
     }
     protected void tearDown() throws Exception {
       super.tearDown();
     }
     public  void testCompareDateTime(){  
      String dateTime1="20120111 01:02:03";
      String dateTime2="20130111 01:02:03";
      String dateTime3="20130111 01:02:03";  
      assertEquals(-1, DateUtil.compareDateTime(dateTime1, dateTime2));
      assertEquals(1,  DateUtil.compareDateTime(dateTime2, dateTime1));
      assertEquals(0,  DateUtil.compareDateTime(dateTime2, dateTime3));
     }
    }

      經過運行單元測試代碼,可以驗證com.loggingselenium.DateUtil類的compareDateTime(String dateTime1, String dateTime2)的功能已經實現了,可以用來比較兩個日期時間的大小了。

      對方法進行多線程測試ThreadTestDateUtil

      雖然通過了單元測試,這個方法的功能實現了,但在多線程并發調用該方法的時候會出現拋出異常。手寫多線程并發測試代碼,com.loggingselenium.ThreadTestDateUtil繼承java.lang.Thread線程類,重新實現其run()方法,用于調用com.loggingselenium.DateUtil類的compareDateTime(String dateTime1, String dateTime2)。在main()方法中創建兩個線程并啟動線程執行調用日期時間比較的方法。

    package com.loggingselenium;
    public class ThreadTestDateUtil extends Thread {
     public void run() {
      int i1=DateUtil.compareDateTime("20130111 01:02:03","20130111 01:02:03");
      int i2=DateUtil.compareDateTime("20120111 01:02:03","20130111 01:02:03");
      System.out.println("i1="+i1);
      System.out.println("i2="+i2);
     }
     public static void main(String a[]) {  
      Thread t = new ThreadTestDateUtil();
      t.start();
      Thread t2 = new ThreadTestDateUtil();
      t2.start();
     }
    }

      編譯、運行該方法,控制臺報異常:

      java.lang.RuntimeException: 解析日期時間格式出錯,期望的字符串格式為[yyyyMMdd HH:mm:ss]

      at DateUtil.compareDateTime(DateUtil.java:43)

      at TestDateUtil2.run(TestDateUtil2.java:3)

      使用JUnitPerf進行多線程測試JUnitPerfTestDateUtil

      我們手寫多線程并發測試代碼的一個弊端是,如果我們需要測試100個線程,我們就需要創建100個線程實例Thread t,t1,t2,t3……并一一啟動這些線程。JunitPerf包可以幫助我們更容易對代碼進行多線程并發測試。

      首先,訪問http://www.clarkware.com/software/junitperf-1.9.1.zip下載我們需要的junitperf-1.9.1.jar,放到我們單元測試項目的構建路徑。

      在測試代碼com.loggingselenium. UnitTestDateUtil的基礎上進行修改,創建新測試類JUnitPerfTestDateUtil,以使用JunitPerf進行多線程并發測試。新測試類中compareDateTimeLoadTestMethod()實現以5個線程執行testCompareDateTime(),這個單元測試方法調用我們的日期時間比較方法。方法compareDateTimeLoadTestMethod()只會運行1次,會有5個線程運行方法testCompareDateTime(),等于有5個線程調用方法compareDateTime(String dateTime1, String dateTime2)。我們可以指定需要的線程數目,JunitPerf也提供了豐富的接口供我們選用。

    package com.loggingselenium;
    import com.clarkware.junitperf.LoadTest;
    import com.clarkware.junitperf.TestMethodFactory;
    import junit.framework.Test;
    import junit.framework.TestCase;
    import junit.framework.TestSuite;
    public class JUnitPerfTestDateUtil extends TestCase {
     public JUnitPerfTestDateUtil(String name) {
      super(name);
     }
     protected void setUp() throws Exception {
      super.setUp();
     }
     protected void tearDown() throws Exception {
      super.tearDown();
     }
     public void CompareDateTime() {
      String dateTime1 = "20120111 01:02:03";
      String dateTime2 = "20130111 01:02:03";
      String dateTime3 = "20130111 01:02:03";
      assertEquals(-1, DateUtil.compareDateTime(dateTime1, dateTime2));
      assertEquals(1, DateUtil.compareDateTime(dateTime2, dateTime1));
      assertEquals(0, DateUtil.compareDateTime(dateTime2, dateTime3));
     }
     protected static Test compareDateTimeLoadTestMethod() {
      int users = 5;
      Test factory = new TestMethodFactory(JUnitPerfTestDateUtil.class,
        "CompareDateTime");
      Test loadTest = new LoadTest(factory, users);
      return loadTest;
     }
     public static Test suite() {
      TestSuite suite = new TestSuite();
      suite.addTest(compareDateTimeLoadTestMethod());
      return suite;
     }
     public static void main(String args[]) {
      junit.textui.TestRunner.run(suite());
     }
    }


      編譯、運行該測試方法,使用Run as Application,控制臺可能輸出如下結果,有2個Error:

      …..EE

      Time: 0.053

      There were 2 errors:

      1) CompareDateTime(com.loggingselenium.JUnitPerfTestDateUtil)java.lang.RuntimeException: 解析日期時間格式出錯,期望的字符串格式為[yyyyMMdd HH:mm:ss]

      at com.loggingselenium.DateUtil.compareDateTime(DateUtil.java:18)
      at com.loggingselenium.JUnitPerfTestDateUtil.CompareDateTime(JUnitPerfTestDateUtil.java:22)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      at com.clarkware.junitperf.TestFactory.run(TestFactory.java:83)
      at com.clarkware.junitperf.ThreadedTest$TestRunner.run(ThreadedTest.java:75)
      at java.lang.Thread.run(Unknown Source)

      2) CompareDateTime(com.loggingselenium.JUnitPerfTestDateUtil)java.lang.RuntimeException: 解析日期時間格式出錯,期望的字符串格式為[yyyyMMdd HH:mm:ss]

      at com.loggingselenium.DateUtil.compareDateTime(DateUtil.java:18)
      at com.loggingselenium.JUnitPerfTestDateUtil.CompareDateTime(JUnitPerfTestDateUtil.java:22)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      at com.clarkware.junitperf.TestFactory.run(TestFactory.java:83)
      at com.clarkware.junitperf.ThreadedTest$TestRunner.run(ThreadedTest.java:75)
      at java.lang.Thread.run(Unknown Source)

      FAILURES!!!

      Tests run: 5, Failures: 0, Errors: 2

      多線程并發測試失敗,我們的比較日期時間大小的方法存在線程不安全的問題,我們需要在DateUtil中方法前加上線程同步關鍵字synchronized:

    public synchronized static int compareDateTime(String dateTime1, String dateTime2) {......}

      再次運行單元測試方法,可以發現多線程并發下存在的問題得到了解決。

    版權聲明:本文出自 lobster 的51Testing軟件測試博客:http://www.51testing.com/?194329

    原創作品,轉載時請務必以超鏈接形式標明本文原始出處、作者信息和本聲明,否則將追究法律責任。

    posted on 2013-01-14 11:55 順其自然EVO 閱讀(432) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

    <2013年1月>
    303112345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導航

    統計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 爱情岛论坛网亚洲品质自拍| 最近免费中文在线视频| 国内自产拍自a免费毛片| 亚洲a级成人片在线观看| 免费观看美女用震蛋喷水的视频| 色久悠悠婷婷综合在线亚洲| 九九免费久久这里有精品23| 免费观看午夜在线欧差毛片| 亚洲人成自拍网站在线观看| 99久久这里只精品国产免费| 亚洲人成黄网在线观看| 免费A级毛片无码免费视| 亚洲精品无AMM毛片| 日本一道本高清免费| 亚洲精品国产首次亮相| 免费v片视频在线观看视频| 日韩一级片免费观看| 亚洲午夜久久久影院| 免费视频精品一区二区三区| 91精品国产亚洲爽啪在线影院| 亚洲免费视频网址| 亚洲熟妇久久精品| 亚洲&#228;v永久无码精品天堂久久| 黄网站在线播放视频免费观看| 亚洲色偷偷狠狠综合网| 大地资源网高清在线观看免费| 久久亚洲私人国产精品| 无码人妻久久一区二区三区免费丨 | 亚洲乱码一区av春药高潮| 成**人免费一级毛片| 极品美女一级毛片免费| 久久久久久久久亚洲| 99视频全部免费精品全部四虎| 成a人片亚洲日本久久| 亚洲日韩aⅴ在线视频| 免费福利网站在线观看| 免费人成视频在线观看免费| 亚洲国产精品特色大片观看完整版| 麻豆最新国产剧情AV原创免费| 一级成人毛片免费观看| 亚洲五月综合网色九月色|