python BDD 的相關概念

在Python 語言中進行BDD的規格和測試文件的編寫的時候,常常會遇到下面的概念:

  • Fixture : 測試設施。設定測試環境的預設狀態或值的機制。
  • Background: 背景。所有場景的公共部分。
  • Scenario: 場景。
  • Given : 前置條件
  • When: 用戶操作
  • Then:預期結果

規格文件

pytest-bdd 和Behave 是Python中比較流行的BDD 框架,兩種使用的規格文件基本類型,規格文件都是以 .feature結尾,一個需求文件中只能有一個Feature字段,可以包含多個Scenario(用戶場景)。
Given->When->Then類似于準備->執行->驗證/清理的流程。

  • Given:一般可以用來做預置條件/數據準備,下面第一個And也屬于Given。
  • When下面的And都屬于When, 一般是操作步驟。
  • Then: 一般用于驗證結果(斷言),也可以進行清理數據。

Fixture 測試設施

在軟件測試中,“Fixture” 是一種設定測試環境的預設狀態或值的機制。通常為了某個測試或一組測試,需要一些預設的對象、文件或數據庫等等。如何設置和管理這些預設狀態就是 “Fixture” 的作用,它通常用來初始化測試環境,或者在每次測試完成后進行清理。

考慮到這個功能,有些中文翻譯可能會把 “Fixture” 翻譯為 “固件” 或 **“前置條件” **或 “測試設施”。然而,這通常還需要結合上下文具體理解。在很多開發文檔或技術討論中,也常常直接使用英文 “Fixture”。

在 BDD 和測試中,Fixture 是設置給定環境或編寫 “Given” 步驟所需的一項工作。可以把它看作是一個重復使用的預設條件,使你能夠用一致的環境運行測試。這些預設條件可能涉及各種各樣的事情,比如創建數據庫、初始化變量、創建類的實例,或者運行特定的命令等。

在 pytest,這些 fixtures 是用 @pytest.fixture 裝飾器聲明的 Python 函數。例如:

@pytest.fixture
def client():from myapp import MyClientreturn MyClient()

這個 client fixture 可以在測試函數、類或模塊中通過參數 re-use。

def test_get_data(client):data = client.get_data()assert data is not None

在 pytest-bdd 中,fixture 的使用方式非常相似,但支持為步驟 (given, when, then) 設置 fixture,使在 BDD 測試中更容易設置和共享上下文。

舉個例子:

from pytest_bdd import given, scenario, then, when
import pytest@scenario('calculations.feature', 'Adding numbers')
def test_add():pass@pytest.fixture
def calc():return Calculator()@given('I have a calculator', target_fixture='calculator')
def i_have_a_calculator(calc):return calc@when('I add <number1> and <number2>')
def add_numbers(calculator, number1, number2):calculator.add(int(number1), int(number2))@then('I should get <result>')
def get_result(calculator, result):assert calculator.result == int(result)

在這個例子中,

  • @pytest.fixture 注解的 calc()方法創建了一個 Calculator 類的實例
  • @given('I have a calculator', target_fixture='calculator') 的作用是 返回一個名為“calculator”的fixture(即測試用例執行前需要準備的對象或數據)。這個fixture可以在之后的測試步驟中被引用和使用。
    使用這種方式的好處是在 BDD 的步驟中更容易地重用和共享設置和數據。同時,它也可以幫助你分離你的測試代碼,使得它們更加模塊化和易維護。

Background 是什么?

在 BDD 中,Background關鍵字用于定義在執行每個場景時都需要執行的步驟。通常,這些步驟用于設置初始條件或預設環境。換句話說,它是需要在每個場景開始之前運行的給定(Given)步驟。

以下是一個例子,演示如何在 Background 中設置初始的環境狀態:

Feature: 乘坐地鐵Background:Given 我有一張有效的地鐵卡Scenario: 乘坐地鐵When 我刷地鐵卡Then 旋轉門應該打開Scenario: 余額不足Given 我的卡余額是0When 我刷地鐵卡Then 旋轉門不會打開 

在這個示例中,Background包含了一個 “Given 我有一張有效的地鐵卡” 的步驟。這意味著在執行每個場景 “乘坐地鐵” 和 “余額不足” 之前,測試始終會先執行這個步驟。

Background的目的是幫助減少測試場景之間的重復,并傳達對所有場景都有效的前提條件。但需要注意的是,過度使用Background可能會使測試復雜化和難以理解,特別是在Background中有很多步驟或它們的效果不明顯時。

Fixture 和 Background 的區別

FixtureBackground都是在開啟測試前設置預期環境或狀態的工具,但它們在用途和功能上有所區別,用在不同的場景。

  • Fixture:在 pytest 和許多其他測試框架中,fixture 是設置測試環境的一種工具,它為測試提供了需要的初識狀態或值。可以把 pytest fixture 理解為設置給定環境或預設需要的工作,它可以創建對象、連接數據庫、開啟服務器或其他任何為了測試需要預先設定的操作。Fixture 可以被多個測試用例重復使用,從而避免代碼的重復。

  • Background:在 Gherkin 語言(被許多 BDD 框架,如 Cucumber 和 behave 使用)中,Background 是一個特殊的場景,它在包含它的Feature中的每個ScenarioScenario Outline開始前運行。我們可以把 Background 理解成作為每個場景前提的共享步驟。背景的目標是為了消除場景之間的冗余

它們的區別主要在于:

  • Background 是 BDD 中 Gherkin 語法的一部分,用于描述在每個測試場景開始時的共享行為,
  • 而 Fixture 是 pytest 測試中的一個概念,它更傾向于代碼層面,負責進行一些設置和清理工作。

Background 和Fixture 也可以一起使用。例如,在 Given 步驟中使用fixture去實現在Background中描述的行為。

Feature: 乘坐地鐵Background:Given 我有一張有效的地鐵卡

對應的Given實現可能如下:

@given("我有一張有效的地鐵卡", target_fixture="card")
def have_subway_card():return SubwayCard(is_valid=True)

在這個例子中,have_subway_card就是一個 fixture,它在Background描述的Given步驟中被使用。

Scenario 用戶場景

在行為驅動開發(Behavior-Driven Development,BDD)中,Scenario是描述一個特定功能如何在特定情境下工作的方法,或者說是描述功能如何被使用的故事。每個Scenario是一個完整的可測試的用戶故事。

Scenario通常使用 “Given-When-Then” 的格式描述,這種格式可以清晰地闡述環境條件、行為和期望結果。每個Scenario應該是自足并可以單獨運行。

以下是一個例子:


Scenario: User login with correct username and passwordGiven a user has been registered with username "user1" and password "pass1"When the user login with username "user1" and password "pass1"Then the login should be successful

在這個例子中:

  • Given步驟設定了開始條件,即已經有一個注冊用戶 “user1”,其密碼是 “pass1”。

  • When步驟描述了用戶嘗試使用正確的用戶名和密碼登錄的行為。

  • Then步驟描述了期望的結果,即登錄應該成功。

  • 每個Scenario開始都是獨立的,不依賴于其他Scenario,每個Scenario均應清理其測試環境,以確保不會影響其他測試。這就是所謂的測試原子性。

  • Scenario是 BDD 的核心部分,它幫助我們將抽象的需求轉化為具體、可執行和可驗證的測試。



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

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

相關文章

centos7 安裝node.js,不用wget也不用解壓文件

更新系統&#xff1a;首先&#xff0c;更新系統的軟件包列表和已安裝的軟件包。在終端中以root用戶或具有sudo權限的用戶身份運行以下命令&#xff1a; sudo yum update添加Node.js源&#xff1a;CentOS 7默認的軟件倉庫中可能不包含最新的Node.js版本。因此&#xff0c;我們需…

[leetcode 數位運算] 2939. 最大異或乘積 M

給你三個整數 a &#xff0c;b 和 n &#xff0c;請你返回 (a XOR x) * (b XOR x) 的 最大值 且 x 需要滿足 0 < x < 2n。 由于答案可能會很大&#xff0c;返回它對 109 7 取余 后的結果。 注意&#xff0c;XOR 是按位異或操作。 示例 1&#xff1a; 輸入&#xff1…

git中的分支管理:git branch,git checkout,解決git中的分支沖突的方法【Git學習三】

&#x1f601; 作者簡介&#xff1a;一名大四的學生&#xff0c;致力學習前端開發技術 ??個人主頁&#xff1a;夜宵餑餑的主頁 ? 系列專欄&#xff1a;Git等軟件工具技術的使用 &#x1f450;學習格言&#xff1a;成功不是終點&#xff0c;失敗也并非末日&#xff0c;最重要…

vue2 識別頁面參數中的html

在Vue 2中&#xff0c;你可以使用v-html指令來識別頁面參數中的HTML內容。v-html指令允許你將HTML代碼作為Vue模板的一部分進行渲染。 以下是一個示例&#xff0c;演示了如何在Vue 2中使用v-html指令來識別頁面參數中的HTML內容&#xff1a; <template><div v-html&…

C語言計算一個數的 n 次方

1、要求 計算一個數的 n 次方&#xff0c;例如: 2 3&#xff0c;其中 2 為基數&#xff0c;3 為指數。 2、使用for循環 #include <stdio.h> int main(){int i,j,k,l1;printf("請輸入基數和指數&#xff1a;");scanf("%d %d",&i,&j);for(k…

雙流網絡論文精讀筆記

精讀視頻&#xff1a;雙流網絡論文逐段精讀【論文精讀】_嗶哩嗶哩_bilibili Two-Stream Convolutional Networks for Action Recognition in Videos 傳統的神經網絡難以學習到物體的運動信息&#xff0c;雙流網絡則通過光流將物體運動信息抽取出來再傳遞給神經網絡 給模型提供…

Golang 中的良好代碼與糟糕代碼

最近&#xff0c;有人要求我詳細解釋在 Golang 中什么是好的代碼和壞的代碼。我覺得這個練習非常有趣。實際上&#xff0c;足夠有趣以至于我寫了一篇關于這個話題的文章。為了說明我的回答&#xff0c;我選擇了我在空中交通管理&#xff08;ATM&#xff09;領域遇到的一個具體用…

linux部署jar 常見問題

1.java -jar xxx.jar no main manifest attribute, in xxx.jar 一.no main manifest attribute, in xxx.jar 在pom.xml文件中加入&#xff1a; <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifac…

C語言每日一題(35)有效的括號

力扣網 20 有效的括號 題目描述 給定一個只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判斷字符串是否有效。 有效字符串需滿足&#xff1a; 左括號必須用相同類型的右括號閉合。左括號必須以正確的順序閉合。每個右…

CountDownLatch和CyclicBarrier

JUC&#xff08;Java.util.concurrent&#xff09;是Java 5中引入的一個并發編程庫&#xff0c;它包含了許多用于多線程處理的工具類和接口。JUC主要提供了以下特性&#xff1a; 線程池&#xff1a;線程池可以提高線程的使用效率&#xff0c;避免頻繁地創建和銷毀線程&#xff…

Kotlin學習——hello kotlin 函數function 變量 類 + 泛型 + 繼承

Kotlin 是一門現代但已成熟的編程語言&#xff0c;旨在讓開發人員更幸福快樂。 它簡潔、安全、可與 Java 及其他語言互操作&#xff0c;并提供了多種方式在多個平臺間復用代碼&#xff0c;以實現高效編程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

Docker Swarm總結(2/3)

目錄 8、service 操作 8.1 task 伸縮 8.2 task 容錯 8.3 服務刪除 8.4 滾動更新 8.5 更新回滾 9、service 全局部署模式 9.1 環境變更 9.2 創建 service 9.3 task 伸縮 10、overlay 網絡 10.1 測試環境 1搭建 10.2 overlay 網絡概述 10.3 docker_gwbridg 網絡基礎…

【DevOps】Git 圖文詳解(八):后悔藥 - 撤銷變更

Git 圖文詳解&#xff08;八&#xff09;&#xff1a;后悔藥 - 撤銷變更 1.后悔指令 &#x1f525;2.回退版本 reset3.撤銷提交 revert4.checkout / reset / revert 總結 發現寫錯了要回退怎么辦&#xff1f;看看下面幾種后悔指令吧&#xff01; ? 還沒提交的怎么撤銷&#x…

Visual Studio連接unity編輯器_unity基礎開發教程

Visual Studio連接unity編輯器 問題描述解決方法意外情況 問題描述 當我們在unity編輯器中打開C#腳本的時候發現Visual Studio沒有連接unity編輯器&#xff0c;在編寫代碼的時候也沒有unity關鍵字的提醒。 簡單來說就是敲代碼沒有代碼提示。 解決方法 這時候需要在unity中進行…

Qt實現圖片旋轉的幾種方式(全)

目錄 一、用手搓&#xff08;QPainter&#xff09; 二、使用 QGraphicsView 和 QGraphicsPixmapItem 三、使用 QTransform 實現圖像旋轉 四、利用 OpenGL 實現旋轉圖像的效果有幾種不同的方法&#xff0c;其中常見的包括&#xff1a; 手動旋轉繪制&#xff1a; 使用 QPaint…

網絡吞吐量 公網帶寬有關嗎?

環境&#xff1a; 華為交換機 深信服防火墻 問題描述&#xff1a; 網絡吞吐量 公網帶寬有關嗎&#xff1f; 解決方案&#xff1a; 網絡吞吐量網絡吞吐量是指在特定時間內通過網絡傳輸的數據量。它衡量了網絡設備&#xff08;如防火墻、交換機、路由器&#xff09;或網絡連…

終端仿真軟件 SecureCRT v9.4.2

SecureCRT是一款終端仿真軟件&#xff0c;它提供了類似于Telnet和SSH等協議的遠程訪問功能。SecureCRT專門為網絡管理員、系統管理員和其他需要保密訪問網絡設備的用戶設計。 SecureCRT具有以下特點&#xff1a; 安全性&#xff1a;SecureCRT支持SSH1、SSH2、SSL和TLS等加密和…

素短語的定義

素短語&#xff0c;是指至少含有一個終結符的短語&#xff0c;并且除自身外&#xff0c;不包含更小的素短語。 最左素短語是句型中最左邊的素短語。

7.HTML中列表標簽

7.列表標簽 7.1無序列表&#xff08;重點&#xff09; 表格是用來顯示數據的&#xff0c;那么列表就是用來布局的。 列表最大的特點就是整齊&#xff0c;整潔&#xff0c;有序&#xff0c;他作為布局會更加自由和方便&#xff0c; 根據使用的情景不同&#xff0c;列表可分為三…

數字圖像處理(岡薩雷斯)學習筆記

目錄 一.機器視覺和計算機視覺二.圖像處理基礎1.什么是圖像2.如何訪問圖像 三.圖像仿射變換四.灰度變換 一.機器視覺和計算機視覺 機器視覺(Machine Vision,MV)和計算機視覺(Computer Vision&#xff0c;CV)的區別和聯系&#xff1a; 機器視覺更注重廣義圖像信號(激光&#xff…