深圳幻海软件技术有限公司 欢迎您!

测试工程师应知应会之行为驱动测试BDD

2023-02-28

很多工程师都了解测试驱动开发(TestDrivenDevelopment,TDD),但是了解行为驱动开发的人却不是很多。行为驱动开发(BehaviorDrivenDevelopment,BDD),是测试驱动开发的延伸,旨在使用简单的,特定于领域的脚本语言(软件外包行业的最大问题?从领域驱动设计说起)

很多工程师都了解测试驱动开发(Test Driven Development,TDD),但是了解行为驱动开发的人却不是很多。

行为驱动开发(Behavior Driven Development,BDD),是测试驱动开发的延伸,旨在使用简单的,特定于领域的脚本语言(软件外包行业的最大问题?从领域驱动设计说起),通过结构化的方法,将自然语言文本转换为可执行的测试用例。从而在技术与实际的业务需求者之间,建立起一条易于理解的道路。这样,不理解程序员们正在做什么的业务方,就可以更容易的理解他们的工作。

在行为驱动开发中,最关注的核心是业务的设计。而测试驱动开发,则更关心是的使用代码来描述测试用例。因此,在行为驱动开发相关的框架中,采用了多种技术手段,构造自然语言与代码之间的连接关系,使得关注于业务逻辑的使用者,能够使用更容易理解的语言,向测试代码下达他们的指令。

下面我们通过当前最为流行的BDD 框架JBehave来介绍一下BDD对于这种设计的实现。

在JBehave中,完全一个测试用例需要5个步骤。

一、编写测试用例

在JBehave中,一个测试用例由一系列场景(Scenario)组成。而一个场景的编写,需要符合JBehave定义的语法格式。主要格式内容如下:

Story := Description? Meta? Narrative? GivenStories? Lifecycle? Scenario+ ;

Narrative:= "Narrative:" ( InOrderTo AsA IWantTo | AsA IWantTo SoThat ) ;

InOrderTo:= "In order to" NarrativeElementContent ;

IWantTo:= "I want to" NarrativeElementContent ;

SoThat:= "So that" NarrativeElementContent ;

NarrativeStartingWord := ("In order to" | "As a" | "I want to" | "So that") ;

GivenStories:= "GivenStories:" (StoryPath ','?)+ ;

Lifecycle:= "Lifecycle:" LifecycleBefore? LifecycleAfter? Examples?

LifecycleBefore:= "Before:" (Scope? Step+)+

LifecycleAfter:= "After:" (Scope? Outcome? MetaFilter? Step+)+

Scope:= "Scope:" "STEP" | "SCENARIO" | "STORY"

Outcome:= "Outcome:" "ANY" | "SUCCESS" | "FAILURE" ;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

在语法格式中,规定了一个测试用例的写法,以及其中特定的关键字,而这种写法力图贴近于自然语言,并且能够被框架所解析。

二、将测试用例映射到Java

编写好测试用例之后,JBehave会将测试用例映射成Java。这种映射主要通过RegexStoryParser(正则表达式)或者是GherkinStoryParser这两种解析器来实现。

通过类似于

@Given("a stock of symbol $symbol and a threshold of $threshold")

public void stock(String symbol, double threshold) {

stock = new Stock(symbol, threshold);

}

QQ">的方式,可以将测试用例中的输入映射进Java函数的输入参数中,尽管保持入参的名字和@Given语句中的参数名字一致是一种好的习惯,但是JBehave是按照参数的顺序来赋值的,并不要求名称完全一致。

三、配置测试用例

JBehave的核心是配置的嵌入类,这是提供给IDE的可执行入口,通过执行该嵌入类,系统可以调用框架的相关方法,从而能够完成JBehave提供的相关功能。

JBehave提供的可嵌入类主要有ConfigurableEmbedder和InjectableEmbedder两种。

 

四、运行测试用例

配置好嵌入类之后,就可以通过JUnit在IDE或者是命令行中运行测试用例了。

五、查看报告

测试用例执行完毕之后会给出测试报告,JBehave提供了多种测试报告可供使用,包括控制台、文本文件、XML文件、HTML页面等。