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吧

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

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

demo.feature

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

6.2、编写代码测试代码(部分术语参考第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、如何执行

7.1选中RunCukesTest,右键run test即可

7.2 maven test

8、运行结果

9、测试报告

10、感受

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

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

参考链接:

https://www.cnblogs.com/dami520/p/3168864.html

https://www.cnblogs.com/nbkhic/p/4874889.html

行为驱动:BDD框架之Cucumber初探的更多相关文章

  1. BDD框架之Cucumber研究

    BDD框架之Cucumber研究 引用链接:http://kongqingyun123.blog.163.com/blog/static/6377283520134158437813/ Cucumbe ...

  2. python BDD 框架之lettuce

    http://pythonhosted.org/lettuce/ 介绍                                                                 ...

  3. 虫师Selenium2+Python_12、BDD框架之Lettuce入门

    http://www.cnblogs.com/fnng/p/3415609.html P293--简介: TDD(Test-Drivern-Development)测试驱动开发 ATDD(Accept ...

  4. BDD框架之lettuce---python3.+安装报错

    跟虫师学习python,学到BDD框架之lettuce( http://www.cnblogs.com/fnng/p/3415609.html),发现python3.5环境下安装lettuce后无法正 ...

  5. python webdriver 从无到有搭建混合驱动自动化测试框架的过程和总结

    一步一步实现混合驱动自动化测试框架的搭建 混合驱动自动化测试框架,是一个非常高级的框架,非常好用,但也很难,不好掌握,需要多练习,就像搭建数据驱动框架一样,需要自己去一点一点的写,一边搭建一边做思路整 ...

  6. 基于事件驱动的DDD领域驱动设计框架分享(附源代码)

    原文:基于事件驱动的DDD领域驱动设计框架分享(附源代码) 补充:现在再回过头来看这篇文章,感觉当初自己偏激了,呵呵.不过没有以前的我,怎么会有现在的我和现在的enode框架呢?发现自己进步了真好! ...

  7. [转] DDD领域驱动设计框架分享

    从去年10月份开始,学了几个月的领域驱动设计(Domain Driven Design,简称DDD).主要是学习领域驱动设计之父Eric Evans的名著:<Domain-driven desi ...

  8. 22.Linux-块设备驱动之框架详细分析(详解)

    本节目的: 通过分析块设备驱动的框架,知道如何来写驱动 1.之前我们学的都是字符设备驱动,先来回忆一下 字符设备驱动: 当我们的应用层读写(read()/write())字符设备驱动时,是按字节/字符 ...

  9. DDD「领域驱动设计」分层架构初探

    前言 基于 DDD 传统分层架构实现. 项目 github地址:https://github.com/WuMortal/DDDSample 这个分层架构是工作中项目正在使用的分层架构,使用了一段时间发 ...

随机推荐

  1. Extjs.net Button点击下载jpg图片

    <ext:Button ID=" AutoPostBack="false"> <DirectEvents> <Click OnEvent=& ...

  2. Linux文件权限设置

    基本概念 https://linux.cn/article-7418-1.html#3_8880 用户管理 文件权限设置 -添加用户账户08% -理解 /etc/passwd 中的内容12% -理解 ...

  3. java基础之自定义异常类及throw和throws的区别

    一.异常的架构: Throwable类:所以异常类都是Throwable的子类,它派生两个子类 Error和Exception. Error类:表示仅靠程序本身无法恢复的的严重错误,比如内存溢出,虚拟 ...

  4. request和reponse

  5. String,StringBuilder,StringBuffer区别

    一.String,StringBuilder,StringBuffer的大概了解 大家知道String,StringBuilder,StringBuffer三个的基本应用场景. String会一直创建 ...

  6. 5-5 re模块 正则表达式

    1,正则表达式 正则表达式,就是匹配字符串内容的一种规则. 官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字 ...

  7. UOJ #276「清华集训2016」汽水

    为什么你们常数都这么小啊 UOJ #276 题意:在树上找一条链使得|边权平均值$ -k$|尽量小,$ n<=5e4$ $ Solution:$ 首先二分答案$ ans$,即我们需要找一条链使得 ...

  8. Palindromic Numbers LightOJ - 1205

    题目大意: 求区间内的回文数个数 题目思路: 数位dp,先枚举前一半数字,然后填上相应的后一半数字. #include<cstdio> #include<cstring> #i ...

  9. python 三大框架之一Flask入门

    Flask轻量级框架,Flask是python中的轻量级框架. 打开终端 输入pip install Flask 命令 下载以及安装Flask框架 检查是否下载成功及能否使用 首先导入python环境 ...

  10. 【Nginx】Nginx简介及在CentOS7.0下安装教程

    是什么 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.其特点是占有内存少,并发能力强,事实上nginx的并发能 ...