BDD实现方式

相信大部分的人都听说过 bdd,即:行为驱动开发,但并未涉及到它的使用方和项目实战。
所以,本篇文章将大家全面了解 bdd 及实现方式,最后使用 python bdd 框架落地到实际项目中去。
1. bdd 及优势bdd,行为驱动开发是 敏捷软件开发 的一种技术,鼓励软件项目的所有成员之间的相互协助
传统的软件开发方式主要缺点包含:测试用例比较单一,导致覆盖率不高;业务和产品不能够全面了解产品的行为表现
bdd 的出现主要优势有下面 2 点,主要体现在:
可以很好的减少项目成员之间的沟通成本,增加协作bdd 能够将上线之后的手工测试转换为自动化测试,提升测试效率2. 软件开发流程bdd 一般在产品需求文档审核时就开始介入,产品或业务负责人提供产品需求文档的同时,会提供具体的业务场景行为
开发人员根据定义的行为场景,开发软件,并编写场景下面的测试代码
完成 bdd 先在本地进行自测,没问题之后会提交到代码仓库,最后通过 ci 去持续集成,测试通过之后才能上线
bdd 的软件开发流程图如下:
3. gherkin 语言及 featuresgherkin 是 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 24. behavebehave 是 python 的 bdd 框架,并且可以使用命令行工具进行测试,使用 pip 可以很方便地进行安装
# 安装 behave 框架pip3 install behave编写完功能文件之后,就可以使用 behave 命令直接运行了
# 直接运行,控制台查看结果behave# 以中文来运行测试behave --lang=zh-cn5. 实战一下下面以自动化测试 google 搜索为例,来说说具体的使用方式
第 1 步,编写 features 文件,以中文为例
使用 behave --lang-help zh-cn 命令查看所有的中文关键字:
接着,利用这些关键字结合具体行为,编写的 feature 文件如下:
功能: google搜索模块测试 场景大纲: google搜索一个关键字功能 假如 搜索框输入一个关键字 当 点击搜索按钮 那么 页面标题应该为 例子: | 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 sleepfrom selenium.webdriver.common.keys import keysfrom 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 框架来实现,除了语法外,基本操作方法类似。

我国首款无人机完成高空临近空间飞行试验,标志着我国无人机技术达到世界先进水平
服务器中U是什么意思,1U、2U、4U、刀片机选哪种服务器
WiMAX在远程教育中的实际应用
iphone8什么时候上市?iphone8最新消息:iphone8模型:2.5D双玻璃,屏占比颇高,外形有点丑
AMD已确认X570/B550主板USB接口断连
BDD实现方式
Aruba全移动网络加速万达提升O2O体验
微型空气监测站能成为精准治污主流的三大原因
云市场迈进第二波浪潮 六大趋势抢先知
传感器的类型都有哪些
简单的桥式整流电路演示器制作
快速充电的应用有哪些_怎样可以快速充电
简述TVS二极管在ESD防护中的特点及优势
魅族Pro7什么时候上市?魅族Pro7最新消息:打火机造型的双屏幕魅族Pro7迟迟不发布,同款产品都火烧屁股了!
什么是比特币,区块链的原理又是什么
大众全面发力电动车 明年首建300kW充电桩
索尼XperiaXZ怎么样 说服你的可能只有信仰
华为新出黑科技 手背也能当触控屏
2016年颜值最高手机, 毫无争议: 小米MIX
一种简单且低成本的音频电平表电路分享