行為驅動開發:一篇文章帶你用 Python 玩轉 BDD
相信大部分的人都聽說過 BDD,即:行為驅動開發,但並未涉及到它的使用方和專案實戰。
所以,本篇文章將大家全面瞭解 BDD 及實現方式,最後使用 Python BDD 框架落地到實際專案中去。
1. BDD 及優勢
BDD,行為驅動開發是 敏捷軟體開發 的一種技術,鼓勵軟體專案的所有成員之間的相互協助
傳統的軟體開發方式主要缺點包含:測試用例比較單一,導致覆蓋率不高;業務和產品不能夠全面瞭解產品的行為表現
BDD 的出現主要優勢有下面 2 點,主要體現在:
可以很好的減少專案成員之間的溝通成本,增加協作
BDD 能夠將上線之後的手工測試轉換為自動化測試,提升測試效率
2. 軟體開發流程
BDD 一般在產品需求文件稽核時就開始介入,產品或業務負責人提供產品需求文件的同時,會提供具體的業務場景行為
開發人員根據定義的行為場景,開發軟體,並編寫場景下面的測試程式碼
完成 BDD 先在本地進行自測,沒問題之後會提交到程式碼倉庫,最後通過 CI 去持續整合,測試通過之後才能上線
BDD 的軟體開發流程圖如下:
3. Gherkin 語言及 Features
Gherkin 是 BDD 框架 Cucumber 的功能性語言,能夠通過自然語言,支援多國語言,描述一個具體的需求
Gherkin 語言使用的是主要英文關鍵詞包含:Scenario、Given、when 、And、Then 等;這些關鍵詞可以轉換成中文關鍵詞,比如:場景、加入、當、那麼等。
Features 功能檔案一般命名為:*.feature,此檔案可以編寫具體的需求行為,最後可以支援自動化測試
功能檔案的編寫規範如下:
空格或者製表符用於縮排
每一行以 BDD 框架中預設的關鍵字開頭
使用 # 符號在檔案內進行註釋
無論是中文或英文編寫,「 : 」符號只能用英文格式的冒號,否則執行的時候會報錯
下面是一個簡單的功能檔案,描述的是兩個數相加的邏輯:
# 功能檔案(英文)
Feature: Adding
Scenario: Adding two numbers
Given the input "1+1"
When the calculator is run
Then output should be "2"
4. Behave
Behave 是 Python 的 BDD 框架,並且可以使用命令列工具進行測試,使用 pip 可以很方便地進行安裝
# 安裝 behave 框架
pip3 install behave
編寫完功能檔案之後,就可以使用 behave 命令直接執行了
# 直接執行,控制檯檢視結果
behave
# 以中文來執行測試
behave --lang=zh-CN
5. 實戰一下
下面以自動化測試 Google 搜尋為例,來說說具體的使用方式
第 1 步,編寫 Features 檔案,以中文為例
使用 behave --lang-help zh-CN
命令檢視所有的中文關鍵字:
接著,利用這些關鍵字結合具體行為,編寫的 Feature 檔案如下:
功能: Google搜尋模組測試
場景大綱: Google搜尋一個關鍵字功能
假如 搜尋框輸入一個關鍵字 <keyword>
當 點選搜尋按鈕
那麼 頁面標題應該為 <title>
例子:
| keyword | title |
| Python | Python - Google 搜尋 |
| AirPython | AirPython - Google 搜尋 |
需要注意的是,檔案中定義了兩個引數,即:keyword 和 title
實際專案中大部分的自動化測試都是基於資料驅動引數化,因此需要搭配「 場景大綱+例子」一起使用。
第 2 步,編寫 step 檔案
在 Features 同級目錄下新建一個 steps 資料夾,接著,在此資料夾下再新建一個 step.py 檔案
然後,就可以對照第 1 步編寫的 Features 檔案編寫測試用例了
藉助 @given、@when、@then 裝飾器,將文字內容和引數對應上
最後,使用 Selenium 定義的 API 方法操作元素即可
from time import sleep
from selenium.webdriver.common.keys import Keys
from behave import *
@given(u'搜尋框輸入一個關鍵字 {keyword}')
def step_impl(context, keyword):
element_input = context.driver.find_element_by_name('q')
element_input.clear()
print("準備輸入")
element_input.send_keys(keyword)
@when(u'點選搜尋按鈕')
def step_impl(context):
# 模擬Enter鍵
context.driver.find_element_by_name("q").send_keys(Keys.ENTER)
sleep(1)
@then(u'頁面標題應該為 {title}')
def step_impl(context, title):
assert context.driver.title == title
需要指出的是,方法名中的第一個引數 context 是一個全域性的字典,可以在步驟方法之間傳遞資料
第 3 步,編寫配置環境檔案 environment.py
環境配置檔案定義了測試指令碼執行過程中,具體步驟、場景之前和之後要執行的內容
比如,我們在 before_feature 方法( 每一個 feature 場景執行之前執行 )前初始化 ChromeDriver,開啟目標網站首頁;然後在 after_feature 方法( feature 場景測試完成之後執行 )後關閉瀏覽器
def before_feature(context, feature):
context.driver = webdriver.Chrome()
context.driver.get("https://www.google.com/")
def after_feature(context, feature):
context.driver.quit()
第 4 步,轉換 cucumber 測試報告
為了保證下一步在 Jenkins 中能正常顯示測試報告,需要將 behave 生成的測試報告轉換為 cucumber 相容的 json 測試報告
首先,安裝依賴 behave2cucumber
# json測試報告檔案轉換
pip3 install behave2cucumber
然後,在上一步的環境配置檔案中重寫 after_all 方法,將 behave 格式的測試報告轉換為 cucumber 相容的測試報告
def after_all(context):
"""
所有測試完成之後執行
注意:behave1.2.6生成的json沒法正常轉換為cucumber相容的json報告,建議降級為:1.2.5
:param context:
:return:
"""
# 轉換
with open('./test_report.json',encoding='utf-8') as behave_json:
# 格式轉換
cucumberJson = behave2cucumber.convert(json.load(behave_json))
jsonStr = json.dumps(cucumberJson)
# 寫入
jsonReport = open(r'./report/jsonReport.json', 'w',encoding='utf-8')
jsonReport.write(jsonStr)
jsonReport.close()
需要注意的是,behave 最新版本轉成的 cucumber 測試報告,在 Jenkins 中沒法展示出來,建議降低為 1.2.5 版本
第 5 步,本地執行
在 Features 檔案同級目錄下,執行下面的命令,將在本地生成格式化後 json 格式的測試報告
# 以中文語言的形式在本地執行
# 在本地產生測試報告
behave --lang=zh-CN -f json.pretty -o './test_report.json'
第 6 步,持續整合
首先搭建 Jenkins 環境,然後安裝 Cucumber reports 外掛
https://plugins.jenkins.io/cucumber-reports
接著,新建一個 Freestyle project 的任務,新增構建步驟 - Execute Shell,寫入要執行的 Python 指令碼
# 開啟目標專案位置
cd /Users/xingag/Desktop/xag/git/marks/Python/測試/Demo/feature_chrome
# 執行測試,並生成測試報告
behave --lang=zh-CN -f json.pretty -o './test_report.json'
最後,新增構建後的操作 - Cucumber reports,指向第 4 步轉換後的 json 格式的測試報告
第 7 步,構建
構建後,測試指令碼會自動進行執行,然後會在結果欄生成視覺化測試報告
6. 最後
文章只是通過 Python 中的 Behave 框架來談 BDD 在實際專案中的用法
如果你想在 Java 或者 Golang 專案中使用,可以直接 JBehave 或者 GoDog 框架來實現,除了語法外,基本操作方法類似。
文中的完全程式碼我已經上傳到後臺,檢視個人資料,獲取聯絡方式後,回覆關鍵「 BDD 」獲取全部的原始碼檔案。
以上便是我今天的分享,如果對你有幫助,可以幫忙轉發一下。
相關文章
- Python 實現行為驅動開發 (BDD) 自動化測試詳解Python
- 一篇長文帶你在python裡玩轉Json資料PythonJSON
- 推薦一款基於業務行為驅動開發(BDD)測試框架:Cucumber!框架
- 一篇文章帶你瞭解介面自動化
- 一篇文章帶你搞定HashTable
- 一篇文章帶你瞭解Python常用自動化測試框架——PytestPython框架
- 一篇文章帶你「重新認識」執行緒上下文切換怎麼玩兒執行緒
- 帶你重新“玩轉”FlutterFlutter
- 一篇文章帶你吃透 Docker 原理Docker
- 一篇文章帶你認識 SpringSecuritySpringGse
- 一篇文章帶你入門Zookeeper
- 一篇文章帶你瞭解Python基礎測試工具——UnitTestPython
- 一篇文章帶你快速入門createjsJS
- 一篇文章帶你掌握Web自動化測試工具——SeleniumWeb
- 一篇文章帶你瞭解——Kotlin協程Kotlin
- 帶你玩轉小程式開發實踐|含直播回顧視訊
- 手把手帶你玩轉LinuxLinux
- 手摸手帶你玩轉Xcode ExtensionsXCode
- CryptAssist-帶你玩轉幣圈
- 什麼是Python爬蟲?一篇文章帶你全面瞭解爬蟲Python爬蟲
- 使用者行為驅動開發(UserAction Driven Development)dev
- 一篇文章玩透awk
- # 一篇文章帶你入門軟體測試
- 一篇文章帶你掌握效能測試工具——JmeterJMeter
- 一篇文章帶你弄懂Kerberos的設計思路ROS
- 一篇文章帶你讀懂Redis的哨兵模式Redis模式
- MySQL十種鎖,一篇文章帶你全解析MySql
- 一篇文章帶你瞭解HTML5 MathMLHTML
- 一篇文章帶你搞定 SpringBoot 整合 Swagger2Spring BootSwagger
- 一篇文章帶你瞭解和使用Promise物件Promise物件
- 一篇文章帶你徹底搞懂join的用法
- 一篇文章帶你搞懂 etcd 3.5 的核心特性
- 一篇文章帶你初步瞭解—CSS特指度CSS
- 一篇文章帶你用jquery mobile設計顏色拾取器jQuery
- 一篇文章帶你更深入瞭解區塊鏈有哪些應用?區塊鏈
- 一篇文章帶你使用 Python 將 txt 文件內容儲存到 excel 表中PythonExcel
- 一篇文章帶你瞭解高可用架構分析架構
- 一篇文章帶你瞭解HTML格式化元素HTML