转载: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 buttonAnd I enter "PowerShell" in the input fieldAnd I click the first result of searchThen 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编写指导,很多用法并没有过多涉及。具体代码可以参考:

  • 本文代码:https://github.com/Yaowenjie/Cucumber-Demo
  • 博客实际测试: https://github.com/Yaowenjie/yaowenjie.github.io/tree/master/cucumber-test

从头写一个Cucumber测试(二) Cucumber Test相关推荐

  1. 从头写一个超过zip的压缩算法(8):学习tek压缩

    tek压缩是个啥?也许很多人连听都没听过.这其实是<30天制作操作系统>中作者埋下的坑.制作系统第29天第二章节(源代码号:harib26b):"文件压缩"中,作者和我 ...

  2. python测试开发自学教程-Web开发哪家强?看我用 Python 写一个颜值测试小工具

    我们知道现在有一些利用照片来测试颜值的网站或软件,其实使用 Python 就可以实现这一功能,本文我们使用 Python 来写一个颜值测试小工具. 简介 要实现颜值测试功能,大致有两种方式:一种是自己 ...

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

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

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

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

  5. 用c++写一个cps测试

    用c++写一个cps测试 代码 #include<iostream> #include<windows.h> #include<cmath> #define key ...

  6. 用JavaScript写一个正则表达式测试工具

    用JavaScript写一个正则表达式测试工具 <!DOCTYPE html> <html><head><meta charset="utf-8&q ...

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

    我们知道现在有一些利用照片来测试颜值的网站或软件,其实使用 Python 就可以实现这一功能,本文我们使用 Python 来写一个颜值测试小工具. 简介 要实现颜值测试功能,大致有两种方式:一种是自己 ...

  8. 从头写一个超过zip的压缩算法(1)最简单的压缩算法

    (本人还在读初中,所以文笔有限,请大家包涵) 随书源代码:<从头写一个超过zip的压缩算法>配套代码-C++文档类资源-CSDN下载 说到字典压缩算法,按照字面理解就是建立一个字典,这个字 ...

  9. python小测试8_用 Python 写一个颜值测试小工具

    我们知道现在有一些利用照片来测试颜值的网站或软件,其实使用 Python 就可以实现这一功能,本文我们使用 Python 来写一个颜值测试小工具. 简介 要实现颜值测试功能,大致有两种方式:一种是自己 ...

最新文章

  1. 【MATLAB】数据分析之函数数值积分
  2. Network | UDP checksum
  3. HashMap.values().addAll()异常
  4. SmartNIC/DPU — Overview
  5. 高德地图SDK大致使用
  6. windows下cacti的快速安装
  7. 总结一下php5.2.16与apache2.0的C++扩展开发整个过程
  8. Linux——自定义服务命令
  9. The Linux Storage Stack Diagram
  10. nodejs中全栈开发框架meteor的文档
  11. assert.notDeepEqual()
  12. 余晨:我终于采访到了马斯克,他是个腼腆的钢铁侠
  13. 继承 actionSupport
  14. pandas进阶 期中练习
  15. linux版qq怎么传文件,QQ for linux终于能在线传送文件了~
  16. 编写第一个JavaFX界面
  17. MP4 | MP4文件格式的解析
  18. 伯克利的电气工程和计算机科学专业,加州大学伯克利分校
  19. 2020年华东师范大学软件工程考研总结
  20. 最全面的UI自动化面试题全在这里了!你还在考虑什么?

热门文章

  1. python安装成功的图标_安装Python
  2. 像个字段相减绝对值_张歆艺做家务受伤,袁弘俩字逗乐媳妇,真是幼稚得像个大龄儿童...
  3. sequelize怎么看插入的数据成功不成功_MySQL的4种事务隔离级别你还不清楚吗?
  4. oracle 12 if,Oracle 12.1 RAC 系列 – 配置第二个网络和相应的SCAN2
  5. 计算机窗口移动方法有,北京版一年级信息技术上册《操作窗口学本领》教案
  6. java 调用casperjs_Java程序去调用并执行shell脚本及问题总结(推荐)
  7. mysql二进制日志文件结构_MySQL 二进制日志的结构
  8. OpenCV学习笔记02:OpenCV基本图片处理
  9. 【codevs1040】【01NOIPTG】统计单词个数,字符串的划分DP
  10. java中nio流_Java输入输出流IO介绍(与NIO比较)