雪花新聞

新一代BDD框架Gauge+Taiko

BDD是什麼

BDD,Behavior Driven Development,行爲驅動開發。

如果你不是很瞭解BDD,可以參考我四年前的一篇文章 說起BDD,你會想到什麼 ,其中介紹過BDD的理論和應用。

我們可以這樣來概括BDD:

BDD應用框架之Cucumber

BDD的應用

BDD是爲解決下面三個方面的問題而生:

  1. 協作:多個角色在一個團隊,如何從一致理解需求開始高效協作?
  2. 語言:不同的角色業務、開發和測試人員分別說自己的語言,如何統一語言,更有效的溝通?
  3. 文檔:編寫和維護的成本都很高,如何低成本的維護一份有價值的文檔?

Cucumber是一款支持BDD的框架,有助於幫助團隊解決以上問題。

Cucumber支持用自然語言描述業務場景,需要遵循Given-When-Then的格式,這樣就可以容易的對應到自動化測試的3A步驟Arrange-Act-Assert,從而實現業務場景的自動化測試。

Cucumber的理想是將可執行的需求規範、自動化測試和活文檔有機的結合,如下圖所示:

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);
});

新一代BDD框架

藍鯨項目曾經就是用Cucumber+Selenium WebDriver實現的UI層自動化測試,由於上述痛點,大家覺得UI自動化測試越來越難寫,我也因此對BDD喪失了信心。

自從遇到了兩款新的工具Gauge+Taiko,我又重新對Web系統的實現基於BDD的自動化測試燃起了希望。

Gauge

Gauge 是一款開源的輕量級跨平臺自動化測試工具,它的願景是用更少的代碼、更少的維護工作實現更多的自動化測試,有如下特性:

Taiko

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洞見

相關文章