測(cè)試工程師應(yīng)知應(yīng)會(huì)之行為驅(qū)動(dòng)測(cè)試BDD
很多工程師都了解測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(Test Driven Development,TDD),但是了解行為驅(qū)動(dòng)開(kāi)發(fā)的人卻不是很多。
行為驅(qū)動(dòng)開(kāi)發(fā)(Behavior Driven Development,BDD),是測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的延伸,旨在使用簡(jiǎn)單的,特定于領(lǐng)域的腳本語(yǔ)言(軟件外包行業(yè)的最大問(wèn)題?從領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)說(shuō)起),通過(guò)結(jié)構(gòu)化的方法,將自然語(yǔ)言文本轉(zhuǎn)換為可執(zhí)行的測(cè)試用例。從而在技術(shù)與實(shí)際的業(yè)務(wù)需求者之間,建立起一條易于理解的道路。這樣,不理解程序員們正在做什么的業(yè)務(wù)方,就可以更容易的理解他們的工作。
在行為驅(qū)動(dòng)開(kāi)發(fā)中,最關(guān)注的核心是業(yè)務(wù)的設(shè)計(jì)。而測(cè)試驅(qū)動(dòng)開(kāi)發(fā),則更關(guān)心是的使用代碼來(lái)描述測(cè)試用例。因此,在行為驅(qū)動(dòng)開(kāi)發(fā)相關(guān)的框架中,采用了多種技術(shù)手段,構(gòu)造自然語(yǔ)言與代碼之間的連接關(guān)系,使得關(guān)注于業(yè)務(wù)邏輯的使用者,能夠使用更容易理解的語(yǔ)言,向測(cè)試代碼下達(dá)他們的指令。
下面我們通過(guò)當(dāng)前最為流行的BDD 框架JBehave來(lái)介紹一下BDD對(duì)于這種設(shè)計(jì)的實(shí)現(xiàn)。
在JBehave中,完全一個(gè)測(cè)試用例需要5個(gè)步驟。
一、編寫(xiě)測(cè)試用例
在JBehave中,一個(gè)測(cè)試用例由一系列場(chǎng)景(Scenario)組成。而一個(gè)場(chǎng)景的編寫(xiě),需要符合JBehave定義的語(yǔ)法格式。主要格式內(nèi)容如下:
在語(yǔ)法格式中,規(guī)定了一個(gè)測(cè)試用例的寫(xiě)法,以及其中特定的關(guān)鍵字,而這種寫(xiě)法力圖貼近于自然語(yǔ)言,并且能夠被框架所解析。
二、將測(cè)試用例映射到Java
編寫(xiě)好測(cè)試用例之后,JBehave會(huì)將測(cè)試用例映射成Java。這種映射主要通過(guò)RegexStoryParser(正則表達(dá)式)或者是GherkinStoryParser這兩種解析器來(lái)實(shí)現(xiàn)。
通過(guò)類似于
@Given("a stock of symbol $symbol and a threshold of $threshold")
public void stock(String symbol, double threshold) {
stock = new Stock(symbol, threshold);
}
的方式,可以將測(cè)試用例中的輸入映射進(jìn)Java函數(shù)的輸入?yún)?shù)中,盡管保持入?yún)⒌拿趾虭Given語(yǔ)句中的參數(shù)名字一致是一種好的習(xí)慣,但是JBehave是按照參數(shù)的順序來(lái)賦值的,并不要求名稱完全一致。
三、配置測(cè)試用例
JBehave的核心是配置的嵌入類,這是提供給IDE的可執(zhí)行入口,通過(guò)執(zhí)行該嵌入類,系統(tǒng)可以調(diào)用框架的相關(guān)方法,從而能夠完成JBehave提供的相關(guān)功能。
JBehave提供的可嵌入類主要有ConfigurableEmbedder和InjectableEmbedder兩種。
四、運(yùn)行測(cè)試用例
配置好嵌入類之后,就可以通過(guò)JUnit在IDE或者是命令行中運(yùn)行測(cè)試用例了。
五、查看報(bào)告
測(cè)試用例執(zhí)行完畢之后會(huì)給出測(cè)試報(bào)告,JBehave提供了多種測(cè)試報(bào)告可供使用,包括控制臺(tái)、文本文件、XML文件、HTML頁(yè)面等。