行为驱动开发

行为驱动开发由 Dan North 于2003年提出,6年后的伦敦敏捷大会上他给出了一个定义。

BDD是第二代的、由外及内的、基于拉(pull)的、多方利益相关者的(stakeholder)、多种可扩展的、高自动化的敏捷方法。它描述了一个交互循环,可以具有带有良好定义的输出(即工作中交付的结果):已测试过的软件。

上面的定义难于理解,现给出一个通俗的定义。

BDD 的实践者们通过沟通交流,具体的示例和自动化测试帮助他们更好地探索,发现,定义并驱动出人们真正想用的软件。

个人的理解
在接口测试、UI 外面套了一层自然语言。

这个自然语言的作用是让不懂编程的人能在需求上达到一致的理解。


drivenDevelop.jpg

示例

从无到有的驱动开发类

自然语言
'' @math
'' Feature: Simple maths
'' Cucumber 5.x sample:
'' In order to do maths
'' As a developer
'' I want to increment variables
''
'' Scenario: easy maths
'' Given a variable set to 1
'' When I increment the variable by 1
'' Then the variable should contain 2
''
'' @complex @math
'' Scenario Outline: more complex stuff
'' Given a variable set to <var>
'' When I increment the variable by <increment>
'' Then the variable should contain <result>
'' Examples:
'' | var | increment | result |
'' | 100 | 5 | 105 |
'' | 101 | 5 | 106 |
'' | 200 | 6 | 205 |
'' | 1000 | 6 | 2005 |


脚本编写 definitions1.js
''
'' const { Given, When, Then } = require('cucumber');
'' const lib = require('./lib')
'' //// Your step definitions /////
''
'' Given(/^a variable set to (\d+)/, async function (num) { '' lib.setTo(num); '' }); '' '' When(/^I increment the variable by (\d+)/, async function (num) {
'' lib.incrementBy(num);
'' });
''
'' Then(/^the variable should contain (\d+)$/, async function (num) {
'' if (lib.variable != parseInt(num)) {
'' throw new Error('Variable should contain ' + num +
'' ' but it contains ' + lib.variable + '.');
'' }
'' });
''


脚本编写 lib.js
''
'' class MathLib {
'' constructor() {
'' this._variable = 0;
'' }
''
'' setTo (number) {
'' this._variable = parseInt(number);
'' }
''
'' incrementBy(number) {
'' this._variable += parseInt(number);
'' }
''
'' get variable() {
'' return this._variable;
'' }
''
'' }
''
'' module.exports = new MathLib();

UI测试类

自然语言
'' # language: zh-CN
'' 功能: Bing搜索
'' 功能:这是一个测试搜索引擎的示例功能
'' 时间:2019-08-08
''
'' @Search
'' 场景: 从 bing 搜索东西并验证
'' 假如浏览到网站 "https://www.bing.com"
'' 当输入关键字 "Cerno"
'' 并且单击 “搜索” 按钮
'' 那么搜索结果应包含 "Cerno"


脚本编写 definitions1.js
''
'' const { Given, When, Then } = require('cucumber');
'' const lib = require('./lib')
'' //// Your step definitions /////
''
'' Given(/^a variable set to (\d+)/, async function (num) { '' lib.setTo(num); '' }); '' '' When(/^I increment the variable by (\d+)/, async function (num) {
'' lib.incrementBy(num);
'' });
''
'' Then(/^the variable should contain (\d+)$/, async function (num) {
'' if (lib.variable != parseInt(num)) {
'' throw new Error('Variable should contain ' + num +
'' ' but it contains ' + lib.variable + '.');
'' }
'' });
''

接口测试类

自然语言
~~ @shipperLogin
~~ Feature: Shipper Login
~~ 【GSQ-11】作为**,我想登录 APP,以便登录。
~~ 【描述】
~~ 1.货主端输入手机号、验证码登录。
~~ 2.手机号格式正确且为货主手机号。
~~ 3.验证码正确。
~~ 4.登录成功提示“登录成功”。
~~
~~ Scenario Outline: Post data
~~ * Post to service api "<URL>" with '<data>' and I should get the '<expectval>'
~~ Examples:
~~ | URL | data | expectval |
~~ | http://****/login | { "flowNo":"000005", "term":"0001", "corp":"", "object":{ "phone":"183****8", "verificationCode":"0000", "appName":"shipper" } } | { "errCode": "20005", "errDesc": "登录", "cliFlowNo": "000005", "object": null } |
~~ | http://****/login | { "flowNo":"000005", "term":"0001", "corp":"", "object":{ "phone":"183****5", "verificationCode":"0000", "appName":"shipper" } } | { "errCode": "10001", "errDesc": "请输入正确的手机号", "cliFlowNo": "000005", "object": null } |


脚本编写 definitions1.js
~~ var { Given, When, Then } = require('cucumber');
~~ var got = require('got');
~~ var assert = require('assert');
~~
~~ var jsonFormat = {
~~ headers: { 'Content-Type': 'application/json' },
~~ json: true
~~ };
~~
~~
~~ Given("Post to service api {string} with {string} and I should get the {string}", function (url, data, expectval) {
~~ var option = {
~~ headers: { 'Content-Type': 'application/json', 'Authorization': 'MTIzMDE4NTkyNDM6RUFBQ0FBQUFCTHdJQ' },
~~ json: true,
~~ body: JSON.parse(data)
~~ };
~~ return got.post(url, option).then(function (res) {
~~ var data = res.body;
~~ delete data.svcFlowNo;
~~ var assertdata = JSON.parse(expectval);
~~ return assert.deepEqual(data, assertdata);
~~ });
~~ });
~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 9,475评论 0 23
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,788评论 0 38
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,322评论 0 10
  • 翻译自objc.io behavior-driven-development 开始对自己的代码进行自动化测试并不是...
    纵横而乐阅读 1,032评论 0 2
  • “喂,你好,是张小玲吗?你有个快递到了,下来取一下。”“喂,你好,我是申通快递的,你的快递到了,放在楼下,你要记得...
    心缘育儿阅读 362评论 14 6