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

背景(废话不读系列)

  前段时间闲来无事,试着给自己的博客从头写了一些简单的Cucumber Test。现隔了数周,还是决定把整个过程整理成一份博客文章,一是分享给大家、参考指正,二是便于自己后期回阅。

技术栈选型

  为了便于Coding,也顺便用起来一起基本常用的工具/技术,所以这篇文章会基于以下技术栈来展开:

  • 语言: Java8
  • 框架: SpringBoot
  • 构建工具: Gradle
  • WebDriver: Selenium
  • BDD框架: Cucumber
  • 单元测试框架: Junit

搭建基本工程

  在开始之前,首先确保你的机器上安装了Java8
  Spring Boot作为Spring新一代的框架,提升了Spring开发者的开发体验,这里原则上并不一定需要使用Spring Boot。Gradle作为一个自动化构建工具,也极大的改善的开发者构建工程时的体验。
  可以使用Spring的初始化工具自动生成基本的项目文件,首先进入start.spring.io,把Maven Project改为Gradle Project,Group和Artifact名字可以更改成你自定义的名字,如下图:

  由于这个初始化工具并没有提供什么Cucumber相关的依赖,所以我们并不需要在Dependencies中添加任何东西。然后点击“Generate Project”,它就会自动生成基于SpringBoot和Gradle的初始项目,并打包成zip自动通过浏览器下载到本地。
  然后解压该zip包,在命令行(工作路径为解压后的工程根目录)中输入:

./gradlew clean build

  当然,如果你本地安装了Gradle,你也可以使用:

gradle clean build

  然后gradle就会帮你在本地机器上安装好一些基本的依赖(包括Junit),构建好了接下来需要的基本工具。你可以使用诸如Intellij这样的IDE打开这个工程,并根据使用的IDE来更改 build.gralde 文件中的部分plugin。

Selenium Test

  在写Cucumber Test之前,我们先了解一下如何写Selenium Test。
  Selenium是一个WebDriver框架,支持驱动各个平台的各种常用浏览器,最早由ThoughtWorks开发。通俗点说,它可以实现对浏览器上中的各个元素的操作动作(包括点击,填写等)的自动化,所以它可以被用于各大BDD框架/自动化测试工具中,其中就包括CucumberJbehaveSauceLabs等。
  所以我们先使用Selenium写一个简单的行为级别的测试,然后再使用Cucumber将它们转化更加服务BDD思想的测试。这里,就以我的博客 https://yaowenjie.github.io 为例,将接下来的几个行为自动化了:

  1. 进入https://yaowenjie.github.io这个网页
  2. 点击右边的搜索按钮
  3. 在输入框中输入要搜索的关键字“PowerShell”
  4. 点击搜索出来的第一个结果,进入该篇文章页面

  在写代码之前,你需要在 build.gradle 中的dependencies中添加selenium这个依赖:

compile('org.seleniumhq.selenium:selenium-java:2.53.0')

  接下来需要重新执行一遍之前的build指令(./gradlew clean build),然后你需要在YourProject/src/main/java/com/wenjie下创建一个新的类(名为BlogPage),用于表示页面下的对应元素以及对其的操作,代码如下:

package com.wenjie;

import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy; public class BlogPage {
@FindBy(xpath = "//*[@id=\"masthead\"]/button")
private WebElement searchButton; @FindBy(xpath = "/html/body/div[1]/div/input")
private WebElement searchInput; @FindBy(xpath = "/html/body/div[1]/div/ul/li[1]/article/a")
private WebElement searchResultFirst; public void clickSearchButton() {
searchButton.click();
} public void inputSearchWording(String wantedStr){
searchInput.sendKeys(wantedStr);
} public void clickFirstResultOfSearch() {
searchResultFirst.click();
}
}

  可以看到在BlogPage中定义了三个 WebElement,它们分别是搜索按钮,搜索输入框,以及搜索结果中的第一个(它们都是通过xpath或者id的形式定义),并且通过三个方法将对这三个元素的点击和输入操作暴露出去。接下来就可以新建一个新的测试类(也可以基于原有的测试类),并编写一个对应的测试,如下:

package com.wenjie;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import static org.openqa.selenium.support.PageFactory.initElements; @RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = CucumberApplication.class)
public class CucumberApplicationTests {
FirefoxDriver driver = new FirefoxDriver();
BlogPage blogPage = initElements(driver, BlogPage.class);
String blogUrl = "https://yaowenjie.github.io"; @Test
public void search_function_should_work_well() {
driver.get(blogUrl); blogPage.clickSearchButton();
blogPage.inputSearchWording("PowerShell");
blogPage.clickFirstResultOfSearch();
} }

从上面的代码很容易看出来这个测试干了什么:

  • 打开https://yaowenjie.github.io - driver.get(blogUrl);
  • 点击搜索按钮 - blogPage.clickSearchButton();
  • 输入关键字 - blogPage.inputSearchWording(“PowerShell”);
  • 点击搜索的第一个结果 - blogPage.clickFirstResultOfSearch();

最后,执行这个测试:

./gradlew test

  你将看到这个测试会调用firefox浏览器(要换成Chrome或者其他浏览器怎么办?),并自动地执行了刚刚的那些操作,是不是很炫酷?至此,这个简单的Selenium Test就完成了,你也可以模仿这样的写法,去自动化的操作其他的网页。

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

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

    转载:https://yaowenjie.github.io/%E7%BC%96%E7%A8%8B%E7%9B%B8%E5%85%B3/cucumber-test-part-2 承接上文   前一篇博 ...

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

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

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

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

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

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

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

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

  6. Summer——从头开始写一个简易的Spring框架

    Summer--从头开始写一个简易的Spring框架                ​ 参考Spring框架实现一个简易类似的Java框架.计划陆续实现IOC.AOP.以及数据访问模块和事务控制模块. ...

  7. Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

    #29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类T ...

  8. Python之小测试:用正则表达式写一个小爬虫用于保存贴吧里的所有图片

    很简单的两步: 1.获取网页源代码 2.利用正则表达式提取出图片地址 3.下载 #!/usr/bin/python #coding=utf8 import re # 正则表达式 import urll ...

  9. 用javaweb写一个注册界面,并将数据保存到后台数据库(全部完成)(课堂测试)

    一.题目:WEB界面链接数据库 1.考试要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母. ...

随机推荐

  1. 常用软件URL

    1.MSDN:https://msdn.itellyou.cn/ 2.软碟通(UltraISO)http://rj.baidu.com/soft/detail/11522.html?ald Ultra ...

  2. LR采用的Sigmoid函数与最大熵(ME) 的关系

    LR采用的Sigmoid函数与最大熵(ME) 的关系 从ME到LR 先直接给出最大熵模型的一般形式,后面再给出具体的推导过程. \[\begin{align*} P_w(y|x) &= \df ...

  3. Conda相关命令的使用

    -- Conda basics Conda基础命令 conda info 查看已安装的环境 conda install PACKAGENNAME 安装包 conda update PACKAGENAM ...

  4. 九度oj 题目1368:二叉树中和为某一值的路径

    题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 输入: 每个测试案例包括n+1行: 第一行为2 ...

  5. 刷题总结——array(ssoj)

    题目: 题目描述 给定 2 个正整数序列 A1, A2,序列长度分别为 L1, L2.你可以进行以下的一次操作:1. 选择两个数 K1,K2(1≤K1≤L1, 1≤K2≤L2):2. 移去 A1 中最 ...

  6. d3 使用随机数据生成条形图

    ).map(function(){ ,)(),); }) // 返回 [27.2, 12.9, 12.2, 6.8, 9.4, 7.1, 17.5, 30, 16.6, 24.3, 19, 16.6, ...

  7. 解决c#所有单线程单元(STA)线程都应使用泵式等待基元(如 CoWaitForMultipleHandles),并在运行时间很长的操作过程中定期发送消息。 转载

    最近做一个后来程序,启动了事务后有一段操作业务,当运行一段时间后,出现这个异常 CLR 无法从 COM 上下文 0x1b1c38 转换为 COM 上下文 0x1b1da8,这种状态已持续 60 秒.拥 ...

  8. Pushlets的初始化陷阱

    Pushlets是在类名为Pushlet的servlet的init方法中进行初始化的.一般我们会在web.xml配置pushlet的时候,指定其servlet在Web应用启动时就进行初始化,即便这样, ...

  9. git超详细教程【转】

    转自:http://blog.csdn.net/liuwengai/article/details/52072344 GitHub操作总结 : 总结看不明白就看下面的详细讲解.   GitHub操作流 ...

  10. phpcms V9 广告模块中广告模板修改

    广告模块模板位置 \phpcms\modules\poster\install\templates\*.html 我的需求: 去掉边框控制代码,是否显示边框我将在页面模板中设置,因些需要删除模板中的以 ...