BDD行為驅動開發是從用戶視角描述我需要哪些特性,我們的驗證場景是什么,保證文檔與代碼的統一、設計與測試的統一、開發出更符合需求的測試用例
BDD分為fixture(特性) scenario(場景) given(前置條件) when(用戶操作) then(預期結果)
fixture(特性):是向最終用戶或其他涉眾提供的一項功能,以支持他們實現業務目標所需的功能。
scenario(場景):用戶在訪問應用時,用戶和應用之間有多種條件需要滿足,每一種不同的情況都對應不同的場景,簡短的聲明性句子來總結這個例子的特別之處
given(前置條件):在測試操作前有哪些先決條件?應該定義出所有的但不場景該場景要求范圍的先決條件,given主要為后面的測試主體服務
when (用戶操作):用戶做了哪個操作,輸入了哪些數據
then (預期結果):回應行操作的預期結果,用戶做了操作后會觸發系統產生什么樣的變化、輸出的數據是什么
那么我們怎么將playwright pytest BDD結合起來書寫自動化用例
1、下載插件pytest-bdd
pip insall pytest-bdd
2、創建.feature文件,每個feature文件中僅有一個Feature描述
@hotlink @shop Feature: As a new user, I want to be order a t-shirt, In order to buy a t-shirt, I must register my account #background每個場景相同的前置部分 Background: Given Sean 打開網站首頁 Scenario: 我登錄購物網站后按照購物流程進行下單 Given Sean 登錄xx購物網站 And Sean 打開了T-shirt 分類 When Sean 選了一件T-shirt加入購物車 And Sean 完成了下單 When Sean 查看個人資料訂單頁面 Then Sean 訂單頁面有T-shirt訂單
3、將feature文件中的given(前置條件) when(用戶操作) then(預期結果)轉化為POM中封裝的頁面元素操作,(pom封裝如下https://www.cnblogs.com/mumu-lin/p/15585133.html)
也可以轉換未封裝的元素操作
import allure from pytest_bdd import ( given, scenario, then, when )
# 需要從pytest_bdd中導入given、when、then等 from page_objects.registation.registration_object import RegistrationPage from page_objects.shop.shop_object import ShopPage from utils.bdd_helper import BddHelper feature_path = BddHelper.get_feature_path("shop/shop_order_t_shirt.feature")
@scenario(feature_path, '我登錄購物網站后按照購物流程進行下單')
def test_shop_order_t_shirt():
"""我按照購物流程進行下單, 新用戶注冊等操作."""
pass
#使用scenario decorator修飾的函數的行為類似於正常的測試函數,它們將在所有場景步驟之后執行。但是更建議將邏輯僅包含在given、when then中
@when('Sean 完成了下單') def finish_order_after_registration(page): """Sean 完成了下單.""" ShopPage(page).finish_order_after_registration() @given('Sean 打開了T-shirt 分類') def open_t_shirt_category(page): """Sean 打開了T-shirt 分類.""" ShopPage(page).open_t_shirt_category() @given('Sean 打開網站首頁') def open_site(page): """Sean 打開網站首頁.""" ShopPage(page).open_site() @when('Sean 查看個人資料訂單頁面') def open_profile_order_page(page): """Sean 查看個人資料訂單頁面.""" ShopPage(page).open_profile_order_page()
4、執行測試用例
使用@scenario裝飾器的函數其實就是一個測試用例,所以我們只需要運行含有@scenario即可運行我們的測試用例。注意:pytest中檢索測試用例的規則是 文件名、測試用例、類名默認要以Test開頭。
如果不想按照每個feature文件都進行注冊的話,可以按照目錄進行注冊。然后使用pytest 執行當前文件即可運行對應的features
#方式一:獲取當前features目錄下的所有feature scenarios(feature_path) #方式二:獲取某個目錄或某個features,這些路徑可以是要素文件或要素文件夾。 scenarios(feature_path, 'other_features/some.feature', 'some_other_features') #方式三:僅綁定有個場景 @scenario(feature_path, '進入首頁后, 查看附件數量') def test_shop_attachment_count(): pass
if __name__ == '__main__':
pytest.main(['-v', 'D:\\jiaoben\\ui-test-regression-main\\tests\step_definition\\shop\\test_bdd_shop.py'])
從個人感覺上來說,BDD用例的given(前置條件) when(用戶操作) then(預期結果)如何封裝和存放,維護起來更方便,這個是需要慢慢摸索和調整的,避免在不同的文件夾下封裝了多個相同的step
參考資料:
https://pypi.org/project/pytest-bdd/