BDD,Behavior Driven Development,行为驱动开发。
如果你不是很了解BDD,可以参考我四年前的一篇文章说起BDD,你会想到什么,其中介绍过BDD的理论和应用。
我们可以这样来概括BDD:
BDD是为解决下面三个方面的问题而生:
Cucumber是一款支持BDD的框架,有助于帮助团队解决以上问题。
Cucumber支持用自然语言描述业务场景,需要遵循Given-When-Then的格式,这样就可以容易的对应到自动化测试的3A步骤Arrange-Act-Assert,从而实现业务场景的自动化测试。
Cucumber的理想是将可执行的需求规范、自动化测试和活文档有机的结合,如下图所示:
Cucumber的理想
理想很丰满,现实很骨感。Cucumber在实际应用中的情况又如何呢?
Cucumber框架实现Web自动化测试包括两个部分:Feature(特性)文件和Step Definition(测试实现),在实际应用中人们普遍感觉到它的复杂。
Cucumber-js+Selenium WebDriver实现的代码长这样:
Feature定义:
Feature: google Search
Scenario: Finding some cheese
Given I am on the Google search page
When I search for "Cheese!"
Then the page title should start with "cheese"
Steps实现
Given('I am on the Google search page', async function () {
await driver.get('http://www.google.com');
});
When('I search for {string}', async function (searchTerm) {
const element = await driver.findElement(By.name('q'));
element.sendKeys(searchTerm, Key.RETURN);
element.submit();
});
Then('the page title should start with {string}', {timeout: 60 * 1000}, async function (searchTerm) {
const title = await driver.getTitle();
const isTitleStartWithCheese = title.toLowerCase().lastIndexOf(`${searchTerm}`, 0) === 0;
expect(isTitleStartWithCheese).to.equal(true);
});
蓝鲸项目曾经就是用Cucumber+Selenium WebDriver实现的UI层自动化测试,由于上述痛点,大家觉得UI自动化测试越来越难写,我也因此对BDD丧失了信心。
自从遇到了两款新的工具Gauge+Taiko,我又重新对Web系统的实现基于BDD的自动化测试燃起了希望。
Gauge是一款开源的轻量级跨平台自动化测试工具,它的愿景是用更少的代码、更少的维护工作实现更多的自动化测试,有如下特性:
Taiko也是一款开源浏览器自动化测试工具,它的特性如下:
Taiko的特性
Gauge+Taiko的代码长这样:
Spec定义
# Google Search
This is an executable specification file. This file follows markdown syntax.
Every heading in this file denotes a scenario.
Every bullet point denotes a step.
To execute this specification, use
npm test
## Finding some cheese
* Goto Google search page
* Google for "Cheese!"
* Page title starts with "Cheese"
Steps实现
step("Goto Google search page", async function() {
await goto("www.google.com");
});
step("Google for <query>", async (query) => {
await write(query);
await click("Google 搜尋");
});
step("Page title starts with <content>", async (content) => {
await title().then((pageTitle) =>{
assert.ok(pageTitle.startsWith(content));
});
});
协作是人的问题,工具可以起到辅助作用,但是不能解决根本问题,过于严格的工具缺乏灵活性,反而阻碍了高效协作的可能。
Gauge不强调协作,可以作为自动化测试工具独立存在,同时又支持高效协作、支持实现BDD,是一款灵活性更好的框架。它的秘密武器Taiko是一款优秀的Web UI自动化工具,两者的结合堪称完美,让需求规范、自动化测试和活文档的有机结合真正成为可能。
本文只是将Gauge和Taiko跟Cucumber框架从对BDD的角度做简单的对比,更多的关于Gauge和Taiko的高级特性,请参考【延伸阅读】部分相关文章。
文/ThoughtWorks 林冰玉