Python BDD 框架比較之 pytest-bdd vs behave

pytest-bddbehave是 Python 的兩個流行的 BDD 測試框架,兩者都可以用來編寫用戶故事和可執行的測試用例,
具體選擇哪一個則需要根據實際的項目狀況來看。
先簡單看一下兩者的功能:
pytest-bdd

  1. 基于pytest測試框架,可以與pytest的其他功能(例如 fixtures)一起使用。
  2. 提供了一種緊湊的步驟定義方式,可以通過裝飾器定義并重復使用步驟。
  3. 支持參數化的測試,這樣可以用同一組步驟進行多組數據的測試。

behave

  1. 基于 Python 的unittest測試框架。
  2. behave的步驟文件更加接近純文本形式,對非編程人員更友好。
  3. 支持使用environment.py文件來定義在整個 test suite 運行前后需要進行的操作。

hehave

以下是behave的一些優點和特性:

  1. 適用于非技術團隊成員:使用 Gherkin 語言,可以撰寫更接近自然語言的測試場景描述,使得產品經理、商業分析師等非技術團隊成員也能夠理解、修改或編寫測試場景。

  2. 環境控制behave提供了在測試運行前后設置和清理環境的功能,例如數據庫初始化或數據清理等,只需要在environment.py文件里定義相應的函數即可。

  3. 可讀性強和可維護性高behave強調的是實現從用戶角度去描述系統行為的測試,這使得測試和實際用戶需求更加貼合,增加了測試的可讀性。而且將測試用例編寫為人類可讀的語言,可以提高代碼的可維護性。

  4. 創造可共享的步驟:可以為常用的操作創建可重用的步驟,這樣就能寫出更加簡潔、易于維護的測試代碼。

  5. 對標/兼容 Cucumber:behave的 Gherkin 語言實現與寬廣使用的 Cucumber 測試框架非常接近,這一點在遷移到或從 Cucumber 環境中遷出時會很有用。

  6. 與其他 Python 測試框架相容behave可與unittestdoctestnosepy.test等 Python 測試工具完美集成。

綜上所述,behave提供了一種高度可讀、可共享、適合大規模測試及非技術團隊成員的 BDD 測試工具。

pytest-bdd 與 behave的比較

behavepytest-bdd都是 Python 下常用的為支持 BDD(行為驅動開發)流程而設計的測試框架,它們都采用.feature文件來描述行為,并使用相似的 Gherkin 語言語法進行描述。它們的.feature文件的格式大致上是相同的,但是在實際的使用和處理上可能會有一些細微差別。

以下是behavepytest-bdd來處理.feature文件的一些細節差異:

  • Scenario 參數化behave使用Scenario Outline語法來實現參數化場景,而pytest-bdd使用Scenarios來實現參數化場景。在behave中,你必須定義 Examples 表格并在其中提供參數值, 而在pytest-bdd中,你可以簡單地用Scenarios讀取一個外部.feature文件。

  • 裝飾器參數:在pytest-bdd中,步驟裝飾器(例如@given@when@then)可以接受一個可選的解析器,用于從步驟文本中捕獲值。這樣,分析器可以為已經定義的步驟參數提供多個場景。

其他大部分方面,behavepytest-bdd都是非常相似的,例如都支持GivenWhenThen這樣的基本步驟,都允許在Background段落中定義在每個場景前都要運行的步驟,仍然允許你創建可重用的步驟定義。

綜上,behavepytest-bdd處理.feature文件的方式非常相似,雖然在某些特性和實現上有些許差別。選哪個更多取決于個人或團隊需求。

pytest-bdd 與 behave的實例比較

接下來以一個具體的加法運算器為實例,初步演示兩者使用上的差異。

首先, 兩者的規格文件基本相同, 這里的文件名是 :calculator.feature,內容如下:

Feature: AdditionScenario: Add two numbersGiven I have a calculatorWhen I enter "1" and "2"Then the result should be "3"

規格很簡單, 就是驗證加法, 1+2 =3。

主要的差別是兩者在測試代碼上的差異。
使用pytest-bdd編寫的測試代碼的文件名是 test_calculator.py, 內容如下:

import sys
import os
import pytest
#sys.path.append('D:/devworkspace/python-ency/chp3/tests/bdd/util')
sys.path.append(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'util'))
from calculator import Calculator
from pytest_bdd import scenario, given, when, then, parsers@scenario('../features/calculator.feature','Add two numbers')
def test_add():print(sys.path.append(os.path.dirname(os.path.dirname(__file__))+'util'))pass@pytest.fixture
@given("I have a calculator")
def calculator():return Calculator()@when(parsers.parse('I enter "{a}" and "{b}"'))
def enter_numbers(calculator, a, b):calculator.a = int(a)calculator.b = int(b)@then(parsers.parse('the result should be "{result}"'))
def verify_result(calculator, result):assert calculator.add(calculator.a, calculator.b) == int(result)
  • pytest-bdd要求測試場景的函數和名稱需要以test_開頭, 步驟函數沒有特定的要求,關于 pytest-bdd的更多命名的規范可以參考: 基于pytest-bdd的項目目錄結構和命名規范

使用behave編寫的測試代碼的文件名同樣是 test_calculator.py, 內容如下:

import sys
import os
sys.path.append(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))), 'util'))from behave import given, when, then
from calculator import Calculator@given('I have a calculator')
def step_impl(context):context.calc = Calculator()@when('I enter "{num1}" and "{num2}"')
def step_impl(context, num1, num2):context.result = context.calc.add(int(num1), int(num2))@then('the result should be "{expected_result}"')
def step_impl(context, expected_result):assert context.result == int(expected_result)

簡單對比一下兩者的測試代碼區別:
在這里插入圖片描述

  1. Beave 的寫法相比更加簡潔
  2. pytest-bdd 可以手動關聯測試場景,看上去靈活度更高

總結

這兩個框架都有其優點和特性,選擇哪一個主要取決于特定需求。

  • 如果你已經在使用pytest,并且希望以最少的學習曲線使用 BDD,那么pytest-bdd可能是更好的選擇。
  • 另一方面,如果你希望編寫的測試代碼更接近自然語言,并且適合非技術團隊成員閱讀和修改,那么behave可能是更好的選擇。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165435.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165435.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165435.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

港口大型設備狀態監測及預測性維護策略

在現代港口運營中,大型設備的正常運行對于保障港口作業的高效性至關重要。為了實現設備的可靠性和持續性,港口管理者需要采取一系列狀態監測和預測性維護策略。 推進自動化和智能化是提高港口大型設備狀態監測和維護管理效率的重要途徑。通過應用先進的…

【計算機網絡筆記】數據鏈路層概述

系列文章目錄 什么是計算機網絡? 什么是網絡協議? 計算機網絡的結構 數據交換之電路交換 數據交換之報文交換和分組交換 分組交換 vs 電路交換 計算機網絡性能(1)——速率、帶寬、延遲 計算機網絡性能(2)…

讀像火箭科學家一樣思考筆記07_探月思維

1. 挑戰“不可能”的科學與企業 1.1. 互聯網 1.1.1. 和電網一樣具有革命性,一旦你插上電源,就能讓自己的生活充滿活力 1.1.2. 互聯網的接入可以幫助人們擺脫貧困,拯救生命 1.1.3. 互聯網還可以提供與天氣相關的信息 1.2. 用廉價、可靠的…

Windows如何截取屏幕圖片以及動態圖

在制作PPT或是其他演示文稿或是說明文檔的時候, 常常需要截取網頁或是屏幕的截圖,在Windows中有多種方式可以實現截取屏幕。 Windows 截取屏幕圖片的方式 在Windows 中截取屏幕中某個區塊的方式有: 方式1. 最原始的方式: 點擊 …

C練習題_2

一、單項選擇題(本大題共20小題,每小題2分,共40分。在每小題給出的四個備選項中選出一個正確的答案,并將所選項前的字母填寫在答題紙的相應位置上。) 以下敘述中錯誤的是() A.對于double類型數組,不可以直接用數組名對數組進行整…

機器學習與藥物篩選的心得體會

機器學習在藥物設計里面的應用可以說還是比較常見的,尤其是搞計算的都會或多或少的涉及到這塊。比如國內做這塊比較多的,浙江大學的侯廷軍教授,北京化工大學的閆愛霞教授,華東理工大學的幾個做模擬計算的老師,上海藥物…

Unity機器學習 ML-Agents第一個例子

上一節我們安裝了機器學習mlagents的開發環境,本節我們創建第一個例子,了解什么是機器學習。 我們的例子很簡單,就是讓機器人自主移動到目標位置,不能移動到地板范圍外。 首先我們來簡單的了解以下機器學習的過程。 機器學習的過…

分布式鎖之基于zookeeper實現分布式鎖(三)

3. 基于zookeeper實現分布式鎖 實現分布式鎖目前有三種流行方案,分別為基于數據庫、Redis、Zookeeper的方案。這里主要介紹基于zk怎么實現分布式鎖。在實現分布式鎖之前,先回顧zookeeper的相關知識點 3.1. 知識點回顧 3.1.1. 安裝啟動 安裝&#xff1a…

『亞馬遜云科技產品測評』活動征文|搭建圖床chevereto

『亞馬遜云科技產品測評』活動征文|搭建圖床chevereto 提示:本篇文章授權活動官方亞馬遜云科技文章轉發、改寫權,包括不限于在 Developer Centre, 知乎,自媒體平臺,第三方開發者媒體等亞馬遜云科技官方渠道 文章目錄 『…

Python 獲取本地和廣域網 IP

Python 獲取本地IP ,使用第三方庫,比如 netifaces import netifaces as nidef get_ip_address():try:# 獲取默認網絡接口(通常是 eth0 或 en0)default_interface ni.gateways()[default][ni.AF_INET][1]# 獲取指定網絡接口的IP地…

字符串相加

題意: 給定兩個字符串形式的非負整數 num1 和num2 ,計算它們的和并同樣以字符串形式返回。 你不能使用任何內建的用于處理大整數的庫(比如 BigInteger), 也不能直接將輸入的字符串轉換為整數形式。 示例 1&#xff…

利用STM32CubeMX解讀時鐘樹

1,低速時鐘 LSE是外部晶振作時鐘源,主要提供給實時時鐘模塊,所以一般采用32.768KHz。LSI是由內部RC振蕩器產生,也主要提供給實時時鐘模塊,頻率大約為40KHz。(LSE和LSI)只是提供給芯片中的RTC(實時時鐘)及IWDG(獨立看門…

【c++】棧教程

今天來講講棧 棧是什么? 老樣子,先來看一道題: 【棧】棧的基本操作 描述 棧的定義:棧是一種特殊的表這種表只在表頭進行插入和刪除操作。因此,表頭對于棧來說具有特殊的意義,稱為棧頂。相應地&#xff0…

佳易王羽毛球館計時計費軟件燈控系統安裝教程

佳易王羽毛球館計時計費軟件燈控系統安裝教程 佳易王羽毛球館計時計費軟件,點擊開始計時的時候,自動打開燈,結賬后自動關閉燈。 因為場館每一場地的燈功率都很大,需要加裝交流接觸器。這個由專業電工施工。 1、計時計費功能 &…

docker安裝mysql8

之前自己在網上找了一些docker安裝mysql8的方法,結果都不行,于是自己根據自己遇到的情況再結合網上搜索到的安裝方式調整了一下,成功執行安裝。以下是我自己的執行命令 先拉取docekr鏡像 docker pull mysql:8.0.20啟動鏡像 docker run -p 3…

使用Git bash切換Gitee、GitHub多個Git賬號

Git是分布式代碼管理工具,使用命令行的方式提交commit、revert回滾代碼。這里介紹使用Git bash軟件來切換Gitee、GitHub賬號。 ? ? 假設在gitee.com上的郵箱是alicefoxmail.com 、用戶名為alice;在github上的郵箱是bobfoxmail.com、用戶名為bob。 賬號…

tcp/ip協議2實現的插圖,數據結構2 (19 - 章)

(68) 68 十九1 選路請求與消息 函rtalloc,rtalloc1,rtfree (69)

HarmonyOS ArkTS 保存應用數據(十)

1 概述 在移動互聯網蓬勃發展的今天,移動應用給我們生活帶來了極大的便利,這些便利的本質在于數據的互聯互通。因此在應用的開發中數據存儲占據了非常重要的位置,HarmonyOS應用開發也不例外。 2 什么是首選項 首選項為應用提供Key-Value鍵…

Java面向對象第2天

精華筆記: 構造方法:構造函數、構造器、構建器---------------復用給成員變量賦初始值代碼 作用:給成員變量賦初始值 與類同名,沒有返回值類型(連void都沒有) 在創建(new)對象時被自動調用 若自己不寫構造方法,則編…

Electron+VUE3開發簡版的編輯器【文件預覽】

簡版編輯器的功能主要是: 打開對話框,選擇文件后臺讀取文件文件前端展示文件內容。主要技術棧是VUE3、Electron和Nodejs,VUE3做頁面交互,Electron提供一個可執行Nodejs的環境以及支撐整個應用的環境,nodeJS負責讀取文件內容。 環境配置、安裝依賴這些步驟就不再敘述了。 …