行為驅動模型-Behave

Tynam.Yang發表於2020-08-05

行為驅動開發英文名為Behave Driven Development,簡稱BDD,是一種敏捷開發方法,主要是從使用者的需求出發強調系統行為。將此模型借鑑到自動化測試中稱其為行為驅動測試模型,它是一種通過使用自然描述語言確定自動化測試指令碼的模型。也就是說,用例的寫法基本和功能測試用例的寫法類似,具有良好協作的益處。這種測試模型使每個人都可以參與到行為開發中,而不僅僅是程式設計師。每個測試場景都是一個獨立的行為,以避免重複,並且已有的行為可以重複使用。

目前在Python中最流行的 BDD 框架是Behave(這也是我們本節要講解的重點),它與其他基於 Gherkin 的 Cucumber 框架非常相似,當然還有其他BDD框架,比如pytest-bdd和radish等。

1、安裝Behave

Behave是Python語言的一個庫,在使用時需要匯入行為庫Behave,可以使用Python的匯入第三方庫命令安裝Behave,即pip install behave。

C:\Users\TynamYang>pip install behave
Collecting behave
  Downloading https://files.pythonhosted.org/packages/a8/6c/ec9169548b6c4cb877aaa6773408ca08ae2a282805b958dbc163cb19822d/behave-1.2.6-py2.py3-none-any.whl (136kB)
     100% |██████████████████████████████████| 143kB 139kB/s
Requirement already satisfied: six>=1.11 in c:\users\tynamyang\appdata\local\programs\python\python37-32\lib\site-packages (from behave) (1.13.0)
Collecting parse-type>=0.4.2
  Downloading https://files.pythonhosted.org/packages/1b/81/2a168b41acb57f1ea8e1e09937f585a0b9105557b13562ff8655fea81c09/parse_type-0.5.2-py2.py3-none-any.whl
Collecting parse>=1.8.2
  Downloading https://files.pythonhosted.org/packages/4a/ea/9a16ff916752241aa80f1a5ec56dc6c6defc5d0e70af2d16904a9573367f/parse-1.14.0.tar.gz
Installing collected packages: parse, parse-type, behave
    Running setup.py install for parse ... done
Successfully installed behave-1.2.6 parse-1.14.0 parse-type-0.5.2

C:\Users\TynamYang>

安裝完成後可以使用命令behave --lang-list檢視支援的語言:

C:\Users\TyanmYang>behave --lang-list
Languages available:
ar: العربية / Arabic
bg: български / Bulgarian
ca: català / Catalan
cs: Česky / Czech
cy-GB: Cymraeg / Welsh
da: dansk / Danish
de: Deutsch / German
en: English / English
en-Scouse: Scouse / Scouse
en-au: Australian / Australian
en-lol: LOLCAT / LOLCAT
en-pirate: Pirate / Pirate
en-tx: Texan / Texan
eo: Esperanto / Esperanto
es: español / Spanish
et: eesti keel / Estonian
fi: suomi / Finnish
fr: français / French
gl: galego / Galician
he: עברית / Hebrew
hr: hrvatski / Croatian
hu: magyar / Hungarian
id: Bahasa Indonesia / Indonesian
is: Íslenska / Icelandic
it: italiano / Italian
ja: 日本語 / Japanese
ko: 한국어 / Korean
lt: lietuvių kalba / Lithuanian
lu: Lëtzebuergesch / Luxemburgish
lv: latviešu / Latvian
nl: Nederlands / Dutch
no: norsk / Norwegian
pl: polski / Polish
pt: português / Portuguese
ro: română / Romanian
ru: русский / Russian
sk: Slovensky / Slovak
sr-Cyrl: Српски / Serbian
sr-Latn: Srpski (Latinica) / Serbian (Latin)
sv: Svenska / Swedish
tr: Türkçe / Turkish
uk: Українська / Ukrainian
uz: Узбекча / Uzbek
vi: Tiếng Việt / Vietnamese
zh-CN: 簡體中文 / Chinese simplified
zh-TW: 繁體中文 / Chinese traditional
C:\Users\TyanmYang>

在編寫測試用例時需要依靠這些關鍵字,下面會做具體說明。

2、Behave的使用

我們以登入頁面為例說明Behave的使用。因為行為驅動模型主要在國外運用,國內使用的還比較少,所以本節只做成功登入測試的示例演示。

1.搭建工程結構

首先,搭建一個基本的行為驅動工程結構,如圖所示。

 

說明:

l  features:存放場景檔案。

l  steps:features目錄下場景 .feature檔案對應的執行檔案。

l  environment.py:環境配置檔案。

l  report:存放測試報告檔案。

l  result:存放測試資料JSON檔案。

工程中各個目錄的作用將會在下文做具體說明。

 

2.編寫feature檔案

在features目錄下新建login. feature檔案,作為登入場景測試用例,在檔案中編寫測試用例。

根據登入的操作步驟,測試用例可寫成如下的形式:

Feature: 登入功能測試

    Scenario: 進入登入頁面
        When 開啟登入頁面【url】
        Then 進入登入頁面

    Scenario: 使用者成功登入
        When 輸入郵箱地址【郵箱地址】和密碼【密碼】並且登入
        Then 登入成功

上面示例中用到的關鍵字說明如下:

l  Feature:功能測試名稱

l  Scenario:場景名稱

l  When:可以理解為測試步驟

l  Then:預期結果

在測試場景中經常還會用到given(測試前提條件)和and(測試步驟和when類似)關鍵字。上面示例中的【url】、【郵箱地址】和【密碼】是動態變化的,所以需要以引數的形式傳入。

3.配置enviroment.py檔案

environment.py檔案主要用來定義一些測試執行前後的操作,比如啟動和退出瀏覽器,類似於單元測試框架裡的測試前置條件setUp和測試銷燬tearDown。例如,before_step(context, step) 和after_step(context, step) 是在每一個測試步驟之前和之後執行一次;before_scenario(context, scenario)和after_scenario(context, scenario) 是在每一個測試場景之前和之後執行一次;before_feature(context, feature)和after_feature(context, feature)是在每一個測試feature檔案之前和之後執行一次;before_all(context) 和after_all(context) 是在所有的測試之前和之後執行一次。

針對本示例,在測試feature檔案之前和之後新增預置條件和測試銷燬內容。使用方法before_feature(context, feature) 新增測試用例執行前的操作,使用方法after_feature(context, feature) 新增測試用例執行後的操作。

# -*- coding: utf-8 -*-

from selenium import webdriver


def before_feature(context, feature):
    context.driver = webdriver.Chrome()
    context.driver.maximize_window()

def after_feature(context, feature):
    context.driver.quit()

上述程式碼,將瀏覽器啟動並且最大化放在測試用例執行前的方法before_featrue中,將退出瀏覽器放在測試用例執行後的方法after_featrue中。在函式中有一個引數context,用於儲存資訊以及在不同的step中分享資訊,可以理解為超級全域性變數。 context在given、when和then三個level中都會執行,並且由Behave自動管理。

4.編寫steps

在steps目錄下新建login_steps.py檔案,用於存放登入頁面的操作,且所有的測試steps都必須放在steps目錄下,命名沒有要求。steps是通過修飾符來進行匹配的,修飾符是一串字串,如果feature檔案中scenario下使用的關鍵字和字串與steps中某一個step關鍵字和字串一致,則執行對應的step下的函式。

如下程式碼定義了開啟登入頁面{url}、進入登入頁面、輸入郵箱地址{email}和密碼{password}並且登入,登入成功4個step,與feature檔案中操作步驟的語言字串相匹配。

# -*- coding: utf-8 -*-

import time
from behave import *


@When('開啟登入頁面"{url}"')
def step_open(context, url):
    context.driver.get(url)
    time.sleep(10)

@Then('進入登入頁面')
def step_assert_open(context):
    title = context.driver.title
    assert title == "第一個專案"

@When('輸入郵箱地址"{email}"和密碼"{password}"並且登入')
def step_login(context, email, password):
    time.sleep(1)
    email_element = context.driver.find_element_by_id('email')
    email_element.send_keys(email)

    time.sleep(1)
    password_element = context.driver.find_element_by_name('password')
    password_element.send_keys(password)

    time.sleep(1)
    login_button_element = context.driver.find_element_by_id('btn-login')
    login_button_element.click()

@Then('登入成功')
def step_assert_login(context):
    time.sleep(1)
    login_text = context.driver.switch_to.alert.text
    assert login_text == "登入成功"

修飾符@given、@when、@then下的方法名以step_xxx命名方式實現,傳遞引數以大括號{引數名}來表示,當然還可以使用正規表示式來匹配。

根據steps的操作修改feature檔案,給對應的引數賦值,結果如下:

Feature: 登入功能測試

    Scenario: 進入登入頁面
        When 開啟登入頁面" http://localhost:63342/projectAutoTest/projectHtml/chapter1/period2/index.html"
        Then 進入登入頁面

    Scenario: 使用者成功登入
        When 輸入郵箱地址"tynam@test.com"和密碼"123"並且登入
        Then 登入成功

3、執行

在命令列模式下進入到BddTest目錄,直接執行behave命令,結果如下:

C:\Users\TynamYang\BddTest>behave
Feature: 登入功能測試 # login.feature:1

  Scenario: 進入登入頁面                                                                                      # login.feature:3
    When 開啟登入頁面"http://localhost:63342/projectAutoTest/projectHtml/chapter1/period2/index.html" # steps/login_steps.py:7 10.403s
    Then 進入登入頁面                                                                                         # steps/login_steps.py:13 0.011s

  Scenario: 使用者成功登入                          # login.feature:7
    When 輸入郵箱地址"tynam@test.com"和密碼"123"並且登入 # steps/login_steps.py:19 3.408s
    Then 登入成功                               # steps/login_steps.py:34 1.008s

1 feature passed, 0 failed, 0 skipped
2 scenarios passed, 0 failed, 0 skipped
4 steps passed, 0 failed, 0 skipped, 0 undefined
Took 0m14.830s
C:\Users\TynamYang\BddTest>

從執行結果中可以看出:

(1)測試功能Feature以及測試場景Scenario和測試步驟When、Then。

(2)測試每一步驟的耗時時間,總的耗時時間。

(3)每一個行程式碼在哪個檔案中的哪一行。

(4)測試結果統計,即feature、scenarios、steps通過、失敗及跳過。

 4、生成測試報告

Behave庫可以很好地與Allure結合生成測試報告,操作也很簡單,在本書6.6 Allure測試報告一節中有過詳細說明,使用方法都是相同的,在此就不做詳細說明。

生成測試報告時需要匯入allure-behave,使用pip命令:

pip install allure-behave

使用命令生成JSON格式的測試資料並儲存在result目錄下,即behave -f allure_behave.formatter:AllureFormatter -o result ./features。

C:\Users\TynamYang\BddTest>behave -f allure_behave.formatter:AllureFormatter -o result ./features
1 feature passed, 0 failed, 0 skipped
2 scenarios passed, 0 failed, 0 skipped
4 steps passed, 0 failed, 0 skipped, 0 undefined
Took 0m14.876s
C:\Users\TynamYang\BddTest>

在result目錄下生成JSON資料檔案,如圖11-3所示。

 

 

使用命令將result目錄下的JSON格式的測試資料轉換成測試報告並且儲存在report目錄下:allure generate ./result/ -o ./report/ --clean

C:\Users\TynamYang\BddTest>allure generate ./result/ -o ./report/ --clean
Report successfully generated to ./report
C:\Users\TynamYang\BddTest>

在report目錄下生成測試報告檔案,如圖11-4所示。

開啟index.html檢視生成的測試報告,如圖11-5所示。

 

以上內容來源於《Python Web自動化測試入門與實戰,從入門到入行》第11章第七節

讀書購買地址:https://item.jd.com/12656245.html

 

 

相關文章