• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    在RFT中運用手動驗證點驗證自定義類型對象

    發布: 2008-7-07 14:47 | 作者: 不詳 | 來源: 本站原創 | 查看: 178次 | 進入軟件測試論壇討論

    領測軟件測試網 關鍵字:RFTRational Functional Tester(以下簡稱RFT)是一款強大易用的自動化功能測試工具。在使用RFT進行功能測試的過程中,測試結果的驗證往往是通過插入驗證點(Verification Point)來完成的。但是RFT的驗證點只能驗證有限的數據類型,而在實際應用中,對用戶自定義類型的驗證存在著較大的需求。本文對驗證點的驗證執行過程進行剖析,并介紹如何通過自定義ValueManager來實現對用戶自定義類型對象的驗證。

        1驗證點簡介

        1.1 驗證點的類型

        Rational Functional Tester是Rational最新推出的自動化功能測試工具。RFT具有數據驅動(Data-Driven)測試、scrīptAssure等特性,因而受到廣大功能測試人員的青睞。在RFT中,驗證點是腳本(scrīpt)中非常重要的組成部分,它完成對被測試程序生成的實際數據和期望數據的比較,并將比較結果寫入日志。一般情況下,測試的結果是通過對驗證點的執行而得到的。
    RFT提供了多種形式的驗證點,包括:

        靜態驗證點(Static Verification Point):靜態驗證點是在錄制(Record)RFT腳本的過程中通過向導插入的驗證點,它在腳本回放(Playback)的過程中自動被驗證。

        手動驗證點(Manual Verification Point):如果驗證點所要驗證的內容是由腳本開發人員在腳本中所提供的,則需要建立手動驗證點對其進行驗證。例如待驗證數據來自外部數據源的情況,腳本開發人員需將數據讀取后以參數的形式顯式傳給驗證點。

        動態驗證點(Dynamic Verification Point):動態驗證點是在腳本首次回放時建立的。驗證點一旦建立,其行為就和靜態驗證點相同了。

        如果以錄制-回放(Record-Playback)模式使用RFT進行圖形界面(GUI)的自動化回歸測試(Regression Test),較常用的是靜態驗證點。而由于RFT的數據驅動測試特性以及與其他RUP工具的良好集成,使之也是非圖形化界面的功能測試的首選工具之一。在這些測試用例中,存在著大量的用戶自定義類型對象,這些被測試對象并不能在錄制過程中被插入對象映射表(ObjectMap)中,也就是不能使用靜態驗證點來進行驗證,這就需要我們使用手動驗證點來比較它們。

        1.2 驗證點執行過程

        在RFT中,手動驗證點有兩種聲明形式:
        IFtVerificationPoint vpManual (java.lang.String vpName, java.lang.Object actual)
    該聲明接受兩個參數,第一個參數為驗證點的名稱,第二個參數為被測試對象?梢酝ㄟ^如下方式在腳本中調用該方法:

        vpManual("VP1", "The object under test").performTest();

        這條語句的作用就是判斷被測試對象和基準線(Baseline)是否一致。這里所說的基準線就是期望數據,它以XML格式被存儲在磁盤上,后綴名rftvp。
        當回放腳本時,如果基準線所對應的文件已經在磁盤上存在,則RFT會比較被測試對象和基準線中的數據是否一致,如果一致,則測試結果為成功(Pass),否則為失。‵ailed);如果基準線尚不存在,則會以當前被測試對象作為基準線存入磁盤。
    IFtVerificationPoint vpManual (java.lang.String vpName, java.lang.Object expected, java.lang.Object actual)

        手動驗證點的另一種聲明接受三個參數,第一個參數為驗證點的名稱,第二個參數則為期望數據,第三個參數為實際數據,也就是被測試對象?梢酝ㄟ^如下方式在腳本中調用該方法:

    vpManual("VP1", "Expected object", "The object under test").performTest();

    當腳本回放時,RFT直接比較期望數據和實際數據,并將比較的結果被寫入日志?偟膩碚f,驗證點的執行過程如圖1所示:

    圖1 驗證點執行流程圖

        不難看出,在執行驗證點的過程中,涉及到了將數據寫入磁盤以及從磁盤中恢復數據的操作。將這些數據寫入磁盤便于測試人員使用工具查看和編輯。但是這也帶來了一個問題,對于開發者自定義類型的對象,哪些屬性需要被寫入磁盤,這些屬性按照什么順序寫入都是類型相關的,需要腳本開發者自行定義。更重要的,如何比較自定義類型也是RFT所不能確定的,換句話說,腳本開發者需要告知RFT對象一致的標準。以上這兩個任務都需要通過創建ValueManager來完成。

        ValueManager 可以用類特定(Class-specific)的形式比較和持久化用戶自定義的對象。它是IManageValueClass接口的實現。只有擁有自己的 ValueManager的類型才能作為參數傳遞給vpManual。這些類型被稱為基于Value-class的類型。缺省的,只有基本數據類型, String,Vector等少數類型才是基于Value-class的類型那么,如何才能實現我們自己的ValueManager呢?在下面的章節中,我們將通過一個實例來幫助您建立自定義類型的ValueManager。

    2. 實例分析--如何實現ValueManager

    2.1需求的提出

        假設我們需要驗證一個計算圖形重心的算法。該算法的輸出結果為一個自定義類型MyPoint,它表示的一個平面上的點。它具有兩個屬性x,y,分別表示其橫縱座標。MyPoint的實現如下,除了構造函數,它還提供了x和y的getter和setter方法。


    public class MyPoint {

    int x;
    int y;

    public MyPoint(int x, int y) {
    this.x = x;
    this.y = y;
    }

    public int getX() {
    return x;
    }

    public void setX(int x) {
    this.x = x;
    }

    public int getY() {
    return y;
    }

    public void setY(int y) {
    this.y = y;
    }

    }

        我們的測試人員需要判斷該算法得到的重心點是否正確,可以使用了如下腳本:


    MyPoint point = getCenterOfGravity(polygon);
    vpManual("VP_CG", point).performTest();

        上面的語句將在第一次回放腳本時將得到的重心坐標寫入磁盤;測試人員可以使用驗證點編輯器查看得到的基準線是否正確;在此后的回放中(通常是回歸測試中),上述代碼的工作就是比較當次回歸測試得到的重心對象與基準線是否一致。

        但是,如果直接調用該語句,RFT就會拋出異常(Unsupported type, value class required),說明MyPoint不是基于Value-class的類型。要使MyPoint成為Value-class,必須為其實現相應的 ValueManager,并部署到RFT中。

        2 .2其他驗證自定義類型對象的方法

        在介紹如何實現ValueManager之前,首先讓我們來看一下其他的解決辦法。

        第一種方法,我們可以逐一比較自定義類型的屬性來驗證被測試對象是否符合要求。如下例所示:


    MyPoint point = getCenterOfGravity(polygon);
    vpManual("VP_CG1", new Integer(point.getX())).performTest();
    vpManual("VP_CG2", new Integer(point.getY())).performTest();

    使用logTestResult方法也可以達到同樣的目的:


    MyPoint point = getCenterOfGravity(polygon);
    boolean flag = (point.getX() == 6 && point.getY()==8);
    logTestResult("This is not a VP", flag);

        這兩種方式都有其局限性,第一種方式會使驗證點的數量增加,特別是當自定義類的屬性很多的時候;并且該方法也不利于重用,如果多個腳本都需要驗證 MyPoint,則腳本開發的工作會大大增加;第二種方式雖然不增加驗證點數目,但是由于logTestResult只記錄比較結果,使日志中的信息不足。特別是在測試用例失敗的時候,這不利于測試人員定位問題所在。
    因而,為自定義類型實現ValueManager較以上兩種方法更好。

    圖3 使用ValueManager則可以通過驗證點編輯器查看和編輯驗證點數據,利于問題定位
    ?

    圖4 使用logTestResult方法只能記錄結果,不能記錄數據,信息不足

    2.3創建ValueManager

        現在,我們準備創建MyPoint的ValueManager--我們命名為MyPointValue了,如上文所述,它是 IManageValueClass接口的一個實現,該接口有7個方法:persistIn, persistInNamed, persistOut, compare, getCanonicalName, getClassName和createValue。這些接口分別完成哪些事情呢?

        我們再來看看,執行驗證點的過程中 ValueManager是怎么工作的。如圖1所示,驗證點執行過程中必須的步驟可以歸為三類:讀取數據--從基準線中讀取數據;寫入數據--將期望數據寫入日志,將實際數據寫入日志,寫入基準線;比較--比較期望數據和實際數據。以上三類動作都需要ValueManager的參與。下面以MyPoint 為例:

        如圖5,在從基準線中讀取數據的過程中,如果腳本發現基準線存在,RFT會讀取基準線數據。如果RFT在注冊了的 ValueManager表中找到了相應的ValueManager--對MyPoint來說,就是找到了MyPointValue--就會創建該 ValueManager的一個實例,然后調用該實例的persistIn方法。persistIn方法包含了如何讀取MyPoint內容的邏輯,其返回值就是一個MyPoint對象,這樣就將存儲在磁盤上XML格式的MyPoint對象恢復出來,供RFT繼續使用了。

    圖5 從基準線中讀取數據



        如圖6,在寫入數據的過程中,無論是寫入期望數據,寫入實際數據還是寫基準線,都是通過persistOut方法完成的。同樣的,RFT首先找到 MyPoint的ValueManger,將其實例化,然后調用MyPointValue的persistOut方法將其寫入磁盤。

    圖6 寫入基準線


        如圖7,在比較兩個MyPoint對象的時候,RFT還是先找到MyPoint的ValueManger,將其實例化,然后調用MyPointValue的compare方法,得到一個分值,根據分值和用戶設置判斷期望數據和實際數據是否一致。

    圖7 比較期望數據與實際數據


        理解了IManageValueClass接口各方法的作用,我們就可以來實現這個ValueManager--MyPointValue了。如上文所述,有7個方法需要實現。其中最關鍵的是4個方法:

    持久化輸出方法

    public void persistOut(Object obj, IPersistOut persistout,
    IAuxiliaryDataManager auxdatamanager)


    該方法通過persistout將對象obj的屬性寫入到磁盤上。obj就是要寫入的對象,persistout是負責寫操作的接口,由RFT傳入,auxdatamanager是用于命名相關文件的接口,由RFT傳入,通常不是使用到這個參數。
    ?以MyPoint為例,下面的代碼段將MyPoint的屬性x,y依次記錄到磁盤上:

    public void persistOut(Object obj, IPersistOut persistout,
    IAuxiliaryDataManager auxdatamanager) {
    if (obj instanceof MyPoint) {
    MyPoint point = (MyPoint)obj;

    // persistout是負責寫的接口,
    //write方法接受的第一個參數是要寫入的屬性的名稱
    //第二個參數是要寫入的屬性值
    persistout.write("X", point.getX());
    persistout.write("Y", point.getY());
    }
    }


        對于測試開發人員來說,這里寫入了哪些屬性,將來哪些屬性才能夠被恢復出來。
    持久化恢復方法
        RFT 提供兩個方法讀入持久化了的對象。一種接受IPersistIn類型的參數,另一種接受IPersistInNamed類型的參數。二者的不同在于,前者是根據對象屬性的存儲順序進行讀取的,而后者是按照對象的屬性名稱進行讀取。以MyPointValue為例, 方法一的實現如下:

    public Object persistIn(IPersistIn persistin, IAuxiliaryDataManager auxdatamanager) {
    // 在persistOut方法中,是按照x,y的先后順序寫入磁盤的,
    // 那么在該方法中就需要按照x,y的順序將其讀取出來read的參數就是寫入磁盤的序號。
    int x = ((Integer)persistin.read(0)).intValue();
    int y = ((Integer)persistin.read(1)).intValue();
    return new MyPoint(x, y);
    }

    方法二的實現如下:

    public Object persistIn(IPersistInNamed persistinnamed, IAuxiliaryDataManager auxdatamanager) {
    // 該方法根據persistOut時寫入的屬性名稱讀取屬性,read的參數是屬性名稱
    int x = ((Integer)persistinnamed.read("X")).intValue();
    int y = ((Integer)persistinnamed.read("Y")).intValue();
    return new MyPoint(x, y);
    }

    比較方法

    public int compare(Object obj1, Object obj2, ICompareValueClass comparedvalueclass)

    compare方法用于確定兩個對象一致與否,其前兩個參數為要比較的對象,返回值則為一個0-100之間的整數,返回值越大則被比較的對象越相似。
    以MyPointValue為例,其比較原則是,如果二者相等則返回100(表示不同),否則返回0(表示相同)。

    public int compare(Object obj1, Object obj2, ICompareValueClass comparedvalueclass) {
    if ((obj1 instanceof MyPoint) && (obj2 instanceof MyPoint)) {
    MyPoint point1 = (MyPoint)obj1;
    MyPoint point2 = (MyPoint)obj2;
    return (point1.getX()==point2.getX() && point1.getY()==point2.getY()) ? 100 : 0;
    } else {
    return 0;
    }
    }

    其他方法
    除上述四個方法,還有3個方法也需要實現,分別是

    public String getCanonicalName() {
    return "MyPoint";
    }

    上面的方法返回該Value-class的平臺無關的規范名稱

    public String getClassName() {
    return "com.rational.ft.sample.MyPoint";
    }

    上面的方法返回ValueManager支持的Value-class的名稱

    public Object createValue(Object sourceToCopy) {
    return null;
    }

        上面的方法返回被測試對象的一個拷貝,可以返回null,較少會被用到。

    2.4 部署ValueManager

        上面的7個方法實現了,MyPoint的ValueManager也就完成了。要在工程中使用ValueManger,還必須將ValueManager部署到RFT中。這也是注冊ValueManger的過程。
    首先我們需要將ValueManager的實現導出為jar文件,例如vmsample.jar。

        第二步,我們還需要創建RFT自定義文件。RFT自定義文件是后綴名為RFTCUST的XML文件,用于定義開發者擴展的proxy, valuemanger等。RFT自定義文件內容如下,不難看出,其中ComponentModel元素中Obj一段是用于定義我們所創建的 ValueManger的。ValueClass是要被驗證的自定義類型;Manager是該自定義類型的ValueManger。


    <ConfigFile L=".ConfigFile">
    <Section L=".ConfigFileSection">
    <Name>valueManagers</Name>
    <Val L=".ValueManagerManager">

    <ComponentModel L=".ComponentModel">
    <Name>Java</Name>
    <Obj L=".ValueManager">
    <Id>.MyPoint</Id>
    <ValueClass>com.rational.ft.sample.MyPoint</ValueClass>
    <Manager>com.rational.ft.sample.valuemanager.MyPointValue</Manager>
    </Obj>
    </ComponentModel>
    </Val>
    </Section>
    </ConfigFile>

        將. jar文件和RFTCUST建立好后,把這兩個文件都放到C:\Documents and Settings\All Users\Application Data\ibm\RFT\customization目錄下,ValueManager即被部署到RFT上了。(有可能需要重新啟動計算機)

    結論
        驗證點是腳本的重要組成部分。對自定義類型的驗證又是測試中所不可避免的。通過開發ValueManager來擴展RFT對自定義類型驗證的支持,較之其它方法可重用性好,并使信息能夠在日志中一目了然,而且便于修改期望數據。這一特性使RFT的應用更加自由。

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    TAG: 定義 對象 類型 驗證 RFT

    21/212>

    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>