行為驅動模型-Behave
行為驅動開發英文名為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 輸入郵箱地址"[email protected]"和密碼"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 輸入郵箱地址"[email protected]"和密碼"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
&n