BDD 基于 Cucumber 的 BDD 自动化测试

Gavin · 2016年07月10日 · 最后由 蔡天明 回复于 2019年07月15日 · 3601 次阅读

基于 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 来实现脚本的运行。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 17 条回复 时间 点赞

做是很容易的,问题是封装行为方法就是体力活了😅

排版太乱了。

恒温 内容不符合版规屏蔽此话题 07月10日 18:25

行为的封装我已经实现了 web,ios,android 后续会慢慢的分享出来。

讲的什么?

—— 来自 TesterHome 官方 安卓客户端

最近在用 cucumber + serenity,感觉 serenity 还蛮强大,可能会省些体力活。另外比较喜欢 serenity 生成的 report。可以看看http://thucydides.info/docs/serenity-staging/ 😀

我们之前也用过几年,可读性很好,但是维护性不方便,多人协作情况下,feature 文件的 step 如何保证不冲突也是个难题,不知道现在有没有比较好的方法去弄?

Gavin #10 · 2016年07月11日 Author

我们在 cucumber 上封装了一个自动化测试平台,通过浏览器访问来编辑 feature 文件,建立了锁的机制,同一文件,同一时刻只能一个人来维护。

推荐个不错的 cucumber autocomplete plugin for Sublime

https://github.com/austincrft/sublime-gherkin-auto-complete-plus

Gavin #10 · 2016年07月11日 Author


我们封装之后通过这种方式实现

一共封装了多少个行为呢,够用了么,数量多了之后下拉列表选择起来方便吗

—— 来自 TesterHome 官方 安卓客户端

Gavin #12 · 2016年07月11日 Author

@tobytang,web 的差不多有 60 多个,android,ios 也就十几个,下拉框做了模糊搜索的。

#6 楼 @driver cucumber + serenity 你们这个有操作手册之类的东西吗,两者之间怎么连接的,一直在用 cucumber,但是想换其他的报告形式,跪求方式

@guoqx 报告我用的 cucumber-reporting

推荐一个不错的 Node.js + Cucumber 的开发工具,CukeTest,编辑、管理用例、视频、报表一应俱全。http://cuketest.com

Gavin 回复

你好,我们现在也需要在 cucumber 框架之上封装一个自动化测试平台,求指导。
feature 和 step 以及脚本是如何关联的?
能否指点迷津。

期待你得平台开源。😝

我现在只是封装好了后面的,前面的还是需要手动写 feature.

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册