對 Rational Performance Tester 數據池的改進(2)

發表于:2012-03-26來源:未知作者:娃娃點擊數: 標簽:
這個 xmi 文件實際就是我們數據池實例 aa 的序列化后的形式,系統在實際調用時會將其反序列化同時將相關的數據 load 到內存中去。在 Rational Performance T

  這個 xmi 文件實際就是我們數據池實例 aa 的序列化后的形式,系統在實際調用時會將其反序列化同時將相關的數據 load 到內存中去。在 Rational Performance Tester 中打開這個 xmi 文件,可以清晰的看到它的層次結構,同時可以對它進行修改。

  圖 2: 層次結構

  采用 EMF 設計的一個很直接的好處是,系統可以自動的根據模型生成代碼,同時實現了 UML 模型,XML Schema, 注釋過的 Java 接口表現模型的統一。但在實際環境中,采用 Rational Performance Tester 內置的 DataPool 還是有很多不太方便的地方,比如:

  要經常對文件中的數據進行變化,然后再重新測試時

  很多時候測試完后,數據就暫時沒用了,因為狀態已經更新了,為此需要對測試數據進行替換,但在 RPT 目前的這種序列化反序列化的機制中,要實現這一點并不容易,所以體現在界面中的操作實際上是比較繁瑣的,表現為:

  要重新加入一個新的 Pool

  需要對原來的變量去掉關聯

  關聯新的 Pool 中的變量

  如果你的變量比較多,還是非常繁瑣的,而且不是一種最好的解決辦法。

  當測試數據很大,比如文件大概 50M 或更多時

  這時候內置的機制會產生一些問題,裝載數據時比較慢。這在早期的 6.x 版本中經常遇到,但現在 70 有沒有這個問題倒是需要看看底層機制是否有更改。

  正因為上面的問題,同時還頻繁在實際的測試過程中遇到,因此找到一種更好的替代方案對于實際的項目更加迫切,好在 RPT 建立在 TPTP 的架構上,也就意味著建立在純粹的 Java 的實現機制下,因此提供了讓人很方便的插入 Java 代碼的方式,使得很多的擴展和增強成為可能。下面我們就來談談如何解決這兩個問題。

  Rational Performance Tester DataPool 的擴展

  為了擴展 DataPool 我們決定對這個環節進行重新的設計,原則如下:

  考慮對真實測試性能影響最小的原則,我們把所有的數據都放在文本文件中,變量間通過逗號來進行分隔。

  考慮到內存的開銷,同時不需要把所有的數據都讀入到 JVM 中進行處理的原則,我們通過了一個 ArrayList 來存放一次讀入的數據,這些數據會分配給每個 Virtual User, 同時如果讀到最后行時,會重新調用方法進行對 ArrayList 中數據的刷新。

  通過變量來控制一次讀入的文件行數。

  一開始的時候考慮把通過二維數組來進行變量的讀取,但后來在調試過程中發現,很難解決不同的變量讀取同一行的問題,往往在一次讀完后就指針就指到下一行去了,而因 RPT 本身并不是全部的 Java 腳本,而是 Java 腳本和頁面表示的混合,Java 腳本和頁面間其實是通過變量來進行溝通的,這造成的一個很現實的問題是,如果我們僅僅獲取一個變量而不是每行的時候,無法控制在哪條語句后移動 cursor。后來就改變了設計,采用了一起獲取一行的方式,對于變量的返回通過對行的解析得到。

  通過 PoolLoad 定義靜態的數據池類

  通過 getLine 返回當前 VU 對應的行

  通過 getVar 解析返回行,從而返回需要的變量

  經過設計的類圖如下:

  圖 4: 經過設計的類圖

  關鍵代碼的解釋:

  RPTDataPool.java:主要用于將記錄以分頁的形式從文件中讀入到 ArrayList 中

  首先定義需要的變量:

Private String DataPoolFileName;// 定義數據池文件存放的位置,運行時會由 PoolLoad.java 裝入
        private ArrayList DataPool;// 存放每次從數據池中讀出的記錄
        private int cursor = 0;// 當前記錄的光標
        static private int pageno = 1;// 根據每頁的大小 (PageSize), 目前光標停在哪頁
        private int pagesize = 500;// 每次 load 進 DataPool 的記錄數量

  構造函數 RPTDataPool:

  調用 fillPageByLine 方法,把文件的第一個頁面存入到變量 DataPool 中來。

public RPTDataPool(String fileName ) {
    
    ……
    
    fillPageByLine( DataPoolFileName, DataPool, 1);
}        

  fillPageByLine: 每次到了頁面的記錄末尾,都會被調用,從而把相關的記錄讀到 DataPool 中來。

private boolean fillPageByLine(String fileName, ArrayList FileLines, int Pageno) {
    // 通過 ReadLine 讀文件 ;
    while (line !=null) {
    // 當前行數在關注的頁面中, pageno 通過參數傳入
    if ((lineno>=pagesize*(Pageno-1))&&(lineno<pagesize*Pageno)) {
        FileLines.add(line);// 把當前記錄加入 ArrayList
        line=br.readLine();// 記錄下移
        lineno++;// 行數增加
    } else if (lineno<pagesize*(Pageno-1)) {// 當前行數還沒到關注的頁面
        line=br.readLine();// 記錄下移
        lineno++;// 行數增加
    } else if (lineno >= pagesize*(Pageno)) {// 當前行數超過關注的頁面
        break;// 退出
    }
}

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97