robotframework-自動化測試-實例8(數(shù)據(jù)驅(qū)動)

前情介紹:
在自動化測試框架中投剥,數(shù)據(jù)驅(qū)動的意思是指定的是測試用例或者說測試套件是由外部數(shù)據(jù)集合來驅(qū)動的框架。

數(shù)據(jù)集合(也可稱之為數(shù)據(jù)來源)可以是任何類型的數(shù)據(jù)文件比如xls坦康,xlsx浑度,csv等等字支,甚至可以是數(shù)據(jù)庫中的表雷厂⊥镌觯總之,是一個放數(shù)據(jù)的地方就對了罗侯。

核心思想就是數(shù)據(jù)和測試代碼分離器腋,及時當(dāng)測試數(shù)據(jù)發(fā)生大量變化的情況下測試代碼(或者說測試用例)可以保持不變。

最常見的例子是需要用多個不同的賬號和密碼來登陸某個郵箱钩杰,來驗證哪些是有效的值纫塌,哪些是錯誤的值,或者哪些值可以導(dǎo)致出錯等等讲弄。

數(shù)據(jù)驅(qū)動并不是和關(guān)鍵字驅(qū)動等水火不相容的一種驅(qū)動模式措左,我的理解是,兩者更像是互相協(xié)助的關(guān)系避除。甚至你把數(shù)據(jù)看成一種關(guān)鍵字也未嘗不可怎披。

練習(xí)環(huán)境配置
實例1(UI自動化-百度搜索)
實例2(有效登錄)
實例3(無效登錄)
實例4 (Appium)
實例5 (連接mysql數(shù)據(jù)庫)
實例6 (GET/POST請求)
實例7(接口API測試)
Appium Error總結(jié)
robotframework Error總結(jié)

測試需求:
為了更純粹一點(diǎn)的看到RF中的數(shù)據(jù)驅(qū)動的模式,這次采用了官方的Demo做一個講解瓶摆。
對 一個 簡單計算器的Calculator.py進(jìn)行測試凉逛,Calculator.py的代碼如下(寫的漂亮):

class Calculator(object):
    BUTTONS = '1234567890+-*/C='

    def __init__(self):
        self._expression = ''

    def push(self, button):
        if button not in self.BUTTONS:
            raise CalculationError("Invalid button '%s'." % button)
        if button == '=':
            self._expression = self._calculate(self._expression)
        elif button == 'C':
            self._expression = ''
        elif button == '/':
            self._expression += '//'    # Integer division also in Python 3
        else:
            self._expression += button
        return self._expression

    def _calculate(self, expression):
        try:
            return str(eval(expression))
        except SyntaxError:
            raise CalculationError('Invalid expression.')
        except ZeroDivisionError:
            raise CalculationError('Division by zero.')


class CalculationError(Exception):
    pass

測試設(shè)計:
數(shù)據(jù)驅(qū)動引入了一個非常有效的概念,即“模板”概念群井,在很多測試場景下状飞,測試人員輸入的操作是有一定重復(fù)性的,區(qū)別只在于輸入的數(shù)據(jù)书斜,還是以登陸為例诬辈,除了包含正常的測試用例,還需要有其他的異常用例覆蓋才能保證登陸接口的正確性荐吉”涸悖基于橫向構(gòu)造不同的測試數(shù)據(jù)輸入來判斷不同的測試結(jié)果,即為數(shù)據(jù)驅(qū)動样屠。行為可以封裝成模板穿撮。

先用一個CalculatorLibrary庫來進(jìn)行封裝需要做的測試步驟,對應(yīng)的驗證和錯誤處理

  • push button
  • push buttons
  • result_should_be
  • should_cause_error

再在RF中設(shè)計兩個模板來使用上面庫中的方法痪欲。

不同的輸入數(shù)據(jù)則在測試用例中體現(xiàn)悦穿。

測試實現(xiàn):
1 . 編寫CalculatorLibrary.py文件,代碼示例如下(最漂亮的還是寫注釋的地方勤揩,嘖嘖嘖):

from calculator import Calculator, CalculationError


class CalculatorLibrary(object):
    """Test library for testing *Calculator* business logic.

    Interacts with the calculator directly using its ``push`` method.
    """

    def __init__(self):
        self._calc = Calculator()
        self._result = ''

    def push_button(self, button):
        """Pushes the specified ``button``.

        The given value is passed to the calculator directly. Valid buttons
        are everything that the calculator accepts.

        Examples:
        | Push Button | 1 |
        | Push Button | C |

        Use `Push Buttons` if you need to input longer expressions.
        """
        self._result = self._calc.push(button)

    def push_buttons(self, buttons):
        """Pushes the specified ``buttons``.

        Uses `Push Button` to push all the buttons that must be given as
        a single string. Possible spaces are ignored.

        Example:
        | Push Buttons | 1 + 2 = |
        """
        for button in buttons.replace(' ', ''):
            self.push_button(button)

    def result_should_be(self, expected):
        """Verifies that the current result is ``expected``.

        Example:
        | Push Buttons     | 1 + 2 = |
        | Result Should Be | 3       |
        """
        if self._result != expected:
            raise AssertionError('%s != %s' % (self._result, expected))

    def should_cause_error(self, expression):
        """Verifies that calculating the given ``expression`` causes an error.

        The error message is returned and can be verified using, for example,
        `Should Be Equal` or other keywords in `BuiltIn` library.

        Examples:
        | Should Cause Error | invalid            |                   |
        | ${error} =         | Should Cause Error | 1 / 0             |
        | Should Be Equal    | ${error}           | Division by zero. |
        """
        try:
            self.push_buttons(expression)
        except CalculationError as err:
            return str(err)
        else:
            raise AssertionError("'%s' should have caused an error."
                                 % expression)

2 . RF中創(chuàng)建一個Data Driven的項目,測試用例和模板的名字的結(jié)構(gòu)如下:

10.jpg

在項目那一級導(dǎo)入CalculatorLibrary庫秘蛔,導(dǎo)入后CalculatorLibrary里的方法都可以被作為關(guān)鍵字使用陨亡。

  • 將剛才的CalculatorLibrary.py文件放在和這個項目同一個目錄下傍衡。
  • 點(diǎn)擊Library按鈕后輸入文件名即可導(dǎo)入。
11.jpg

3 . 最下方的兩個齒輪形狀的就是模板形式负蠕,可以通過New User Keyword的方式來創(chuàng)建(創(chuàng)建好一個項目后蛙埂,在項目名上右鍵則可創(chuàng)建User Keyword),對于計算器測試來說遮糖,也就兩種結(jié)果绣的,一種是輸入正常的值得到正常的結(jié)果,一種是輸入異常的值得到錯誤提示
Calculator - 正常的值的測試步驟

Calculator.jpg

Calculator should fail-異常的值的測試步驟

should fail.jpg

4 .構(gòu)造測試用例來進(jìn)行測試欲账。
加減乘除屡江,輸入異常,輸入不允許的值(一串字符串赛不,空值惩嘉,除以0),比如:

Calculator error.jpg

最終代碼如下:

*** Settings ***
Documentation     Example test cases using the data-driven testing approach.
...
...               The _data-driven_ style works well when you need to repeat
...               the same workflow multiple times.
...
...               Tests use ``Calculate`` keyword created in this file, that in
...               turn uses keywords in ``CalculatorLibrary.py``. An exception
...               is the last test that has a custom _template keyword_.
...
...               Notice that one of these tests fails on purpose to show how
...               failures look like.
Test Template     Calculate
Library           CalculatorLibrary.py

*** Test Cases ***    Expression    Expected
Addition              12 + 2 + 2    16
                      2 + -3        -1

Subtraction           12 - 2 - 2    8
                      2 - -3        5

Multiplication        12 * 2 * 2    48
                      2 * -3        -6

Division              12 / 2 / 2    3
                      2 / -3        -1

Failing               1 + 1         3

Calculation error     [Template]    Calculation should fail
                      kekkonen      Invalid button 'k'.
                      ${EMPTY}      Invalid expression.
                      1 / 0         Division by zero.

*** Keywords ***
Calculate
    [Arguments]    ${expression}    ${expected}
    Push buttons    C${expression}=
    Result should be    ${expected}

Calculation should fail
    [Arguments]    ${expression}    ${expected}
    ${error} =    Should cause error    C${expression}=
    Should be equal    ${expected}    ${error}    # Using `BuiltIn` keyword

CC先生說:RF的數(shù)據(jù)驅(qū)動看起來的確是非常簡潔的踢故,采用了封裝的思維文黎,將更多的操作都封裝到庫,模板中殿较,干凈利落的實現(xiàn)了測試數(shù)據(jù)和測試步驟的分離耸峭。大熱天的,看起來還真是清爽~~~

干凈 利落
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淋纲,一起剝皮案震驚了整個濱河市劳闹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌帚戳,老刑警劉巖玷或,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異片任,居然都是意外死亡偏友,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門对供,熙熙樓的掌柜王于貴愁眉苦臉地迎上來位他,“玉大人,你說我怎么就攤上這事产场《焖瑁” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵京景,是天一觀的道長窿冯。 經(jīng)常有香客問我,道長确徙,這世上最難降的妖魔是什么醒串? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任执桌,我火速辦了婚禮,結(jié)果婚禮上芜赌,老公的妹妹穿的比我還像新娘仰挣。我一直安慰自己,他們只是感情好缠沈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布膘壶。 她就那樣靜靜地躺著,像睡著了一般洲愤。 火紅的嫁衣襯著肌膚如雪颓芭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天禽篱,我揣著相機(jī)與錄音畜伐,去河邊找鬼。 笑死躺率,一個胖子當(dāng)著我的面吹牛玛界,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悼吱,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼慎框,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了后添?” 一聲冷哼從身側(cè)響起笨枯,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遇西,沒想到半個月后馅精,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粱檀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年洲敢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茄蚯。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡压彭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出渗常,到底是詐尸還是另有隱情壮不,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布皱碘,位于F島的核電站询一,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜健蕊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一缓醋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绊诲,春花似錦、人聲如沸褪贵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脆丁。三九已至世舰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間槽卫,已是汗流浹背跟压。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歼培,地道東北人震蒋。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像躲庄,于是被迫代替她去往敵國和親查剖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理噪窘,服務(wù)發(fā)現(xiàn)笋庄,斷路器,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 22年12月更新:個人網(wǎng)站關(guān)停倔监,如果仍舊對舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,165評論 22 257
  • 文章來自:http://blog.csdn.net/mj813/article/details/52451355 ...
    好大一只鵬閱讀 9,189評論 2 126
  • 前情介紹:在做自動化測試的時候直砂,通常現(xiàn)在都是針對于B/S架構(gòu)系統(tǒng)的測試浩习,因為現(xiàn)在Saas很流行嘛静暂,都希望即開即用型...
    CC先生之簡書閱讀 6,504評論 9 9
  • 1.問:你在測試中發(fā)現(xiàn)了一個 bug ,但是開發(fā)經(jīng)理認(rèn)為這不是一個 bug 瘦锹,你應(yīng)該怎樣解決籍嘹。 首先,將問題提...
    qianyewhy閱讀 9,236評論 4 123