您的位置:軟件測試 > 開源軟件測試 > 開源性能測試工具 >
認(rèn)識 p-unit : 一款開源的性能測試工具
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2012/12/6 15:41:27 ] 推薦標(biāo)簽:

    p-unit 是一款開放源碼的性能測試框架,和 JUnit 不同,JUnit 關(guān)注的是測試案例的正確性,而 p-unit 不僅關(guān)注測試案例的正確性,還收集測試案例的性能參數(shù),默認(rèn)情況下,p-unit 收集測試案例的時(shí)間和內(nèi)存消耗情況,可以產(chǎn)生文件,圖片,和 PDF 格式的報(bào)表。此外,p-unit 還支持參數(shù)化測試,多線程測試以及不同 Java 虛擬機(jī)性能之間的比較。

p-unit 簡介

或許我們已經(jīng)習(xí)慣了使用 JUnit 來寫單元測試來保證代碼質(zhì)量(我也一直這么做),但可能經(jīng)常碰到這樣的問題:

    程序多線程下正確性如何?
    如何測試程序的性能?
    當(dāng)有多個(gè)方案可以選擇時(shí),技術(shù)上如何比較不同方案的性能?

對于問題 1,我們或許聽天由命?或是憑借人工分析,或是根據(jù)用戶反饋?很多軟件單線程下的單元測試覆蓋率相當(dāng)高,從而保證了代碼的健壯性。然而多線程測試時(shí)常被忽略,這并不代表多線程測試不重要,相反,修正一個(gè)用戶報(bào)告的多線程 BUG 往往比單線程的要高出很多,因?yàn)闇y試案例經(jīng)常不是 可重現(xiàn)的。這更要求程序員在開發(fā)階段充分的重視。目前多線程單元測試力度不夠的一個(gè)重要原因是沒有一個(gè)像 JUnit 那樣易用的測試工具,另外重復(fù)寫測試案例往往不被程序員接受。

對于問題 2,一個(gè)成熟的關(guān)心性能的產(chǎn)品往往有一個(gè)性能測試平臺。這個(gè)測試平臺應(yīng)該關(guān)注的是測試業(yè)務(wù)邏輯本身,而無需關(guān)心如何運(yùn)行測試案例。你是否為寫這樣的測試平臺痛苦過?以及花費(fèi)時(shí)間在產(chǎn)生一些直觀的報(bào)表上面?

對于問題 3,我們往往寫一個(gè)原型來比較不同產(chǎn)品之間的性能,如何比較執(zhí)行速度和內(nèi)存消耗?或是選擇適合你的虛擬機(jī)?

p-unit 是這么一款開源的性能測試軟件,它能幫助你很好的解決上述問題。p-unit 可以:

    多線程支持:同一個(gè)測試案例可以單線程執(zhí)行,也可以多線程執(zhí)行,測試案例開發(fā)者只需寫一套測試案例。
    參數(shù)化測試案例:很多測試案例,需要測試同一功能在不同數(shù)量級上的性能表現(xiàn)。
    不同虛擬機(jī)性能測試:只需指定虛擬機(jī)路徑,即可測試同一個(gè)測試案例在不同虛擬機(jī)上的表現(xiàn),報(bào)表上可以非常直觀顯示性能差別。
    事件機(jī)制構(gòu)架:punit 是基于事件機(jī)制構(gòu)架的,如果用戶想定制報(bào)表,只需實(shí)現(xiàn)事件響應(yīng)器,并注冊該響應(yīng)器到 punit 核心即可。

多線程執(zhí)行測試案例

在了解如何多線程執(zhí)行測試案例之前,我們先了解一下如何利用 p-unit 單線程執(zhí)行測試案例。不同于 JUnit, p-unit 測試用例無需繼承任何測試類或是實(shí)現(xiàn)接口,即可執(zhí)行 test 開始的方法。盡管 JUnit 4 中加入了注釋(Annotation) 的特性,但測試方法前綴為 "test" 仍然是測試者們的。因此如果你的 JUnit 測試案例遵循的是 test 命名規(guī)則,那么 p-uni t可以兼容運(yùn)行 JUnit 測試案例。

下面的代碼清單 1 是一個(gè)為普通的測試案例:


清單 1. 測試案例 1

public class SimpleTestClass {

 public void setUp() {
   SampleUtil.doSomething();
 }
 
 public void tearDown() {
   SampleUtil.doSomething();
 }
 
 public void testA() {
   System.out.println("testA");
   SampleUtil.doSomething();
 }
 
 public void testB() {
   SampleUtil.doSomething();
 }
 
 public void testC() {
   SampleUtil.doSomething();
 }

}

public class SampleUtil {
 private static Random _random = new Random();
  
 public static void consumeMemory(int length) {
  byte[] data = new byte[length];
  for(int i = 0, j = 0; i < data.length; ++i) {
    ++j;
  }
 }

 public static void consumeTime(int time) {
  ThreadUtil.sleepIgnoreInterruption(time);
 }
 
 public static void doSomething() {
  consumeTime(Math.abs(_random.nextInt()) % 500);
  consumeMemory(Math.abs(_random.nextInt()) % 100000);
 }
}

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