转载:https://yaowenjie.github.io/%E7%BC%96%E7%A8%8B%E7%9B%B8%E5%85%B3/cucumber-test-part-2

承接上文

  前一篇博客介绍了如何写一个简单的Selenium Test,接下来你将会了解如何将其转化更符合BDD(行为驱动开发)思想的Cucumber专有语言。

添加依赖

  第一步还是要在 build.gradle 文件内的Dependencies内添加相应的依赖:

compile('info.cukes:cucumber-java8:1.2.4')
compile('info.cukes:cucumber-junit:1.2.4')

  当然,如果你用的不是java8,也可以换成对应的其他依赖。然后像之前一样,执行gradle的build指令,完成添加依赖。

编写Feature文件

  接下来,你可能就会想着把上一篇博客提到的步骤转化为Cucumber的语言,也就是feature文件,如下所示:

@base_flow
Feature: This is a simple test using Cucumber. Scenario:
Given I enter my blog address "https://yaowenjie.github.io" and go to Home page
# Search Button Feature:
When I click the search button
And I enter "PowerShell" in the input field
And I click the first result of search
Then I go to the article page with title containing "PowerShell"

  你可以给它命名为诸如 simple_test.feauture 这样的文件。相信即便你不是开发人员,只要你懂英文,你就明白这段话的意思。除去base_flow的tag,以及上面的四行描述,下面用和自然语言很相似的语言描述了具体的行为。注意,其中的Feature, Scenario, Given, When, And, Then都是Cucumber的feature文件关键字。

编写具体实现和测试

  但是写好了feature文件,它却并不能执行,所以我们还得依赖java代码来具体执行上述feature文件中的那些步骤。所以需要编写一个名为BaseSteps的类,用于表示上述行为的实现:

package com.wenjie;

import cucumber.api.java8.En;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver; import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.openqa.selenium.support.PageFactory.initElements; public class BaseSteps implements En {
private WebDriver driver = new FirefoxDriver();
private BlogPage blogPage = new BlogPage(); public BaseSteps() {
blogPage = initElements(driver, BlogPage.class); Given("^I enter my blog address \"([^\"]*)\" and go to Home page$",
(String url) -> { driver.get(url);}
); When("^I click the search button$", () -> {
blogPage.clickSearchButton();
}); And("^I enter \"([^\"]*)\" in the input field$", (String keyword) -> {
blogPage.inputSearchWording(keyword);
}); And("^I click the first result of search$", () -> {
blogPage.clickFirstResultOfSearch();
}); Then("^I go to the article page with title containing \"([^\"]*)\"$",
(String keyword) -> {
assertContainsIngoreCase(blogPage.getArticleTitle(), keyword);
});
} public static void assertContainsIngoreCase(String set, String subset) {
assertThat(set.toLowerCase(), containsString(subset.toLowerCase()));
}
}

  可以看出来,我们这里采用了Java8中Lambda表达式的写法,并通过正则注入参数。

注意:java版本为1.8.0.71时,这种用法将会报这样的错误:java.lang.IllegalArgumentException: Wrong type at constant pool index;换成1.8.0.51后问题消失。

  至此,我们这个简单的Cucumber Test的实现部分就完成了,但是要执行它们,通常我们需要写一个对应的测试类,比如说BaseFlowTest这个类:

package com.wenjie;

import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;
import org.junit.runner.RunWith; @RunWith(Cucumber.class)
@CucumberOptions(
features = {"src/test/resources/features"},
tags = {"@base_flow"}
)
public class BaseFlowTest {
}

  它指定了feature文件路径和对应的feature文件的tag,也就是说执行这个测试,就会执行对应路径下tag为base_flow的feature文件内容,而这个feature文件则依赖BaseSteps这个类来具体实现它指定的步骤。
  你可以通过IDE或者使用gradle的task来执行这个测试(BaseFlowTest),你会看到和上一篇博客一样的结果。不同的是,你维护的一份更加可读的文件,这对于存在大量 可复用 操作的测试来说十分便利、有益。

总结

  本文只是入门级别的Cucumber编写指导,很多用法并没有过多涉及。具体代码可以参考:

从头写一个Cucumber测试(二) Cucumber Test的更多相关文章

  1. 从头写一个Cucumber测试(一) Selenium Test

    转载:https://yaowenjie.github.io/%E7%BC%96%E7%A8%8B%E7%9B%B8%E5%85%B3/cucumber-test, 背景(废话不读系列)   前段时间 ...

  2. 经典笔试题:用C写一个函数测试当前机器大小端模式

    “用C语言写一个函数测试当前机器的大小端模式”是一个经典的笔试题,如下使用两种方式进行解答: 1. 用union来测试机器的大小端 #include <stdio.h> union tes ...

  3. 利用 Python 写一个颜值测试小工具

    我们知道现在有一些利用照片来测试颜值的网站或软件,其实使用 Python 就可以实现这一功能,本文我们使用 Python 来写一个颜值测试小工具. 很多人学习python,不知道从何学起.很多人学习p ...

  4. 我是如何学习写一个操作系统(二):操作系统的启动之Bootloader

    前言 今天本来的任务看书和把之前写的FragileOS整理一下,但是到现在还在摸鱼,书也只看一点.后来整理了一下写这个系列的思路,原本的目的是对操作系统原理性的学习和对之前写的一个玩具型操作系统的回顾 ...

  5. 【原创】纯OO:从设计到编码写一个FlappyBird (二)

    第一部分请点这里. 续结前文,本文将实现Game类. 首先是实例变量.由上次的类图可以看出,Game类首先得具有如下实例变量: 0.Judge judge;1.SimpleDraw draw; // ...

  6. 手把手用Monkey写一个压测脚本

    版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有. 允许有条件转载,转载请附带底部二维码. 一.为什么需要一个测试脚本? 昨天讲解了Android Monkey命 ...

  7. 跟我一起用Symfony写一个博客网站;

    我的微信公众号感兴趣的话可以扫一下, 或者加微信号   whenDreams 第一部分:基础设置,跑起一个页面-首页 第一步: composer create-project symfony/fram ...

  8. 行为驱动:Cucumber + Selenium + Java(五) - 使用maven来实现cucumber测试和报告

    在上一篇中,我们介绍了Selenium + Cucumber + Java框架下的测试用例参数化/数据驱动,这一篇我们来使用maven去搭建cucumber框架以及实现测试报告. 5.1 为什么要用m ...

  9. 用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1

    package com.ljn.base; /** * @author lijinnan * @date:2013-9-12 上午9:55:32 */ public class IncDecThrea ...

随机推荐

  1. Java-一个数组中的元素复制到另一个数组

    public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length).其中五个参数分别表示为: ...

  2. IOS开发之----全局变量extern的使用

    extern,作用在IOS中,为了使用全局变量.比写在appDelegate和定义单例方便一些: 举例: 1.MyExternClass.h添加这个类,并在.m文件添加 代码 #import &quo ...

  3. python练手系列-分布式监控

    如果我们要写一个监控系统,要注意哪些问题和需求? [1] agent收集数据的时候需要通过系统调用少的方法收集到我们需要数据,一般来说我们优先使用python自带的系统方法,然后是读取/proc 文件 ...

  4. Shape,expand_dims,slice基本用法

    import tensorflow as tf t = tf.constant([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]], [[5, 5, 5], ...

  5. Leetcode 452.用最少数量的箭引爆气球

    用最少数量的箭引爆气球 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够了.开始坐 ...

  6. API生命周期第三阶段:API实施:使用swagger codegen生成可部署工程,择取一个作为mock service

    在分享培训了swagger对于API的设计之后,有一些人问我说:你看,现在咱们前端使用web_API做为mock data在进行测试,后端也有mock 测试.然后我们再进行联调,这之中肯定会出现一些偏 ...

  7. 视频播放插件Video.js

    这是一个很强大的视频播放插件.

  8. 一句话学Java——Java重载和重写

    概念:重载是指两个不同的函数有相同的名称,可以是在本类之中的函数之间的重载,也可以是子类和父类的函数之间的函数重载. 重写:只能是子类重写父类的函数.这是多态的基础. 重写的规则:     参数:重写 ...

  9. python多进程(multiprocessing)

    最近有个小课题,需要用到双进程,翻了些资料,还算圆满完成任务.记录一下~ 1.简单地双进程启动 同时的调用print1()和print2()两个打印函数,代码如下: #/usr/bin/python ...

  10. ambari单节点集群塔建

    配置2台机器,发别为ambari01.ambari03.ambari01上部署Ambari-server和Mirror server,另一台机器上部署agent. 一.配置静态IP 运行命令,让配置生 ...