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吧

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

原文地址:https://www.cnblogs.com/longronglang/p/10360027.html

时间: 2024-08-30 14:14:51

BDD框架之Cucumber初探的相关文章

常见的BDD框架

常见的BDD框架: ?C – Cspec ?C++ – CppSpec, Spec-CPP ?.Net – NBehave, NSpecify, SpecFlow ?Groovy – GSpec, easyb, Cuke4Duke ?PHP – PHPSpec ?Python – Specipy ?Ruby – RSpec, Shoulda, Cucumber 与Java相关的BDD测试工具: ?JBehave – Java annotations based, Test frameworks

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

http://www.cnblogs.com/fnng/p/3415609.html P293——简介: TDD(Test-Drivern-Development)测试驱动开发 ATDD(Acceptance-Test-Drivern-Development)验收测试驱动开发 BDD(Behavior Drivern Development)行为驱动开发,是一种敏捷开发技术 基于Python的BDD框架是Lettuce 基于ruby语言的cucumber更加实用 Lettuce安装 官网:Let

Python Web框架之Django初探(一)

Python Web框架之Django初探 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件.并于2005年7月在BSD许可证下发布.这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的. Django可以运行在Apache,Nginx上,也可以运行在支持WSGI,FastCGI的服务器上.支持多种数据

WCF框架处理流程初探

拜读了大牛蒋金楠的<WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构>,写点心得. (原文:http://www.cnblogs.com/artech/archive/2009/06/18/1506163.html#!comments) 首先需要理解的是WCF的大致处理流程,设计到了哪些主要的类.下面的图片很好的诠释了处理流程. 代码上,作者在客户端和服务端分别创建了需要用来编码的Encoder和用来序列化/反序列化的DispatchFormatter,实际用到的类是DataC

移动框架 jquery mobile 初探

年前给单位写了个小系统,主要用于年末各种评选工作,按照领导要求,需要在移动端进行开发,所以顺便就学习了移动 web开发.由于是初次接触,曲曲折折,最终完成,不过自己甚不满意,不够完美.在这里面走了不少弯路,积累了一些经验. 移动前端,使用的是几样技术的综合,主要的部分就是应用responsive布局,详细一点,用的技术有媒体查询,流体布局,自适应缩放,ajax,viewport属性,移动端屏幕DPI等等还有很多的细节方面. 最后为了节省时间,就选择了现在比较成熟的移动框架,Jquery Mobi

python自动化之BDD框架之lettuce初识问题集

最近在学习虫师老师编写的python自动化的书.其中讲到了BDD结构lettuce入门一章. 因为是小白,按部就班地进行操作,先不谈执行操作如何,先来讲讲遇到的几个坑,和怎么解决的: 第一坑:python2 和 Python3 安装在同一台主机上,怎么区分运行,而不干扰? 同是python命令怎么在cmd中执行?pip安装第三方库呢? 解决方法: a.找到安装位置,copy python.exe在当前目录,然后将副本重命名为python2:同样的方法将python3进行同样的操作:b.进入各自的

python的行为驱动开发(BDD)

教程一: 基于Python的行为驱动开发实战: http://python.jobbole.com/81303/ 基于Python的行为驱动开发实战 英语原文地址: http://code.tutsplus.com/tutorials/behavior-driven-development-in-python--net-26547 Python BDD自动化测试框架初探: http://lovesoo.org/python-bdd-exploration-of-the-automated-tes

移动APP自动化测试框架

简介 移动APP的UI自动化测试长久以来一直是一个难点,难点在于UI的"变", 变化导致自动化用例的大量维护.从分层测试的角度,自动化测试应该逐层进行.最大量实现自动化测试的应该是单元测试,最容易实现也最容易在早期发现问题:其次是接口级测试,以验证逻辑为目的进行自动化,由于接口的相对稳定,自动化测试成本相对也可以接受:自动化成本最大的便是UI级自动化测试,然而UI界面是直接反馈给用户的效果展示,适度的尤其是BVT级的自动化测试也是非常必要的.本文通过分析几种自动化框架的异同,使测试人员

TDD和BDD

Test-Driven Development(TDD)即测试驱动开发,它是一种测试先于编写代码的思想用于指导软件开发.测试驱动开发是敏捷开发中的一项核心实践和技术,也是一种设计方法论.TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码.它的工作流程如下所示: TDD方法的一些特点: 有利于更加专注软件设计: 清晰地了解软件的需求: 很好的诠释了代码即文档. Behavior Driven Development,行为驱动开发是一种敏捷软件开发的技术,它鼓