自动化测试之cucumber(一)

简介

cucumber是BDD(Behavior-driven development,行为驱动开发)的一个自动化测试的副产品。它使用自然语言来描述测试,使得非程序员可以理解他们。Gherkin是这种自然语言测试的简单语法,而Cucumber是可以执行它们的工具。关于BDD有兴趣自行了解。附cucumber官网链接,里面也有关于BDD的信息。
cucumber本质上是使用根据正则表达式匹配自然语言,然后依次执行对应的方法,以达到测试的目的。

本文基本上只是官网的搬运工,摘要了部分信息,最好还是看官网文档。

Gherkin

Gherkin是自然语言测试的简单语法。
一个完整的测试是由多个step组成的,step即最小单元,如何复用step是非常关键的问题。多个step组成一个Scenario,即一个完整的测试case。多个Scenario组成一个Feature,即一组相关的测试case。

关键字

  • Feature
  • Example(or Scenario)
  • Given,When,Then,And,But(steps)
  • Background
  • Scenario Outline (or Scenario Template)
  • Examples (or Scenarios)

一个简单的例子

Feature: Is it friday yet?
  this is a descriptions
  Everybody want to know when it's Friday

  Scenario: Sunday isn't Friday
    Given today is Sunday
    When I ask whether it's Friday yet
    Then I should be told "Nope"

  Scenario: Friday is Friday
    Given today is Friday
    When I ask whether it's Friday yet
    Then I should be told "TGIF"

Feature

Feature是所有测试的开头。后面跟一段描述性的文字,表明这个测试文件是干什么的。

description

description是一段扩展性的文字描述,可以跟在Feature、Example、Background、Scenario、Scenario Outline下面。

Example和Scenario

Example和Scenario是一对同义词,是一个具体的测试case,包含了多个step。一般情况下,都是由Given(给定一个初始条件),When(发生了什么),Then(结果是什么)组成的。

Steps

step是cucubmer的最小单元,每个step是由Given, When, Then, And, 或者But开头的。如果关键词后面的内容是完全一样的话,那么cucumber会认为这两句话是重复的,哪怕前面的关键词不一样,如

Given there is money in my account
Then there is money in my account

这种限制也促使我们使用更加准确的语言去描述

Given my account has a balance of £430
Then my account should have a balance of £430

Given

Given一般用于在Scenario中描述系统的初始状态。它的目的是使系统在使用前处于一个已只的状态,要避免在Given中谈论交互上的事情。

When

When描述一个事件或者动作。他可以是与系统间的交互,也可以是由另一个系统触发的事件。cucumber强烈推荐每个Scenario只有一个When,当你觉得需要加更多的When的时候,通常就是需要拆分成多个Scenario的信号。

Then

Then描述期望的输出或者结果。对Then的step definition应该使用断言去比较期望值和实际值,就和单元测试差不多。

But和And

当有几个Given,When,Then的时候,可以写成

Example: Multiple Givens
  Given one thing
  Given another thing
  Given yet another thing
  When I open my eyes
  Then I should see something
  Then I shouldn't see something else

也可以用And和But增加其可读性

Example: Multiple Givens
  Given one thing
  And another thing
  And yet another thing
  When I open my eyes
  Then I should see something
  But I shouldn't see something else

step definition里个人并不建议使用@And和@But,只使用@Given,@When,@Then,这样语言更加明确,因为And和But都可以在Given,When,Then的下面使用。

Background

当在同一个Feature里有多个Scenario有相同Given的时候,可以使用Background将这些Given抽到一起。这样这个Feature的每个Scenario在运行的时候,都会先运行一次Background。每个Feature里只能有一个Background。

tips
  • 不要设置复杂的状态,除非该状态实际上是客户需要知道的
  • 保持background简短,因为在阅读Scenario的时候,是需要记住background的。最好不要超过4行
  • 一个feature只能有一个background,如果需要不同的background针对不同的方案,就需要分拆成不同的feature

Scenario Outline

Scenario Outline即Scenario的模板,也可写作Scenario Template。它可运行相同的Scenario多次。

Scenario: eat 5 out of 12
  Given there are 12 cucumbers
  When I eat 5 cucumbers
  Then I should have 7 cucumbers

Scenario: eat 5 out of 20
  Given there are 20 cucumbers
  When I eat 5 cucumbers
  Then I should have 15 cucumbers

可用Scenario Outline简化

Scenario Outline: eating
  Given there are <start> cucumbers
  When I eat <eat> cucumbers
  Then I should have <left> cucumbers

  Examples:
    | start | eat | left |
    |    12 |   5 |    7 |
    |    20 |   5 |   15 |

DataTable

Gherkin可以传递List,Map,称为DataTable,具体例子查看该github上的文档

方言

Gherkin支持多种方言,对应关键字转换查看该文档

状态共享

不同step里定义的变量,可以通过java类的成员变量达到共享上下文变量的目的。如上例子的today和actualAnswer。
而状态泄露会使得scenarios变得脆弱和难以维护。详细信息查看该文档

注释

Gherkin使用#作为注释符号

step definition

step definition是指通过正则表达式对应到一个或多个Gherkin step的java方法。如下例子是上面例子对应的step definition

public class FridayYet {

    private String today;
    private String actualAnswer;


    @Given("^today is (.*)$")
    public void todayIsSunday(String day) {
        this.today = day;
    }

    @When("^I ask whether it's Friday yet$")
    public void iAskWhetherItsFridayYet() {
        if (this.today.equals("Friday")) {
            this.actualAnswer = "TGIF";
        } else {
            this.actualAnswer = "Nope";
        }
    }

    @Then("^I should be told \"(.*)\"$")
    public void iShouldBeToldNope(String expectedAnswer) {
        Assert.assertEquals(expectedAnswer, actualAnswer);
    }
}

替代文本

使用/作为替代文本。如下例子可匹配I have {int} cucumber(s) in my belly和I have {int} cucumber(s) in my stomach

I have {int} cucumber(s) in my belly/stomach

3.0.1版本前,无法转义/,始终被解释为替代文本,3.0.1后用\/转义/
附github版本变更记录

tag

tag提供2个作用

  1. 提供@before和@after的钩子(tagged-hooks)
  2. 运行时只运行指定tag的用例
    tag具有继承特性,即在Feature上标记tag,该Feature下的Scenario,step会继承该tag。
@simpleDemo
Feature: Is it friday yet?
@RunWith(Cucumber.class)
@CucumberOptions(tags = "@simpleDemo")// 指定只运行代用@simpleDemo的
public class CucumberTest {
}
@Before("@simpleDemo")
public void beforeOperation() {
        
}

@After("@simpleDemo")
public void afterOperation() {

}

测试过写两个tag,两个都会生效
结合Background具体的运行顺序是 before tag -> Background -> Scenario -> after tag

  1. 以上2点是官网提出的,个人认为还有第三点作用:生成report的时候提供分类作用

update at 2019年03月25日
tips: cucumber.api.spring.SpringTransactionHooks(cucmber-spring包)提供了一个spring事务的钩子@txn,提供回滚功能。

IDE插件

IDEA Cucumber for Java

report

具体没看,有兴趣可以自行了解
自动化测试之cucumber(四)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345