基於testNG框架的分層式數據驅動自動化測試設計與研發(一)

目前整個流程已經基本研發完成,咱們首先從測試腳本開發的工程師角度入門,由簡到繁慢慢剖析這個過程, 設計模式

從分析一段測試腳本的code開始,簡略code大體以下: app

public class BasicOrderCancelOperateServiceTest { 框架


    @BeforeClass
    public void beforeClass(){
        Environment.set4If();
    }

    /**
     * 訂單取消
     * @throws Exception
     */
    @Test(description = "訂單取消檢查", dataProvider = "basicOrderCancelProcess", timeOut = 70000, enabled=true)

    public void basicOrderCancelProcess(Map < String, String > datadriven) throws Exception {    
     ....
    }


    @DataProvider(name = "basicOrderCancelProcess", parallel = false)
    public Iterator<Object[]> data4basicOrderCancelProcess(Method method) throws Exception {
        return new ExcelProvider2(this, "basicOrderCancelProcess");
    }
    
    private CheckResultBean doCheck(BasicOrderCancelResponse response,Map < String, String > datadriven){ ide

    ......
    return new CheckResultBean(result,content);
}   
}

說說testNG框架的註解 測試

1.@before class這一段方法執行Environment.set4If(),其實很簡單,作的事就是系統環境變量初始化, 經過讀取d:/TA/TA.properties這個文件,把這個文件裏設置的base.properities裏全部環境變量設置到系統properties中 2.@Test(description = "訂單取消檢查", dataProvider = "basicOrderCancelProcess", timeOut = 70000, enabled=true)爲例:      玩過自動化測試框架的,對基於註解的這種設計方式應該不會陌生,框架封裝好各類自定義註解,咱們根據需求很Happy的調用就行了。 @Test把一個類或者方法標記爲測試的一部分,括號裏的部分根據測試需求進行配置。欲詳細瞭解testNG基於註解的設計模式,一句話,全部的真相都在源碼裏,反編譯testNG jar包,找org.testng.annotations包 ,這個包提供全部註解關鍵詞的接口類,以@Test爲例,能夠在這個包裏找到對應的Test註解接口類,固然必需要實現註解解析器,不難在 code裏找到org.testng.internal.annotations包,這個包裏對全部自定義註解作了詳細解析,咱們來看包裏TestAnnotation類對應解析的 就是org.testng.annotations.Test,無非就是把註解裏的各類attibutes各類set,好,既然dataProvider咱們set的值是basicOrderCancelProcess, 咱們須要在code裏定義一個被註解爲@DataProvider name = "basicOrderCancelProcess"的方法, 緣由能夠查看testNG的註解指南:@DataProvider標識一個方法用於爲測試方法提供數據。被註解的方法必須返回Object[][], 其中每一個Object[]能夠指派爲測試方法的參數列表。從這個DataProvider接收數據的@Test方法須要使用一個和當前註解相同名稱的dataProvider名稱. 有興趣的同窗能夠在testNG的源碼中追蹤到被註解爲DataProvider的方法是如何被invoke的,最後定位到MethodInvocationHelper的invokeDataProvider方法,總之最後返回了 Iterator<Object[]>這個數據對象。      咱們回到case自己繼續看data4basicOrderCancelProcess這個被註解爲DataProvider的方法具體是如何實現的:調用了ExcelProvider2這個玩意(這是咱們分層式測試框架中實現的一個類) ,返回了Iterator<Object[]>對象, 因而乎,追蹤到ExcelProvider2這個類,在實例化這個對象的時候一共作了三件事: 1)getInfo(aimob, aimmathod); 第一個參數是咱們test case自己這個對象實例,第二個參數是被註解爲@Test的成員方法 看源碼實現細節,首先調用locateTestMethod(aimob, aimmathod),返回該成員方法的Method實例,取得註解對象實例,強轉爲DataDriven類型對象,第一次load該對象時,分別 調用modifydata,modifysheet,modifyType這三個方法,modifydata獲取系統變量Selenium.DatadrivenRoot對應的值,該值爲數據文件存放全路徑,該方法返回全路徑字符串;modifysheet 直接返回該被註解爲@Test的成員方法名;modifyType默認返回字符串「excel」,表示數據文件類型爲 excel類型。 2)openSheet(); 顧名思義,解析前面load到的excel數據文件 3)getRowname(); 獲取第一行row的每一個cell對應的值即每一列的列名 接着仔細分析ExcelProvider2這個類的具體實現,它繼承了Iterator<Object[]>,而且覆寫了迭代器的成員方法next(),,迭代器中的每一個item由一個hashmap實現, map裏填充從excel文件解析出來的數據:(列名:每行的列值 一一對應) 繼續回到case的code,這下咱們有了DataProvider數據集,數據集的每個Item爲一個hashmap對象,那麼在case中被註解爲@Test的成員方法中傳遞的參數類型即爲一個hashmap對象,方法 定義以下: public void basicOrderCancelProcess(Map < String, String > datadriven) throws Exception 從參數datadriven獲取到咱們想要的測試數據,完成數據驅動。
相關文章
相關標籤/搜索