行为驱动开发:一篇文章带你用 Python 玩转 BDD

相信大部分的人都听说过 BDD,即:行为驱动开发,但并未涉及到它的使用方和项目实战。

所以,本篇文章将大家全面了解 BDD 及实现方式,最后使用 Python BDD 框架落地到实际项目中去。

1. BDD 及优势

BDD,行为驱动开发是 敏捷软件开发 的一种技术,鼓励软件项目的所有成员之间的相互协助

传统的软件开发方式主要缺点包含:测试用例比较单一,导致覆盖率不高;业务和产品不能够全面了解产品的行为表现

BDD 的出现主要优势有下面 2 点,主要体现在:

  • 可以很好的减少项目成员之间的沟通成本,增加协作

  • BDD 能够将上线之后的手工测试转换为自动化测试,提升测试效率

2. 软件开发流程

BDD 一般在产品需求文档审核时就开始介入,产品或业务负责人提供产品需求文档的同时,会提供具体的业务场景行为

开发人员根据定义的行为场景,开发软件,并编写场景下面的测试代码

完成 BDD 先在本地进行自测,没问题之后会提交到代码仓库,最后通过 CI 去持续集成,测试通过之后才能上线

BDD 的软件开发流程图如下:

3. Gherkin 语言及 Features

Gherkin 是 BDD 框架 Cucumber 的功能性语言,能够通过自然语言,支持多国语言,描述一个具体的需求

Gherkin 语言使用的是主要英文关键词包含:Scenario、Given、when 、And、Then 等;这些关键词可以转换成中文关键词,比如:场景、加入、当、那么等。

Features 功能文件一般命名为:*.feature,此文件可以编写具体的需求行为,最后可以支持自动化测试

功能文件的编写规范如下:

  • 空格或者制表符用于缩进

  • 每一行以 BDD 框架中预设的关键字开头

  • 使用 # 符号在文件内进行注释

  • 无论是中文或英文编写,「  : 」符号只能用英文格式的冒号,否则运行的时候会报错

下面是一个简单的功能文件,描述的是两个数相加的逻辑:

# 功能文件(英文)
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 框架,并且可以使用命令行工具进行测试,使用 pip 可以很方便地进行安装

# 安装 behave 框架
pip3 install behave

编写完功能文件之后,就可以使用 behave 命令直接运行了

# 直接运行,控制台查看结果
behave

# 以中文来运行测试
behave --lang=zh-CN

5. 实战一下

下面以自动化测试 Google 搜索为例,来说说具体的使用方式

第 1 步,编写 Features 文件,以中文为例

使用 behave --lang-help zh-CN 命令查看所有的中文关键字:

接着,利用这些关键字结合具体行为,编写的 Feature 文件如下:

功能: Google搜索模块测试
  场景大纲: Google搜索一个关键字功能
   假如 搜索框输入一个关键字 <keyword>
  当 点击搜索按钮
  那么 页面标题应该为 <title>
   例子:
 |   keyword  |   title |
 |   Python   |   Python - Google 搜索 |
 |   AirPython |   AirPython - Google 搜索   |

需要注意的是,文件中定义了两个参数,即:keyword 和 title

实际项目中大部分的自动化测试都是基于数据驱动参数化,因此需要搭配「 场景大纲+例子」一起使用。

第 2 步,编写 step 文件

在 Features 同级目录下新建一个 steps 文件夹,接着,在此文件夹下再新建一个 step.py 文件

然后,就可以对照第 1 步编写的 Features 文件编写测试用例了

借助 @given、@when、@then 装饰器,将文本内容和参数对应上

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

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

@given(u'搜索框输入一个关键字 {keyword}')
def step_impl(context, keyword):
 element_input = context.driver.find_element_by_name('q')
 element_input.clear()
 print("准备输入")
 element_input.send_keys(keyword)

@when(u'点击搜索按钮')
def step_impl(context):
 # 模拟Enter键
 context.driver.find_element_by_name("q").send_keys(Keys.ENTER)

sleep(1)

@then(u'页面标题应该为 {title}')
def step_impl(context, title):
 assert context.driver.title == title

需要指出的是,方法名中的第一个参数 context 是一个全局的字典,可以在步骤方法之间传递数据

第 3 步,编写配置环境文件 environment.py

环境配置文件定义了测试脚本运行过程中,具体步骤、场景之前和之后要执行的内容

比如,我们在 before_feature 方法( 每一个 feature 场景执行之前执行 )前初始化 ChromeDriver,打开目标网站首页;然后在 after_feature 方法( feature 场景测试完成之后执行 )后关闭浏览器

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 步,转换 cucumber 测试报告

为了保证下一步在 Jenkins 中能正常显示测试报告,需要将 behave 生成的测试报告转换为 cucumber 兼容的 json 测试报告

首先,安装依赖 behave2cucumber

# json测试报告文件转换
pip3 install behave2cucumber

然后,在上一步的环境配置文件中重写 after_all 方法,将 behave 格式的测试报告转换为 cucumber 兼容的测试报告

def after_all(context):
 """
 所有测试完成之后执行
 注意:behave1.2.6生成的json没法正常转换为cucumber兼容的json报告,建议降级为:1.2.5
 :param context:
 :return:
 """

# 转换
 with open('./test_report.json',encoding='utf-8') as behave_json:
  # 格式转换
  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 最新版本转成的 cucumber 测试报告,在 Jenkins 中没法展示出来,建议降低为 1.2.5 版本

第 5 步,本地运行

在 Features 文件同级目录下,执行下面的命令,将在本地生成格式化后 json 格式的测试报告

# 以中文语言的形式在本地运行
# 在本地产生测试报告
behave --lang=zh-CN -f json.pretty -o './test_report.json'

第 6 步,持续集成

首先搭建 Jenkins 环境,然后安装 Cucumber reports 插件

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

接着,新建一个 Freestyle project 的任务,添加构建步骤 - Execute Shell,写入要执行的 Python 脚本

# 打开目标项目位置
cd /Users/xingag/Desktop/xag/git/marks/Python/测试/Demo/feature_chrome

# 执行测试,并生成测试报告
behave --lang=zh-CN -f json.pretty -o './test_report.json'

最后,添加构建后的操作 - Cucumber reports,指向第 4 步转换后的 json 格式的测试报告

第 7 步,构建
构建后,测试脚本会自动进行执行,然后会在结果栏生成可视化测试报告

6. 最后

文章只是通过 Python 中的 Behave 框架来谈 BDD 在实际项目中的用法

如果你想在 Java 或者 Golang 项目中使用,可以直接 JBehave 或者 GoDog 框架来实现,除了语法外,基本操作方法类似。

文中的完全代码我已经上传到后台,回复关键「 BDD 」获取全部的源码文件。

以上便是我今天的分享,如果对你有帮助,可以帮忙转发一下。

(0)

相关推荐

  • Python效率不好?莫慌,这7大Python效率工具你得用上!

    为了提高效率,我们在平时工作中常会用到一些Python的效率工具,Python作为比较老的编程语言,它可以实现日常工作的各种自动化.为了更便利的开发项目,这里给大家推荐几个Python的效率工具. 1 ...

  • Go语言网络编程入门不走弯路最佳案例(写Api接口)

    Go语言是Google领导开发的一门编程语言,国内可访问的官网 https://golang.google.cn/ image-20201213123438844 只要选对了框架,用Go语言完成网络编 ...

  • pyjwt-用于实现JSON Web令牌的python库

    pyjwt是用于实现JSON Web令牌的python库. FAQ 1.如何从x509证书中提取公钥/私钥? load_pem_x509_certificate()from的功能cryptograph ...

  • (5条消息) BDD敏捷开发入门与实战

    BDD敏捷开发入门与实战 1.BDD的来由 2003年,Dan North首先提出了BDD的概念,并在随后开发出了JBehave框架.在Dan North博客上介绍BDD的文章中,说到了BDD的想法是 ...

  • 用 Python 撸一个 Web 服务器-第4章:动态渲染数据

    上一章中为了尽快让 Todo List 程序跑起来,并没有完全按照 MVC 模式编写程序.这一章就让我们一起实现一个完整的 MVC 模式 Todo List 程序首页. 使用模型操作数据 我们来分析下 ...

  • 使用Postman做API自动化测试

    Postman最基本的功能用来重放请求,并且配合良好的response格式化工具. 高级点的用法可以使用Postman生成各个语言的脚本,还可以抓包,认证,传输文件. 仅仅做到这些还不能够满足一个系统 ...

  • 一篇文章带你解析Python进程

    来源|本文经授权转载自Python爬虫与数据挖掘 前言 进程,一个新鲜的字眼,可能有些人并不了解,它是系统某个运行程序的载体,这个程序可以有单个或者多个进程,一般来说,进程是通过系统CPU 内核数来分 ...

  • 一篇文章带你搞定BES平台,提供全网最全的开发调试笔记和文档下载(更新:2021.09.11)

    本文章目的: 1)系统整理BES平台的开发调试笔记 2)给广大的"道友"提供一个资料下载的渠道 3)通过学习BES平台,搞清楚TWS耳机类产品的开发套路 待添加内容 这里有一个学习 ...

  • 一篇文章带你了解建设数字乡村问题有哪些?

    数字乡村是伴随网络化.信息化和数字化在农业农村经济社会发展中的应用,以及农民现代信息技能的提高而内生的农业农村现代化发展和转型进程,既是乡村振兴的战略方向,也是建设数字中国的重要内容.虽然数字乡村有着 ...

  • 一篇文章带你搞定牛吃草问题

    牛吃草问题,是小学数学一种重要的类型,又称为消长问题或牛顿问题,由17世纪英国科学家牛顿提出. 当年牛顿曾编过这样一道题目:牧场上有一片青草,每天都生长得一样快. 这片青草供给10头牛吃,可以吃22天 ...

  • 一篇文章带你搞定火车过桥问题

    火车过桥问题,在小学数学中是一种非常重要的行程问题. 难点在于,如果不太会画图的话,很容易找错路程之间的关系. 今天,就来给大家再总结一遍火车过桥中的一些基本情况,尤其是每种情况的图要分辨清楚. 孩子 ...

  • 一篇文章带你读懂湖田窑!资深藏家必看!

    湖田窑水晶莹玉润,白中泛青,色如湖蓝,极富情趣,刀法简捷明快,娴熟自然,结合造型.底足工艺特征判断,是开门的宋代湖田窑精品特征.湖田窑是汉族传统制瓷工艺中的珍品,位于今景德镇市东南湖田村,是中国宋.元 ...

  • 一篇文章带你了解强迫症!

    许多人都喜欢拿强迫症自居或者开玩笑,其实真实的强迫症一点都不好玩.本篇文章将带您了解强迫症到底是怎么一回事. 许多人认为,强迫症就是反复检查和洗手.其实不然.在临床调查中,50%左右的病人都有检查和清 ...

  • “吃素”到底好不好?一篇文章带你看穿素食的真相

    有人说, 人类进化了几十万年才爬上食物链的顶端, 可不是为了吃草. 然而,现在吃素的人越来越多了. 素食日渐风靡. 过去吃素可能是为了信仰,宗教,为了不杀生. 如今吃素是为了健康. 那么吃素有什么好处 ...

  • 为什么特发性震颤久治不愈?一篇文章带你深入了解它

    什么是特发性震颤?很多患者不知道该如何判断特发性震颤是属于哪种疾病,甚至认为特发性震颤是单纯的神经疾病与躯体疾病,对特发性震颤没有正确的认识,从而导致没有达到对症治疗,病情不但没有缓解反而越来越严重. ...