基于 Cucumber 的 BDD 自动化测试

1. 活文档,一段代码认识 cucumber

# language :zh-CN
@baidu1
功能:*** 数据驱动百度搜索
  场景大纲:*** 数据驱动百度搜索
    #界面-首页
    假设我在浏览器打开@@@@@https://www.baidu.com/
    #界面-输入查询条件
    当我通过ID在输入框@@@@@kw@@@@@输入@@@@@<Input>
    并且我通过ID点击@@@@@su
    #界面-验证查询结果
    那么我将会在界面上看到@@@@@<Output>
  例子:*** 测试数据
   |Input                                          |Output   |
   |java                                           |java     |
   |github                                         |github   |

说明:

  1. cucumber 是基于自然语言的 BDD(Behaviour-Driven Development) 的测试框架,目前支持的已有 42 种语言之多,我们目前的看到的就是对中文的支持。
  2. # language :zh-CN,这个就是对支持语言的标记。
  3. @baidu1,这个就是当前脚本的标签 tag,   tag 可以看作是脚本的唯一性标记,可以通过 tag 唯一的制定脚本进行运行。
  4. 功能,就是对脚本覆盖的功能进行文字性的描述。
  5. 场景大纲,脚本覆盖的场景描述。
  6. 例子, 即为自动化测试的数据驱动。

2. 认识 cucumber 的关键字
cucumber 的原生代码是基于 ruby 的,cucumber 的命令行安装可以参考如下链接:
cucumber 安装链接

$ script/cucumber --i18n zh-CN  
 | feature          | "功能"       |  
 | background       | "背景"       |  
 | scenario         | "场景"       |  
 | scenario_outline | "场景大纲"     |  
 | examples         | "例子"       |  
 | given            | "* ", "假如" |  
 | when             | "* ", "当"  |  
 | then             | "* ", "那么" |  
 | and              | "* ", "而且" |  
 | but              | "* ", "但是" |  
 | given (code)     | "假如"       |  
 | when (code)      | "当"        |  
 | then (code)      | "那么"       |  
 | and (code)       | "而且"       |  
 | but (code)       | "但是"       | 

通过这些概念的了解,我们就很容易的能读懂这个脚本了,数据驱动实现百度搜索

3. Cucumber 的工作原理

说明:

  1. 面向业务:就是通过自然语言对自动化测试脚本的描述,方便的脚本的阅读与维护。
  2. 面向技术:写过 selenium 自动化测试的都知道我们对系统的每一步操作都会对应一行或多行代码。
  3. cucumber 的强大之处就在于把看似不相关的面向业务与面向技术实现了映射。

4. cucumber 实现 web 自动化测试
通过前面的讲解,大家明白 cucumber 实现自动化也是需要底层技术的,底层技术无非就是实现对 web 浏览器的驱动,我们使用 selenium2 的 webDriver 来实现。
通过下面的链接大家可以了解到,cucumber 可以通过多少种开发语言来实现与底层驱动的映射。
cucumber github

5. 在 idea 里面的代码结构

说明:

  1. resources 目录是用来存放 cucumber 的 feature 脚本文件。
  2. java 的 package 里面是放的是 selenium 的驱动代码,java 与 feature 的映射代码。

6.代码映射与实现
开篇的脚本回过头来再看一下,这个脚本的特点就是方便阅读,但是单单靠这个脚本是不能把自动化跑起来的,需要底层的 driver 来实现,下面这段代码就是与之对应的技术实现代码。

package com.XXXX.autoTest.webApp;
import cucumber.api.java.After;
import cucumber.api.java.Before;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.When;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
/**
 * Created by Administrator on 2015/10/21.
 */
public class StepDefinitions {
    private WebDriver driver;
    @Before
    public void setUp() {
        System.setProperty("webdriver.chrome.driver", "res/chromedriver.exe");
        driver = new ChromeDriver();
    }
    @Given("^我在浏览器打开@@@@@(.*)$")
    public void openUrl(String url) {
        driver.get(url);
    }
    @When("^我通过ID在输入框@@@@@(.*)@@@@@输入@@@@@(.*)$")
    public void inputById(String id, String value) {
        driver.findElement(By.id(id)).sendKeys(value);
    }
    @When("^我通过ID点击@@@@@(.*)$")
    public void clickById(String id) {
        driver.findElement(By.id(id)).click();
    }
    @After
    public void tearDown() {
        driver.quit();
    }
}

通过对照这段代码与开篇的脚本大家不难发现,两者的对应是靠 java 的注解来匹配的。

7.运行代码
java 代码的要集成 junit 或 testng 来实现脚本的运行。


↙↙↙阅读原文可查看相关链接,并与作者交流