BDD测试框架之Cucumber使用入门

1

什么是Cucumber

cucumber早在ruby环境下应用广泛,作为BDD框架的先驱,cucumber后来被移植到了多平台,简单来说cucumber是一个测试框架,就像是juint或是rspec一样,不过cucumber遵循的是BDD的原则。

2

何为BDD?

BDD就是行为驱动开发,是一种软件开发流程或者说是软件开发实践,具体学术化的东西这里就不介绍了,归根到底,cucumber具有让你用自然语言编写用例的能力。

使用自然语言编写用例有很多好处,最直观的好处就是你的客户在一定的情况下是能够看懂你的测试用例的。最为项目的最核心因素,客户决定了项目该做成什么样,具有什么功能,不需要实现哪些功能。

客户是需求的源泉,如果我们的测试用例很够很好的跟需求结合起来,比如说我们用自然语言写的测试用例如果能让用户认同,那么在这种情况下,测试用例基本等同于原始的需求文档了。需求文档是开发的凭据,这样一来根据测试用例来实现具体的需求就一定是客户所希望完成的需求了,毕竟这些需求是经过用户首肯的。这样一来,我们就等同于是让测试用例驱动了开发,这就是所谓的测试驱动开发的一种不太严谨的初体验了。

cucumber就是这样一种可以把需求转换为测试用例,让测试用例即需求的测试框架。

3

Features介绍

feature(功能),每一个feature文件都要 开始于Feature(功能),Feature之后的描述可以随便写,知道出现Scenario(场景),一个feature中可以有多个 Scenario,每个Scenario包含(step)步骤列表,步骤使用Given、When、Then、But、And这些关键 词,cucumber对这些关键词的处理是一样的,但是我们在使用的时候需要按照场景区分。

4

Step denfinitions介绍

Cucumber中定义的每一个step(步骤)都需要有一个step definition对应,默认的话是使用Ruby来编写定义的脚本(现在有cucumber-js等也支持javascript、java等来编写),支持通过正则表达式从step中传递参数。

Step definition的详细说明可以参考

https://github.com/cucumber/cucumber/wiki/Step-Definitions

5

Given When then(假如 当 那么)

Cucumber的步骤中会包含Given、When、then这些词组,cucumber本身在技术实现上不区分这三个词组,但是在使用上推荐按照词组的意思来使用。

  • Given-用例开始执行前的一个前置条件,类似与编写代码setup中的一些步骤。
  • When-用例开始执行的一些关键操作步骤,类似点击元素等。
  • Then-观察结果,就是平时用例中的验证步骤。
  • And-一个步骤中如果存在多个Given操作,后面的Given可以用And替代。
  • But-一个步骤中如果存在多个Then操作,第二个开始后面的Then可以用But替代。

6

Cucumber使用

查看cucumber支持的语言 cucumber --i18n help,查看支持语言的关键字 cucumber –i18n zh-CN(目前中文不太会用)。

先跑起来个demo吧

先编写feature文件(即需求,要做的事)

在maven工程的test目录下创建\resources\feature\demo.feature文件

demo.feature

Feature: 验证计算器计算功能  打开计算器进行计算  @CalculatorTest  Scenario: 打开计算器进行计算1+1    Given 打开计算器面板    When  已经输入1并按下+    And   输入 "1"    And   按下=号    Then  等待计算结果

编写代码测试代码(部分术语参考第5大项)

Calculator(测试用例部分)

package com.cucumber.demo;

import cucumber.api.java.en.And;import cucumber.api.java.en.Given;import cucumber.api.java.en.Then;import cucumber.api.java.en.When;
public class Calculator {
    @Given("^打开计算器面板$")    public void openCalculator() throws Exception {        System.out.println("打开计算器面板");    }
    @When("^已经输入1并按下+")    public void alreadyInput1() {        System.out.println("已经输入1并按下+");    }

    @And("^输入 \"([^\"]*)\"$")    public void input1(String num) throws Throwable {        System.out.println("输入"+num);    }
    @And("^按下=")    public void pressEaualButton(){        System.out.println("按下=");    }
    @Then("^等待计算结果")    public void wait_the_query_result() throws InterruptedException {        System.out.println("等待计算结果");    }
}

RunCukesTest(执行测试部分)

package com.cucumber.demo;
import cucumber.api.CucumberOptions;import cucumber.api.junit.Cucumber;import org.junit.runner.RunWith;
@RunWith(Cucumber.class)@CucumberOptions(        features = {"src/test/resources/feature/"},        format = {"pretty", "html:target/cucumber", "json:target/cucumber.json"},        glue = {"com.cucumber"},        tags = {"@CalculatorTest"})public class RunCukesTest {}

pom文件

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>Cucumber_Test</groupId>    <artifactId>Cucumber_Test</artifactId>    <version>1.0-SNAPSHOT</version>    <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    </properties>    <dependencies>        <dependency>            <groupId>info.cukes</groupId>            <artifactId>cucumber-core</artifactId>            <version>1.2.3</version>        </dependency>        <dependency>            <groupId>info.cukes</groupId>            <artifactId>cucumber-java</artifactId>            <version>1.2.3</version>        </dependency>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.12</version>        </dependency>        <dependency>            <groupId>info.cukes</groupId>            <artifactId>cucumber-junit</artifactId>            <version>1.2.3</version>        </dependency>        <dependency>            <groupId>org.seleniumhq.selenium</groupId>            <artifactId>selenium-java</artifactId>            <version>2.47.1</version>        </dependency>        <dependency>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-surefire-plugin</artifactId>            <version>2.12.4</version>        </dependency>        <dependency>            <groupId>org.picocontainer</groupId>            <artifactId>picocontainer</artifactId>            <version>2.14</version>        </dependency>        <dependency>            <groupId>info.cukes</groupId>            <artifactId>cucumber-picocontainer</artifactId>            <version>1.2.3</version>        </dependency>    </dependencies>    <build>        <plugins>            <plugin>                <groupId>org.apache.maven.plugins</groupId>                <artifactId>maven-surefire-plugin</artifactId>                <configuration>                    <forkMode>once</forkMode>                    <argLine>-Dfile.encoding=UTF-8</argLine>                </configuration>            </plugin>        </plugins>    </build></project>

7

如何执行

选中RunCukesTest,右键run test即可

maven test

8

运行结果

9

测试报告

10

感受

用着不太习惯,正则表达式这个有点烦,测试报告应该可以在扩展,后期再去尝试改造。

优点:个人觉得给人看,逼格很高,层次分明。

本文分享自微信公众号 - V社 北京社(SoftwareTesters)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏相约机器人

BERT:我训练再久一点、数据量再大一点,就能重返SOTA

上个月,XLNet 在 20 项任务上全面超越了 BERT,创造了 NLP 预训练模型新记录,一时风光无两。但现在,XLNet 刚屠榜一个月,剧情再次发生反转:...

9530
来自专栏数据派THU

NLP领域近期有哪些值得读的开源论文?(附下载)

本文是清华大学徐葳老师组和刘知远老师组发表于 ACL 2019 的工作,论文在远程监督与弱监督融合两种技术之间搭建起了一座桥梁,既通过自动生成模式减轻了对领域专...

18020
来自专栏人工智能头条

杀手级AI补代码工具问世,支持23种语言及5种主流编辑器,程序员沸腾了

一位来自加拿大的大四学霸,开发了一款”Deep TabNine“代码补全工具,实现了这一大胆的想法。

14330
来自专栏量子位

一个API调用27个NLP预训练模型:BERT、GPT-2全囊括,像导入NumPy一样容易

只需一个API,就能调用BERT、XLM等多种语言模型,逆天的GPT-2也一样轻松到碗里来,这样的模型库你是否期待?

11820
来自专栏数据派THU

杀手级AI补代码工具问世,支持23种语言、5种主流编辑器!(附链接)

本文介绍了新开发出的“Deep TabNine“代码补全工具,支持多种编程语言和编辑器。

13920
来自专栏AI科技评论

深度 | 李航:未来 5 到 10 年,自然语言对话该如何寻求突破?

AI 科技评论按:如今,已渗透到人类生活方方面面的对话 AI ,成为了连接人类与 AI 技术最紧密的一根纽带。然而,自然语言对话技术目前存在的难以克服的挑战,也...

11050
来自专栏AI小白入门

达观杯文本智能处理挑战赛冠军解决方案

之前整理了一份自己的Rank 4的解决方案,并开源了部分代码,原文链接:“达观杯”文本智能处理挑战赛,季军带你飞。这次分享一下朋友(NLP幼儿园)整理的"达观杯...

13420
来自专栏AI小白入门

“达观杯”文本智能处理挑战赛,季军带你飞

前段时间和朋友何从庆(AI算法之心)等队友一起组队参加了这个比赛,本来以为小比赛人少,没想到参加的人会有几千人。最后我们队伍取得季军(4st/3131),虽有些...

8120
来自专栏磐创AI技术团队的专栏

一文看懂NLP神经网络发展历史中最重要的8个里程碑!

导读:这篇文章中作者尝试将 15 年的自然语言处理技术发展史浓缩为 8 个高度相关的里程碑事件,不过它有些偏向于选择与当前比较流行的神经网络技术相关的方向。我们...

11150
来自专栏AI小白入门

自然语言处理中注意力机制综述

近些年来,注意力机制一直频繁的出现在目之所及的文献或者博文中,可见在nlp中算得上是个相当流行的概念,事实也证明其在nlp领域散发出不小得作用。这几年的顶会pa...

14620

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励