在软件研发和测试过程中,当测试人员、开发人员以及业务人员沟通测试案例的功能点以及覆盖率时,复杂的功能需求和晦涩难懂的测试案例脚本脱节,让大家很难对测试功能点达到一致,也很难统计测试覆盖率。如果有一种通用语言来描述测试用例,让开发、测试和业务人员都能够很好地理解测试需求,步骤和目标,便可以最大程度避免由于理解偏差带来的不一致性问题,而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 工作流程
BDD测试用例详解
Cucumber如何结合Serenity BDD实现测试用例和展示执行测试用例的结果?如下图2所示:
1)首先,Cucumber用Gherkin语法来书写BDD测试用例。测试用例根据测试功能点集合在不同的Feature文件中,每个测试用例包含Given、When和Then等测试步骤。
2)Cucumber用正则表达式映射步骤定义和Gherkin书写的测试用例步骤。步骤定义在本文中是定义的Java函数,函数内有针对测试步骤具体的实现。当执行测试用例时,针对Feature文件中的每个测试用例(Scenario)的步骤,根据正则表达式匹配到步骤定义的函数,然后执行函数里的内容,达到测试的目的。
3)当测试执行完毕,Serenity BDD会收集执行结果,以较好的界面可视化展示,方便使用者统计结果和分析错误。
图2 Cucumber+SerenityBDD工作原理
Cucumber的Feature文件用来描述一个可测试的功能点,里面包含若干个正向或反向测试用例(Scenario)去测试这个功能点。定义Feature文件有三个规则:
一个Feature文件包含单个功能的说明和描述。
文件具有扩展名*.feature。
每个Feature文件包含若干Scenario,每个Scenario都有一些步骤来描述测试的条件,过程和结果。每个步骤用Given(假如),When(过程)和Then(结果)句式来描述。
如下图3所示:这个Feature文件用于验证今天是否是星期一,里有包含两个Scenario来测试。第一个是反向场景,验证今天不是星期一,第二个是正向场景,验证今天是星期一。每个测试用例都包含Given、When和Then步骤来描述前提条件、执行过程和测试结果。
图3 Feature文件示例
除了Feature文件外,还需要匹配测试用例Given、When和Then步骤的具体步骤定义。如下图4所示:给每个步骤定义函数加一个正则表达式定义,例如todayIs函数加上正则表达式定义@Given(“Today is (.*)$”),每个正则表达式以$符结束。当测试用例(Scenario)执行到Given today is Friday、Given today is Monday或者其它符合正则表达式的步骤,todayIs函数将被调用执行去实现测试步骤。
图4 步骤定义示例
当测试案例都执行完毕时,Serenity BDD负责展示执行结果报告,如下图5所示:饼图和Summary会告诉你执行的成功个数、失败个数、成功率和失败率等。也会列出每个Feature文件Scenario的执行成功率和失败率。针对失败的Scenario,报告也会列出具体失败的步骤和异常信息(此图未列出)。
图5 执行结果示例
实践与应用
本文的自动化测试框架可以适应多个应用场景,比如:
功能测试:如前文介绍,当开发提交新功能代码时,Jenkins自动触发去执行BDD测试案例,并返回结果。
回归测试:Jenkins可以定制一个作业(Job),定期执行回归测试,并返回结果。
在此框架上,我们还可以做一些扩展性功能,比如本文中开发了一个小工具,可以对Feature文件里面的所有测试用例进行关键字搜索,针对改变的不同代码块挑选合适的Scenario进行执行,大大提高了测试效率,精准定位测试问题。
总的来说,BDD是一种以沟通为核心的敏捷软件开发方法,通过测试人员、开发人员、业务人员和商业参与者之间不断的沟通,用一种双方都能理解的语言来定义和明确features,这些features通过持续集成框架转换成自动化的测试用例。这种方法可以确保开发出来的产品更符合需求、缩短开发阶段结束之后的测试周期、features确定完后更高的开发效率等。不过也有缺点,项目前期会有大量的时间消耗在逐一讨论feature上面。
版权声明:本文出自51Testing会员投稿,51Testing软件测试网及相关内容提供者拥有内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。