低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

行为驱动开发的反模式

2016 年 10 月 09 日

正如Kevin Smith 最近所称行为驱动开发(BDD)可以用来增进业务相关人员和软件开发者之间的沟通,然而在使用 Cucumber 运行自动化测试时,有一些常见的反模式需要避免。 Aslak Hellesøy (Cucumber 联合创建者)、 Matt Wynne Steve Tooke 在最近的一次讨论中对其进行了描述。

许多Cucumber 的反模式涉及场景(scenario),也就是一段在特征细节层面对业务行为的描述。一个场景通常应该使用领域语言来描述具体业务行为。具体结构是由一个初始条件开始,紧随一个触发场景的事件,最后通过一个或一些语句来表示所期望的结果。 Given-When-Then 结构是一种通用的模板,如:

场景:从账户成功取钱
Given:我账户有€100
When:我申请取€20
Then:€20 被取出

在写完代码之后写场景,这是把 Cucumber 当作测试工具来使用,虽然确实有这个作用,但 Cucumber 首先是一个用来查看你对问题领域理解程度的工具,从而在写代码前能与问题领域的专业人士一起找出潜在的误解。

由领域内专家独立创建场景,这不能代表普通的认知,也缺少了开发和测试人员的参与。没有技术人员的参与,场景也将很难达到自动化。

通过 UI 测试也会产生问题。用户接口(UI)往往比业务逻辑变化更频繁,从而导致测试案例经常失败。如果并没有改变场景或业务逻辑,那么重新调试这些失败的测试案例,花费的就是不必要的精力。另一方面,通过与应用的各部分交互,再进入数据存储及后端来进行测试的速度也很慢。这样测试也可能导致缺乏对领域的理解。描述 UI 使用的主要是各领域通用的一般语言,这会导致场景的描述不能真实反映该领域所需要表达的情况。

瑞典资深 BDD 专家 Thomas Sundberg 引用敏捷测试金字塔主张 BDD 应该被应用于所有业务有理由对具体行为产生异议的地方。他倾向于着重在集成测试上使用 BDD,并尽可能少地通过 UI 进行测试。他同时强调 Cucumber 主要不是一个测试工具,而是一个用于对系统工作方式产生共同理解的工具。

保留噪音场景,如查看空银行账户,这会使文档的相关部分模糊不清。虽然噪音场景的逻辑是理所当然的,但还需要在第一次运行测试时将它们覆盖到。Hellesøy 他们的建议是一段时间后删除它们,或至少改述成更有用的场景。

过度使用场景提纲会使测试变慢。有了场景提纲,可以使用模板添加新场景,这能很方便地增加大量场景。建议使用场景提纲时避免通过UI 或其他较慢的方式进行测试。

其他论及的反模式包括同时测试许多规则以及糟糕的场景命名,这些都会导致误解场景的目的。附带的细节过于模糊的场景,它们没有实际的价值,要么引入了过多无关细节,要么过于抽象根本没有包含任何细节。

查看英文原文: Behaviour-Driven Development Anti-Patterns


感谢夏雪对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016 年 10 月 09 日 19:00963
用户头像

发布了 41 篇内容, 共 10.7 次阅读, 收获喜欢 1 次。

关注

评论

发布
暂无评论
发现更多内容

CSS09 - 文本&背景属性

桃夭十一里

html/css

“千人斩”阿里面试官同事,被应聘者暴打一顿后!最终洗心革面总结出这份高薪“Java 面试秘籍”

Java成神之路

Java 程序员 架构 面试 编程语言

如何通过NGINX的log日志来分析网站的访问情况,试试这些命令

我爱娃哈哈😍

nginx Shell

在onelogin中使用OpenId Connect Implicit Flow

程序那些事

权限系统 程序那些事 openid 权限架构 onelogin

CSS08 - CSS特性

桃夭十一里

html/css

如何使用Eclipse内存分析工具定位内存泄露

AI乔治

Java eclipse 架构

如何使用Eclipse内存分析工具定位内存泄露

Java老k

Java 内存泄露

架构师训练营大作业(一)

我是谁

架构师训练营第 1 期

不愧是Alibaba技术官:程序员必会的架构知识清单,如何让你技术上的提升面试时的丰收

Java架构之路

Java 程序员 架构 面试 编程语言

还在手动写数据库文档吗?试试这个工具,划水干活儿两不误!

我爱娃哈哈😍

数据库 文档生成

杜绝标题党,好的标题是成功的99%

xcbeyond

方法论 28天写作 写作技巧

AQS设计思想与重要字段详解

程序员小毕

Java 源码 jdk 并发编程 AQS

数据库表数据量大读写缓慢如何优化(1)【冷热分离】

我爱娃哈哈😍

大数据 架构 海量数据库的设计与实践 优化 数据库优化

【CSS】CSS对大小写敏感吗?

学习委员

28天写作

CSS06 - 标签的显示模式与转换

桃夭十一里

html/css

甲方日常 81

句子

随笔杂谈

甲方日常 82

句子

随笔杂谈

一次系统调用时间过长追踪完整教程案例

AI乔治

Java Linux 架构

开始的开始-可能是最早提交的28天写作活动作品

石君

28天写作

CSS05 - 常用的高级选择器

桃夭十一里

html/css

CSS07 - 伪类

桃夭十一里

html/css

俯瞰Dubbo全局,阅读源码前必须掌握这些!!

冰河

架构 分布式 微服务 dubbo 服务治理

天天CRUD,被领导怼,我是如何从小公司菜鸡到阿里P8架构师?,首次分享Java程序员黄金五年进阶心得

Java架构之路

Java 程序员 架构 面试 编程语言

2020年无人场景市场趋势洞察

IoT云工坊

人工智能 物联网 智慧照明 节能管理 安防报警

LeetCode题解:111. 二叉树的最小深度,BFS,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

【Mysql-InnoDB系列】InnoDB架构

程序员架构进阶

MySQL 架构 innodb 28天写作

架构师训练营W12作业

Geek_f06ede

浅析整洁架构之道(二) 初步了解The Clean Architecture

御剑

DDD 领域驱动 The Clean Architecture Robert C. Martin

深入理解Nginx的四级指针

赖猫

c++ nginx Linux Nginx源码

数据中心“容灾”和“备份”的区别

2021 第七季 28天写作训练 测试

将军-技术演讲教练

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

行为驱动开发的反模式-InfoQ