0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

BDD實(shí)現(xiàn)方式

科技綠洲 ? 來(lái)源:Python實(shí)用寶典 ? 作者:Python實(shí)用寶典 ? 2023-11-01 11:08 ? 次閱讀

相信大部分的人都聽說(shuō)過(guò) BDD,即:行為驅(qū)動(dòng)開發(fā),但并未涉及到它的使用方和項(xiàng)目實(shí)戰(zhàn)。

所以,本篇文章將大家全面了解 BDD 及實(shí)現(xiàn)方式,最后使用 Python BDD 框架落地到實(shí)際項(xiàng)目中去。

1. BDD 及優(yōu)勢(shì)

BDD,行為驅(qū)動(dòng)開發(fā)是 敏捷軟件開發(fā) 的一種技術(shù),鼓勵(lì)軟件項(xiàng)目的所有成員之間的相互協(xié)助

傳統(tǒng)的軟件開發(fā)方式主要缺點(diǎn)包含:測(cè)試用例比較單一,導(dǎo)致覆蓋率不高;業(yè)務(wù)和產(chǎn)品不能夠全面了解產(chǎn)品的行為表現(xiàn)

BDD 的出現(xiàn)主要優(yōu)勢(shì)有下面 2 點(diǎn),主要體現(xiàn)在:

  • 可以很好的減少項(xiàng)目成員之間的溝通成本,增加協(xié)作
  • BDD 能夠?qū)⑸暇€之后的手工測(cè)試轉(zhuǎn)換為自動(dòng)化測(cè)試,提升測(cè)試效率

2. 軟件開發(fā)流程

BDD 一般在產(chǎn)品需求文檔審核時(shí)就開始介入,產(chǎn)品或業(yè)務(wù)負(fù)責(zé)人提供產(chǎn)品需求文檔的同時(shí),會(huì)提供具體的業(yè)務(wù)場(chǎng)景行為

開發(fā)人員根據(jù)定義的行為場(chǎng)景,開發(fā)軟件,并編寫場(chǎng)景下面的測(cè)試代碼

完成 BDD 先在本地進(jìn)行自測(cè),沒(méi)問(wèn)題之后會(huì)提交到代碼倉(cāng)庫(kù),最后通過(guò) CI 去持續(xù)集成,測(cè)試通過(guò)之后才能上線

BDD 的軟件開發(fā)流程圖如下:

圖片

3. Gherkin 語(yǔ)言及 Features

Gherkin 是 BDD 框架 Cucumber 的功能性語(yǔ)言,能夠通過(guò)自然語(yǔ)言,支持多國(guó)語(yǔ)言,描述一個(gè)具體的需求

Gherkin 語(yǔ)言使用的是主要英文關(guān)鍵詞包含:Scenario、Given、when 、And、Then 等;這些關(guān)鍵詞可以轉(zhuǎn)換成中文關(guān)鍵詞,比如:場(chǎng)景、加入、當(dāng)、那么等。

Features 功能文件一般命名為:*.feature,此文件可以編寫具體的需求行為,最后可以支持自動(dòng)化測(cè)試

功能文件的編寫規(guī)范如下:

  • 空格或者制表符用于縮進(jìn)
  • 每一行以 BDD 框架中預(yù)設(shè)的關(guān)鍵字開頭
  • 使用 # 符號(hào)在文件內(nèi)進(jìn)行注釋
  • 無(wú)論是中文或英文編寫,「 : 」符號(hào)只能用英文格式的冒號(hào),否則運(yùn)行的時(shí)候會(huì)報(bào)錯(cuò)

下面是一個(gè)簡(jiǎn)單的功能文件,描述的是兩個(gè)數(shù)相加的邏輯:

# 功能文件(英文)
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 框架,并且可以使用命令行工具進(jìn)行測(cè)試,使用 pip 可以很方便地進(jìn)行安裝

# 安裝 behave 框架
pip3 install behave

編寫完功能文件之后,就可以使用 behave 命令直接運(yùn)行了

# 直接運(yùn)行,控制臺(tái)查看結(jié)果
behave

# 以中文來(lái)運(yùn)行測(cè)試
behave --lang=zh-CN

5. 實(shí)戰(zhàn)一下

下面以自動(dòng)化測(cè)試 Google 搜索為例,來(lái)說(shuō)說(shuō)具體的使用方式

第 1 步,編寫 Features 文件,以中文為例

使用 behave --lang-help zh-CN 命令查看所有的中文關(guān)鍵字:

圖片

接著,利用這些關(guān)鍵字結(jié)合具體行為,編寫的 Feature 文件如下:

功能: Google搜索模塊測(cè)試
  場(chǎng)景大綱: Google搜索一個(gè)關(guān)鍵字功能
      假如 搜索框輸入一個(gè)關(guān)鍵字  keyword >
        當(dāng) 點(diǎn)擊搜索按鈕
        那么 頁(yè)面標(biāo)題應(yīng)該為 < title >
      例子:
          |   keyword  |   title    |
          |   Python   |   Python - Google 搜索       |
          |   AirPython |   AirPython - Google 搜索   |

需要注意的是,文件中定義了兩個(gè)參數(shù),即:keyword 和 title

實(shí)際項(xiàng)目中大部分的自動(dòng)化測(cè)試都是基于數(shù)據(jù)驅(qū)動(dòng)參數(shù)化,因此需要搭配「 場(chǎng)景大綱+例子」一起使用。

第 2 步,編寫 step 文件

在 Features 同級(jí)目錄下新建一個(gè) steps 文件夾,接著,在此文件夾下再新建一個(gè) step.py 文件

然后,就可以對(duì)照第 1 步編寫的 Features 文件編寫測(cè)試用例了

借助 @given、@when、@then 裝飾器,將文本內(nèi)容和參數(shù)對(duì)應(yīng)上

最后,使用 Selenium 定義的 API 方法操作元素即可

from time import sleep
from selenium.webdriver.common.keys import Keys
from behave import *


@given(u'搜索框輸入一個(gè)關(guān)鍵字 {keyword}')
def step_impl(context, keyword):
    element_input = context.driver.find_element_by_name('q')
    element_input.clear()
    print("準(zhǔn)備輸入")
    element_input.send_keys(keyword)


@when(u'點(diǎn)擊搜索按鈕')
def step_impl(context):
    # 模擬Enter鍵
    context.driver.find_element_by_name("q").send_keys(Keys.ENTER)

    sleep(1)


@then(u'頁(yè)面標(biāo)題應(yīng)該為 {title}')
def step_impl(context, title):
    assert context.driver.title == title

需要指出的是,方法名中的第一個(gè)參數(shù) context 是一個(gè)全局的字典,可以在步驟方法之間傳遞數(shù)據(jù)

第 3 步,編寫配置環(huán)境文件 environment.py

環(huán)境配置文件定義了測(cè)試腳本運(yùn)行過(guò)程中,具體步驟、場(chǎng)景之前和之后要執(zhí)行的內(nèi)容

比如,我們?cè)?before_feature 方法( 每一個(gè) feature 場(chǎng)景執(zhí)行之前執(zhí)行 )前初始化 ChromeDriver,打開目標(biāo)網(wǎng)站首頁(yè);然后在 after_feature 方法( feature 場(chǎng)景測(cè)試完成之后執(zhí)行 )后關(guān)閉瀏覽器

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 步,轉(zhuǎn)換 cucumber 測(cè)試報(bào)告

為了保證下一步在 Jenkins 中能正常顯示測(cè)試報(bào)告,需要將 behave 生成的測(cè)試報(bào)告轉(zhuǎn)換為 cucumber 兼容的 json 測(cè)試報(bào)告

首先,安裝依賴 behave2cucumber

# json測(cè)試報(bào)告文件轉(zhuǎn)換
pip3 install behave2cucumber

然后,在上一步的環(huán)境配置文件中重寫 after_all 方法,將 behave 格式的測(cè)試報(bào)告轉(zhuǎn)換為 cucumber 兼容的測(cè)試報(bào)告

def after_all(context):
    """
    所有測(cè)試完成之后執(zhí)行
    注意:behave1.2.6生成的json沒(méi)法正常轉(zhuǎn)換為cucumber兼容的json報(bào)告,建議降級(jí)為:1.2.5
    :param context:
    :return:
    """

    # 轉(zhuǎn)換
    with open('./test_report.json',encoding='utf-8') as behave_json:
        # 格式轉(zhuǎn)換
        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 最新版本轉(zhuǎn)成的 cucumber 測(cè)試報(bào)告,在 Jenkins 中沒(méi)法展示出來(lái),建議降低為 1.2.5 版本

第 5 步,本地運(yùn)行

在 Features 文件同級(jí)目錄下,執(zhí)行下面的命令,將在本地生成格式化后 json 格式的測(cè)試報(bào)告

# 以中文語(yǔ)言的形式在本地運(yùn)行
# 在本地產(chǎn)生測(cè)試報(bào)告
behave --lang=zh-CN -f json.pretty -o './test_report.json'

第 6 步,持續(xù)集成

首先搭建 Jenkins 環(huán)境,然后安裝 Cucumber reports 插件

https://plugins.jenkins.io/cucumber-reports

接著,新建一個(gè) Freestyle project 的任務(wù),添加構(gòu)建步驟 - Execute Shell,寫入要執(zhí)行的 Python 腳本

# 打開目標(biāo)項(xiàng)目位置
cd /Users/xingag/Desktop/xag/git/marks/Python/測(cè)試/Demo/feature_chrome

# 執(zhí)行測(cè)試,并生成測(cè)試報(bào)告
behave --lang=zh-CN -f json.pretty -o './test_report.json'

最后,添加構(gòu)建后的操作 - Cucumber reports,指向第 4 步轉(zhuǎn)換后的 json 格式的測(cè)試報(bào)告

圖片

第 7 步,構(gòu)建

構(gòu)建后,測(cè)試腳本會(huì)自動(dòng)進(jìn)行執(zhí)行,然后會(huì)在結(jié)果欄生成可視化測(cè)試報(bào)告

圖片

6. 最后

文章只是通過(guò) Python 中的 Behave 框架來(lái)談 BDD 在實(shí)際項(xiàng)目中的用法

如果你想在 Java 或者 Golang 項(xiàng)目中使用,可以直接 JBehave 或者 GoDog 框架來(lái)實(shí)現(xiàn),除了語(yǔ)法外,基本操作方法類似。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 軟件開發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    597

    瀏覽量

    27318
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4728

    瀏覽量

    68250
  • BDD
    BDD
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    7518
  • python
    +關(guān)注

    關(guān)注

    55

    文章

    4774

    瀏覽量

    84386
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    語(yǔ)音播報(bào)的實(shí)現(xiàn)方式?

    請(qǐng)問(wèn)目前語(yǔ)音播報(bào)的實(shí)現(xiàn)方式有哪些?會(huì)用訊飛語(yǔ)音合成嗎?
    發(fā)表于 11-29 11:01

    使用YOLOv3訓(xùn)練BDD100K數(shù)據(jù)集之開始訓(xùn)練

    (三)使用YOLOv3訓(xùn)練BDD100K數(shù)據(jù)集之開始訓(xùn)練
    發(fā)表于 05-12 13:38

    掃描方式和中斷方式實(shí)現(xiàn)串口收發(fā)的過(guò)程

    面向小白實(shí)現(xiàn)目標(biāo):掃描方式和中斷方式實(shí)現(xiàn)串口收發(fā)一、掃描方式和中斷方式
    發(fā)表于 02-21 07:20

    反饋控制方式實(shí)現(xiàn)均流的原理圖

    反饋控制方式實(shí)現(xiàn)均流的原理圖 圖 反饋控制方式實(shí)現(xiàn)均流的原理圖 圖是上述反
    發(fā)表于 07-17 08:31 ?1804次閱讀

    無(wú)線傳送方式實(shí)現(xiàn)室內(nèi)通信系統(tǒng)

    目前,家庭網(wǎng)絡(luò)內(nèi)部主要通過(guò)雙芯電纜直接對(duì)各種智能家電實(shí)現(xiàn)控制和訪問(wèn)。這種方式安裝布線比較麻煩。為了克服安裝布線的麻煩,選用無(wú)線傳送方式實(shí)現(xiàn)家庭網(wǎng)絡(luò)內(nèi)部的各種控制和
    發(fā)表于 08-23 11:54 ?1022次閱讀
    無(wú)線傳送<b class='flag-5'>方式</b><b class='flag-5'>實(shí)現(xiàn)</b>室內(nèi)通信系統(tǒng)

    基于BDD結(jié)構(gòu)和布爾差分思想電路測(cè)試應(yīng)用

    引入布爾差分的思想,對(duì)被測(cè)電路函數(shù)的BDD結(jié)構(gòu)進(jìn)行判斷生成測(cè)試向量。本方案較傳統(tǒng)的以圖進(jìn)行搜索的ATPG方法有效地減少了時(shí)空開銷,并將布爾差分的理論方法應(yīng)用于實(shí)際。實(shí)驗(yàn)表明,本方案可以有效地進(jìn)行測(cè)試生成。
    發(fā)表于 09-08 14:25 ?1次下載

    采用LabVIEW實(shí)現(xiàn)Modbus通訊協(xié)議的方式

    針對(duì)Modbus的串口和TCP兩種不同的方式,在LabVIEW中通常可以通過(guò)以下幾種方法實(shí)現(xiàn)Modbus通訊。其中一些實(shí)現(xiàn)方式需要安裝LabVIEW 數(shù)據(jù)記錄與監(jiān)控(DSC)模塊.
    的頭像 發(fā)表于 01-16 17:22 ?1.7w次閱讀

    單點(diǎn)登錄的實(shí)現(xiàn)方式有哪些

    前言 實(shí)現(xiàn)方式一:父域 Cookie 實(shí)現(xiàn)方式二:認(rèn)證中心 實(shí)現(xiàn)方式三:LocalStorage
    的頭像 發(fā)表于 02-02 14:00 ?2204次閱讀
    單點(diǎn)登錄的<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>方式</b>有哪些

    Python定時(shí)任務(wù)的實(shí)現(xiàn)方式

    在日常工作中,我們常常會(huì)用到需要周期性執(zhí)行的任務(wù),一種方式是采用 Linux 系統(tǒng)自帶的 crond 結(jié)合命令行實(shí)現(xiàn)。另外一種方式是直接使用Python。接下來(lái)整理的是常見(jiàn)的Python定時(shí)
    的頭像 發(fā)表于 10-08 15:20 ?5552次閱讀

    STM32上實(shí)現(xiàn)點(diǎn)燈(固件庫(kù)方式

    STM32上實(shí)現(xiàn)點(diǎn)燈(固件庫(kù)方式
    發(fā)表于 12-05 11:06 ?11次下載
    STM32上<b class='flag-5'>實(shí)現(xiàn)</b>點(diǎn)燈(固件庫(kù)<b class='flag-5'>方式</b>)

    一文詳解限流算法的實(shí)現(xiàn)方式

    不依賴外部庫(kù)的情況下,限流算法有什么實(shí)現(xiàn)的思路?本文介紹了3種實(shí)現(xiàn)限流的方式
    的頭像 發(fā)表于 05-25 12:00 ?1378次閱讀

    四種方式實(shí)現(xiàn)led點(diǎn)亮

    四種方式實(shí)現(xiàn)led點(diǎn)亮
    發(fā)表于 01-04 14:31 ?4次下載

    Redis實(shí)現(xiàn)限流的三種方式分享

    當(dāng)然,限流有許多種實(shí)現(xiàn)方式,Redis具有很強(qiáng)大的功能,我用Redis實(shí)踐了三種的實(shí)現(xiàn)方式,可以較為簡(jiǎn)單的實(shí)現(xiàn)
    的頭像 發(fā)表于 02-22 09:52 ?1017次閱讀

    汪立高:摻硼金剛石(BDD)在鋰電新能源行業(yè)中的應(yīng)用

    BDD適用范圍:研究表明,BDD電極能有效降解各類有機(jī)廢水的污染物,例如醫(yī)藥/農(nóng)藥化工、石化、焦化、冶煉、印染、造紙、制革、炸藥、制酒、垃圾滲濾液等領(lǐng)域的有機(jī)廢水。
    的頭像 發(fā)表于 05-24 14:30 ?2034次閱讀
    汪立高:摻硼金剛石(<b class='flag-5'>BDD</b>)在鋰電新能源行業(yè)中的應(yīng)用

    java實(shí)現(xiàn)多線程的幾種方式

    Java實(shí)現(xiàn)多線程的幾種方式 多線程是指程序中包含了兩個(gè)或以上的線程,每個(gè)線程都可以并行執(zhí)行不同的任務(wù)或操作。Java中的多線程可以提高程序的效率和性能,使得程序可以同時(shí)處理多個(gè)任務(wù)。 Java提供
    的頭像 發(fā)表于 03-14 16:55 ?552次閱讀