1. 程式人生 > 其它 >乾貨|app自動化之如何引數化用例

乾貨|app自動化之如何引數化用例

本文節選自霍格沃茲測試學院內部教材

引數化是自動化測試的一種常用技巧,可以將測試程式碼中的某些輸入使用引數來代替。以百度搜索功能為例,每次測試搜尋場景,都需要測試不同的搜尋內容,在這個過程裡面,除了資料在變化,測試步驟都是重複的,這時就可以使用引數化的方式來解決測試資料變化,測試步驟不變的問題。

引數化就是把測試需要用到的引數寫到資料集合裡,讓程式自動去這個集合裡面取值,每條資料都生成一條對應的測試用例,直到集合裡的值全部取完。

使用方法

使用 Appium 測試框架編寫測試用例時,通常會結合 pytest 測試框架一起使用。使用 pytest
的引數化機制,可以減少程式碼重複,在測試程式碼前新增裝飾器 @pytest.mark.parametrize

,來完成資料的傳輸。示例程式碼如下:

@pytest.mark.parametrize("argvnames",argvalues)

@pytest.mark.parametrize() 需要傳入兩個引數 “argnamest” 與
“argvalues”,第一個引數需要一個或者多個變數來接收列表中的每組資料,第二個引數傳遞儲存資料的列表。測試用例需要使用同名的字串接收測試資料(與“argvnames”裡面的名字一致),且列表有多少個元素就會生成並執行多個測試用例。下面示例使用使用引數化定義三組資料,每組資料都存放在一個元組中,分別將元組中的資料傳入(test_input,expected)引數中,示例程式碼如下:


# content of test_expectation.pyimport pytest  
@pytest.mark.parametrize("test_input,expected", [("3+5", 8), ("2+4", 6), ("6*9", 42)])def test_eval(test_input, expected):    assert eval(test_input) == expected

執行結果如下:


...test_expectation.py ..F  
test_input = '6*9', expected = 42  
    @pytest.mark.parametrize("test_input,expected",    [("3+5", 8), ("2+4", 6), ("6*9", 42)])  
    def test_eval(test_input, expected):>       assert eval(test_input) == expectedE       AssertionError: assert 54 == 42E        +  where 54 = eval('6*9')  
test_expectation.py:6: AssertionError

上面的執行結果可以看出,執行的三條測試用例分別對應三組資料,測試步驟完全相同,只是傳入的測試資料發生了變化。

案例

使用“雪球”應用,開啟雪球
APP,點選頁面上的搜尋輸入框輸入“alibaba”,然後在搜尋聯想出來的列表裡面點選“阿里巴巴”,選擇股票分類,獲取股票型別為“BABA”的股票價格,最後驗證價格在預期價格的
10%範圍浮動,另一個搜尋“小米”的結果資料測試步驟類似。

這個案例使用了引數化機制和 Hamcrest 斷言機制,示例程式碼片斷如下:

引數化示例程式碼:


from appium import webdriverimport pytestfrom hamcrest import *  
class TestXueqiu:    省略...    # 引數化    @pytest.mark.parametrize("keyword, stock_type, expect_price", [        ('alibaba', 'BABA', 170),        ('xiaomi', '01810', 8.5)    ])    def test_search(self, keyword, stock_type, expect_price):        # 點選搜尋        self.driver.find_element_by_id("home_search").click()        # 向搜尋框中輸入keyword        self.driver.find_element_by_id(            "com.xueqiu.android:id/search_input_text"            ).send_keys(keyword)  
        # 點選搜尋結果        self.driver.find_element_by_id("name").click()        # 獲取價格        price = float(self.driver.find_element_by_xpath(            "//*[contains(@resource-id, 'stockCode')\            and @text='%s']/../../..\            //*[contains(@resource-id, 'current_price')]"            % stock_type        ).text)        # 斷言        assert_that(price, close_to(expect_price, expect_price * 0.1))

上面的程式碼,傳入了兩組測試資料,每組有三個資料分別為搜尋關鍵詞,股票型別,及股票價格。在執行測試用例時,分別將兩組資料傳入測試步驟中執行,對應搜尋不同的關鍵詞,使用
Hamcrest 來實現股票價格的斷言。

app自動化測試(Android)引數化用例就講完了,大家學會了麼?我們下一期為大家講解app自動化中Andriod
WebView測試,有興趣的小夥伴可以關注一下哦!

** 推薦學習**

內容全面升級,4 個月 20+ 專案實戰強化訓練,資深測試架構師、開源專案作者親授 BAT 大廠前沿最佳實踐,
帶你一站式掌握測試開發必備核心技能( 對標阿里P6+,年薪50W+ )! 直推 BAT 名企測試經理,普遍漲薪 50%+!

閱讀原文