• 0
  • 0
分享

在软件研发和测试过程中,当测试人员、开发人员以及业务人员沟通测试案例的功能点以及覆盖率时,复杂的功能需求和晦涩难懂的测试案例脚本脱节,让大家很难对测试功能点达到一致,也很难统计测试覆盖率。如果有一种通用语言来描述测试用例,让开发、测试和业务人员都能够很好地理解测试需求,步骤和目标,便可以最大程度避免由于理解偏差带来的不一致性问题,而BDD(全称Behavior Driven Development)技术就是解决这一问题的钥匙。

BDD即行为驱动开发,是一种敏捷软件开发的技术,是TDD(全称Test Driven Development)即测试驱动开发的延伸,它用简单易懂的“通用语言”——Gherkin语法书写的结构化自然语言来描述测试需求,并将语言转换为可执行的测试。由于业务人员、开发人员和测试人员使用同一种“语言”来描述同一个系统和需求功能,可以最大程度避免表达不一致带来的问题,达到理解上的一致性。使用通用语言,商业参与者比如客户也可以和我们的业务人员以及研发团队一起定义出系统的行为,从而做出符合客户需求的设计。

BDD鼓励软件项目中的开发人员、测试人员、业务人员以及商业参与者之间的协作,让开发和测试人员尽可能地理解产品经理或业务人员的功能需求,并在研发过程中及时反馈和演示软件功能的研发状态,让产品经理或业务人员根据获得的产品研发信息及时对软件产品特性进行调整。BDD帮助敏捷研发团队把精力集中在识别、理解和构建跟业务目标有关的产品特性上面,并让敏捷研发团队能够确保识别出的产品特性能够被正确设计和实现出来。

本文介绍了一种基于BDD技术去书写测试案例,并结合流行的持续集成技术实现了一套自动化测试的框架。此框架把BDD书写的测试用例自动部署到了持续集成系统中,当开发人员修改代码后,便自动触发去执行配置好的BDD测试用例并得到可视化的执行结果,通过结果可以定位到失败的测试用例。由于测试用例是之前介绍的“通用语言”,开发人员可以很清楚地理解失败的原因,并和测试人员有效地进行沟通,从而去解决代码BUG或者修改不合适的测试用例。下面,我将从三个部分来介绍这个自动化框架:1)自动化测试框架概览2)BDD测试用例详解3)实践与应用。

自动化测试框架概览

在本文的实现中,我们使用Cucumber和Serenity BDD的Java版本去实现BDD测试用例,使用Git来管理开发代码和测试用例代码,并使用Jenkins+Maven+Docker等流行的持续集成框架去实现自动化测试流程。在介绍自动化框架的工作流程前,我们先熟悉一下这几个概念:

Cucumber是一个能够用普通语言来描述测试用例,支持BDD的开源自动化测试工具。它本质上是根据正则表达式匹配用自然语言描述的测试用例步骤,然后依次执行对应的方法,以达到测试的目的。

Serenity BDD是一个开源工具,它和Cucumber结合可以实现测试用例执行结果的可视化展示和统计,方便使用者分析测试的结果和问题。

Jenkins是实现可持续集成框架的实现工具。

Docker是一个开源的应用容器引擎,可以打包应用程序以及依赖包到一个可移植的容器中,然后发布到部署好的Linux或Windows 服务器上。

Maven可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。

整个框架的工作流程是:当开发人员做了代码改动或者测试人员做了测试用例修改,提交到Git的待测分支后,Jenkins的Hook识别到变化,自动拉取最新的开发代码和测试用例代码,用Maven打包,发到Docker上进行Docker Push和Docker Build,最后发布到已经部署好的应用服务器集群进行Docker Run,让最新的Cucumber实现的测试用例跑在最新的开发代码上,执行完毕后,Jenkins自动收集Serenity BDD的执行结果,通过邮件发给代码提交人,通知他执行结果。如果测试用例的执行结果全部通过,则将改动的代码提交到Git的稳定分支中;如果有失败用例,则驳回代码的提交。整个工作流程如下图1:

1.png图1 工作流程

BDD测试用例详解

Cucumber如何结合Serenity BDD实现测试用例和展示执行测试用例的结果?如下图2所示:

1)首先,Cucumber用Gherkin语法来书写BDD测试用例。测试用例根据测试功能点集合在不同的Feature文件中,每个测试用例包含Given、When和Then等测试步骤。

2)Cucumber用正则表达式映射步骤定义和Gherkin书写的测试用例步骤。步骤定义在本文中是定义的Java函数,函数内有针对测试步骤具体的实现。当执行测试用例时,针对Feature文件中的每个测试用例(Scenario)的步骤,根据正则表达式匹配到步骤定义的函数,然后执行函数里的内容,达到测试的目的。

3)当测试执行完毕,Serenity BDD会收集执行结果,以较好的界面可视化展示,方便使用者统计结果和分析错误。

2.png

图2 Cucumber+SerenityBDD工作原理

Cucumber的Feature文件用来描述一个可测试的功能点,里面包含若干个正向或反向测试用例(Scenario)去测试这个功能点。定义Feature文件有三个规则:

一个Feature文件包含单个功能的说明和描述。

文件具有扩展名*.feature。

每个Feature文件包含若干Scenario,每个Scenario都有一些步骤来描述测试的条件,过程和结果。每个步骤用Given(假如),When(过程)和Then(结果)句式来描述。

如下图3所示:这个Feature文件用于验证今天是否是星期一,里有包含两个Scenario来测试。第一个是反向场景,验证今天不是星期一,第二个是正向场景,验证今天是星期一。每个测试用例都包含Given、When和Then步骤来描述前提条件、执行过程和测试结果。

3.png

图3 Feature文件示例

除了Feature文件外,还需要匹配测试用例Given、When和Then步骤的具体步骤定义。如下图4所示:给每个步骤定义函数加一个正则表达式定义,例如todayIs函数加上正则表达式定义@Given(“Today is (.*)$”),每个正则表达式以$符结束。当测试用例(Scenario)执行到Given today is Friday、Given today is Monday或者其它符合正则表达式的步骤,todayIs函数将被调用执行去实现测试步骤。

4.png

图4 步骤定义示例

当测试案例都执行完毕时,Serenity BDD负责展示执行结果报告,如下图5所示:饼图和Summary会告诉你执行的成功个数、失败个数、成功率和失败率等。也会列出每个Feature文件Scenario的执行成功率和失败率。针对失败的Scenario,报告也会列出具体失败的步骤和异常信息(此图未列出)。

5.png

图5 执行结果示例

实践与应用

本文的自动化测试框架可以适应多个应用场景,比如:

功能测试:如前文介绍,当开发提交新功能代码时,Jenkins自动触发去执行BDD测试案例,并返回结果。

回归测试:Jenkins可以定制一个作业(Job),定期执行回归测试,并返回结果。

在此框架上,我们还可以做一些扩展性功能,比如本文中开发了一个小工具,可以对Feature文件里面的所有测试用例进行关键字搜索,针对改变的不同代码块挑选合适的Scenario进行执行,大大提高了测试效率,精准定位测试问题。

总的来说,BDD是一种以沟通为核心的敏捷软件开发方法,通过测试人员、开发人员、业务人员和商业参与者之间不断的沟通,用一种双方都能理解的语言来定义和明确features,这些features通过持续集成框架转换成自动化的测试用例。这种方法可以确保开发出来的产品更符合需求、缩短开发阶段结束之后的测试周期、features确定完后更高的开发效率等。不过也有缺点,项目前期会有大量的时间消耗在逐一讨论feature上面。


版权声明:本文出自51Testing会员投稿,51Testing软件测试网及相关内容提供者拥有内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 移动智能设备已成为我们日常生活的一部分,我们比以往任何时候都更加依赖它们。随着 5G 在不久的将来的出现,用户利用智能手机和移动数据提供的潜力的方式将是惊人的。越来越多的需求都会转移到移动设备上实现。拥有一个响应式网页设计,可以更快、更高效地在众多设备上运行,这是组织面临的挑战。这里重要的是通过严格的测试确保您的网站提供统一的体验。在本文中,我们将详细了解移动 Web 测试的方法、不同的测试策略以及可以减轻测试过程复杂性的工具。响应式网页设计对于许多人来说,响应式这个词并不新鲜!然而,随着我们多年来移动用户的惊人增长,响应式设计已成为任何企业的关键。它使响应式测试成为绝对必要的。响应式网页设计...
            0 0 928
            分享
          •   nginxWebUI是一款图形化管理nginx配置得工具, 可以使用网页来快速配置nginx的各项功能, 包括http协议转发, tcp协议转发, 反向代理, 负载均衡, 静态html服务器, ssl证书自动申请、续签、配置等, 配置好后可一建生成nginx.conf文件, 同时可控制nginx使用此文件进行启动与重载,完成nginx闭环的图形化控制。  nginxWebUI也可管理多个nginx服务器集群, 随时一键切换到对应服务器上进行nginx配置, 也可以一键将某台服务器配置同步到其他服务器, 方便集群管理  nginx web用户界面(webui)并没有涵盖所有的ngi...
            0 0 2398
            分享
          •   你的免费礼品还有一个月就要失效了,速来领取吧!链接:http://vote.51testing.com/    测试一个项目,流程图起到至关重要的作用。流程图画对了,测的就好,流程图画错了,测的就不好。流程图可以梳理思路,区分角色。不同的角色功能也不一样。  比如:美团分为四个角色:买家,卖家,平台,骑手。  滴滴打车的角色有3个:车主,平台,乘客,而司机也可以细拆,专车司机,快车司机,代驾,拼车,机场接送,顺风车等,司机的车不同,APP上的功能也不同。  电商的角色一般有3个,卖家,平台,买家。卖家又分为官方自营和品牌进驻这个平台。卖东西的方式又可以分成单独购买、批量...
            0 0 1110
            分享
          •   据报道,一位美国联邦法官裁定,起诉芯片制造商高通公司涉嫌隐瞒反竞争的销售和许可行为的股东,可以通过集体诉讼的形式向该公司提出索赔。  这些股东在加利福尼亚州圣地亚哥提起的诉讼中称,高通公司及其高管多次将其销售芯片和向其他公司授权其技术的业务描述为相互独立的业务,而事实上该公司将其捆绑在一起,从而影响了公平竞争。  在此案中起到了领导作用的投资者称,这些虚假陈述在2012年至2017年间人为地抬高了高通公司的股价。  高通方面则称股东的这些指控毫无根据。  美国地区法官金苏克·奥塔(JinsookOhta)在本周一驳回了高通关于这些销售行为已经公开的论点。  这位法官表示,高通对监管机构的反...
            0 0 851
            分享
          • 小屌丝:鱼哥,我想写一个接口订单并发性能,能不能给我讲一下小鱼:接口订单并发?我前篇文章不是写过常见并发框架然后你在追加一个创建订单和生成订单不就可以了?小屌丝:鱼哥,你说的可轻松,那你能不能来一个?小鱼:好吧,那我就以我某个项目为例,我们实际的看一下,都需要哪些步骤。小屌丝: 鱼哥,就你这一点,最招人稀罕。哈哈!小鱼:挖草了~~那么我们就来分析一下,订单并发性能,我们想要什么:    >>1.订单并发数    >>2.成功订单数    >>...
            1 0 17526
            分享
      • 51testing软件测试圈微信