Behave是一個用于行為驅動開發 (Behavior-Driven Development, BDD) 的 Python 庫。使用 Behave,可以編寫自然語言格式的使用場景來描述軟件的行為,然后用 Python 實現這些場景下的步驟,形成可直接運行的測試。
Behave的目標是幫助用戶、開發人員和QA人員通過讓他們寫出更易于理解的測試用例來更好地理解和構建軟件產品。Behave使用Gherkin語言來編寫測試用例,該語言是一種自然語言,易于理解,并且可以很好地與非技術人員共享和交流測試結果。
Behave提供了一種將業務邏輯和測試邏輯分離的方法,因此它可以使測試代碼更加可讀,可維護和可重用。Behave支持多種輸出格式,包括HTML,JSON和JUnit XML,并且可以與Selenium等其他Python測試框架結合使用。
## Behave在Python BDD中的地位
BDD的框架中最流行的當屬 Cucumber 了,作為描述BDD的領域特定語言(DSL)Gherkin ,一開始就是開發給Cucumber使用的,Cucumber官方提供了很多語言的支持,包括Java,Node.js , Ruby 等。
Cucumber沒有直接提供Python語言的庫,官方推薦使用半官方的庫 Behave, 所謂半官方就是不是 Cucumber官方開發和維護, 但是使用了Cucumber的組件。

基于Python的BDD框架很多, 到目前使用比較多的應該是pytest-bdd和Behave, pytest-bdd的優勢是基于 pytest,可以整合單元測試和功能測試。關于pytest-bdd的介紹可以參考:
[pytest-bdd快速示例和問題解決](https://blog.csdn.net/oscar999/article/details/134388175)
## 環境準備:安裝 behave 和 selenium
本篇的示例需要安裝兩個模塊 behave 和 selenium,其中selenium是用于Web端自動化測試的,因為本篇使用behave和selenium進行一個百度頁面搜索的測試。
### 關于Selenium
Selenium是一個自動化測試工具,可以用于測試Web應用程序,支持多種語言(Java、C#、Python等)。Selenium可以模擬用戶在網頁上的行為,如點擊、填寫表單等操作,自動化地進行測試,從而提高測試效率和準確性。Selenium的核心是WebDriver,它可以驅動各種瀏覽器進行測試,并提供了豐富的API接口,方便管理和執行測試用例。Selenium還支持分布式測試、并行測試和測試結果的自動化分析等功能,可用于單元測試、集成測試和系統測試等場景。由于Selenium的開源和廣泛應用,有很多社區和第三方庫支持,可方便地應用于不同的項目和環境。
### 安裝擴展
可以使用 `pip show behave` 和 `pip show selenium` 查看是否安裝了這兩個模塊,如果沒有安裝,使用如下命令進行安裝:
```
pip install behave
pip install selenium
```
## 測試示例和目錄結構
目錄結構其實沒有特別的要求,這里遵循易于管理的原則,定義目錄結構如下:
```
├────features/ # 用戶場景
│ ├────baidu.feature # 用戶規格
│ ├────steps
│ │ ├────test_baidu.py # 步驟函數
```
## 步驟
這里的步驟很簡單,包括三步:
1. 編寫場景文件。在“features”的目錄下創建后綴名為.feature文件,描述測試情景。
2. 編寫場景步驟。
3. 測試。
## 測試場景與代碼文件
這里測試在百度上進行搜索的功能, 各文件的內容如下:
1. 場景文件 baidu.feature
```
Feature: 百度搜索
Scenario: 搜索關鍵詞
Given 關鍵詞 behave
When 打開百度頁面
And 輸入關鍵詞
And 點擊百度一下按鈕
Then 頁面標題中應包含關鍵詞
```
2. 場景步驟 test_baidu.py
```
from behave import given, when, then
from selenium import webdriver
from time import sleep
@given('關鍵詞 {keyword}') # 對應步驟 Given 關鍵詞 behave, 參數放在{}中
def step_impl(context, keyword): # context是上下文對象,有參數的話,加上對應參數
context.keyword = keyword # 將參數綁定上下文對象,以便其他步驟使用
@when('打開百度頁面')
def step_impl(context):
context.driver = driver = webdriver.Chrome() # 同樣綁定上下文對象
driver.implicitly_wait(10)
driver.get('https://www.baidu.com')
@when('輸入關鍵詞')
def step_impl(context):
context.driver.find_element('id', 'kw').send_keys(context.keyword)
@when('點擊百度一下按鈕')
def step_impl(context):
context.driver.find_element('id', 'su').click()
sleep(0.5)
@then('頁面標題中應包含關鍵詞')
def step_impl(context):
assert context.keyword in context.driver.title
```
整個測試用例包含四個步驟:
1. 給定關鍵詞:用 @given 裝飾器定義了一個關鍵詞的步驟,傳入一個參數 keyword,將其保存到 context 對象中,以便后續步驟可以使用。
2. 打開百度頁面:用 @when 裝飾器定義了一個打開頁面的步驟,創建了一個 Chrome 瀏覽器并打開百度首頁。
3. 輸入關鍵詞:用 @when 裝飾器定義了一個輸入關鍵詞的步驟,找到頁面上的搜索框并輸入之前給定的關鍵詞。
4. 點擊百度一下按鈕,用 @when 裝飾器定義了一個點擊按鈕的步驟,找到頁面上的搜索按鈕并點擊。
5. 頁面標題中應包含關鍵詞:用 @then 裝飾器定義了一個標題驗證的步驟,驗證頁面標題是否包含之前給定的關鍵詞。
在 Behave 中,“given-when-then”是常用的測試步驟流程模式,用來描述測試場景和測試步驟,其中 given 表示給定前置條件,when 表示觸發動作,then 表示驗證結果。整個測試用例包含了完整的測試步驟和斷言,可通過運行 Behave 測試框架來執行測試用例并輸出結果
3. 命名行切換到 features目錄, 運行 `behave `命令。
測試的時候會新開一個Chrome窗口, 打開baidu的網址,在搜索框自動輸入 behave, 嚴重完成關閉窗口, 在控制臺會打印測試的步驟以及測試的結果。

在執行 Behave 測試用例后,Behave 會自動輸出測試結果,結果包括了測試用例總數、通過數和失敗數等信息。一個典型的 Behave 測試結果如下所示:
~~~
復制插入1 feature passed, 0 failed, 0 skipped
1 scenario passed, 0 failed, 0 skipped
4 steps passed, 0 failed, 0 skipped, 0 undefined
Took 0m3.204s
復制插入
~~~
其中,feature 表示測試用例模塊數量,scenario 表示測試用例數量,steps 表示測試步驟數量,未定義的步驟表示測試用例中定義了但未實現或未完成的步驟。如果測試用例執行失敗,會在結果中輸出失敗信息,包括具體的失敗原因和錯誤堆棧等。在 Behave 中,測試結果可通過各種格式的報告來生成,如HTML、JSON、XML等。比如結合allure 生成更易閱讀的測試報告,報告的格式可以是JSON 格式,也可以是在線的Web網頁。
## 參考
* [https://github.com/behave/behave](https://github.com/behave/behave)
* Allure官方文檔 :[https://docs.qameta.io/allure/#_behave](https://docs.qameta.io/allure/#_behave)
* [https://cucumber.io/docs/installation/?sbsearch=python](https://cucumber.io/docs/installation/?sbsearch=python)
*****
*****
- 前言
- 1.入門篇
- Python介紹
- 安裝與使用
- Python開發利器之VS Code
- 模塊安裝
- 命令行
- 一次Python無法安裝模塊的問題探索與解決之旅
- 命令運行
- Conda
- 下載地址
- 2.基礎篇
- 基礎語法
- 輸入與輸出
- with as的用法
- 注釋
- Python命令行參數
- 編碼
- 變量類型
- 列表遍歷
- 運算符
- 表達式語句
- 條件
- 循環
- 日期和時間
- 函數
- 高級語法
- @符號-裝飾器
- 模塊和包
- name
- init.py
- 錯誤和異常
- 面向對象
- 3.專題篇
- 常用功能
- Python 字符串連接
- python web
- Python CGI編程
- Python OAuth2
- 認證 Flask-HTTPAuth
- 常用命令
- 內置函數
- dir()
- print(f)
- 標準模塊
- sys
- pickle-數據序列化
- os
- IO(輸入輸出)
- 鍵盤輸入
- 文件讀寫
- 測試
- Python測試框架之pytest快速入門
- pytest-bdd快速示例和問題解決
- 基于pytest-bdd的項目目錄結構和命名規范
- python BDD 的相關概念
- Behave介紹和快速示例
- Python BDD之Behave測試報告
- Python BDD 框架比較之 pytest-bdd vs behave
- pytest進階
- Flask + pytest測試
- 參考網址
- pytest-bdd進階
- hehave進階
- 測試路徑
- python + selunium
- HTML 根據多層CSS 查找元素
- 等待執行
- 使用text 查找 span
- pytest如何在控制臺輸出
- 4.問題篇
- pip pip3 及區別
- TypeError: can only concatenate str (not "NoneType") to str
- 5.實戰篇
- matplotlib-繪圖包
- 導入類
- 命名規范
- 模塊查找
- 6.進階篇
- Flask
- Flask介紹
- Flask擴展模塊
- Flask-Login
- 問題
- Jinja2
- Flask-RESTful
- Flask-JWT-Extended
- WSGI
- Flask-SQLAlchemy
- 部署
- Flask VS Django
- Flask Web
- Flask + Vue
- Flask實戰
- Flask 標準目錄結構
- Blueprints
- 參考
- FastAPI 測試
- https 證書 Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate