行为驱动:Cucumber + Selenium + Java(二) - 第一个测试
在上一篇中,我们搭建好了Selenium + Cucumber + Java的自动化测试环境,这一篇我们就赶紧开始编写我们的第一个BDD测试用例。
2.1 创建features
我们在新建的java项目中,新建一个文件夹名为features,然后右键点击该文件夹,新建一个名为test.feature的新文件。
文件建好后,你会看到他呈现出与普通文本文件不同的样式,并且自带很多内容:

这些内容实际是cucumber给我们提供的feature模板,我们按照这个模板写出第一个测试用例。
我们用自然语言,结合Given,When,And,Then这些关键字来编写测试用例:
Feature: Test baidu search for selenium
Search for selenium on baidu @tag
Scenario: Test Baidu search for selenium
Given I navigate to baidu
When I send keyword into searchbox
And I click search button
Then The correct search result is returned
可以看到,这个用例就是用自然表述性语言撰写的,具有很高的可读性,不需要懂代码也都能看明白这个用例测试的内容:就是去到百度,然后搜索关键字,判断搜索是否成功。
2.2 创建runner
这个用例既然是自然语言撰写的,也就还暂时不能实现自动化执行,我们接下来还要编写这个用例对应的实际selenium java代码的实现过程,其实就是用java对我们的用例进行“翻译”,好让selenium能读懂,并进行测试的执行。
首先,在src目录下新建package名为runner,然后新建一个java class名为cucumberRunner,这个类里面我们写入如下代码:
package Runner; import org.junit.runner.RunWith; import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber; @RunWith(Cucumber.class)
@CucumberOptions(features=("features"),glue=("stepDefinition"))
public class CucumberRunner {
}
这个类主要起的作用实际上就是我们cucumber的执行入口,同时他定义了cucumber用例执行时的一些特性,比如CucumberOptions标签里,features指定用例文件的目录,glue则指定对应java翻译代码的位置。写好这个类以后,我们可以马上右键对他点击,运行Run As -> JUnit Test。运行之后,系统输出了一些日志:

从日志里面我们可以看到,系统提示:我们定义了4个测试步骤,但都没有实现,下面我们马上来实现这些步骤。
2.3 实现步骤定义
在src目录下新建stepDefinitions包,然后在包下新建一个java class名为TestBaidu,这个类里面我们就实现之前的feature里面定义的测试步骤。
我们输入如下代码:
package stepDefinitions; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert; import cucumber.api.PendingException;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When; public class TestBaidu {
WebDriver driver; @Given("^I navigate to baidu$")
public void i_navigate_to_baidu() throws Throwable {
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.manage().window().maximize(); driver.get("http://www.baidu.com");
} @When("^I send keyword into searchbox$")
public void i_send_keyword_into_searchbox() throws Throwable {
WebElement searchBox; searchBox = driver.findElement(By.id("kw"));
searchBox.sendKeys("selenium");
} @When("^I click search button$")
public void i_click_search_button() throws Throwable {
WebElement searchButton;
searchButton = driver.findElement(By.id("su"));
searchButton.click();
} @Then("^The correct search result is returned$")
public void the_correct_search_result_is_returned() throws Throwable {
WebElement searchResult;
searchResult = driver.findElement(By.xpath(".//*[@id='container']/div[2]/div/div[2]/span"));
Assert.assertTrue(searchResult.isDisplayed()); Thread.sleep(2000);
driver.quit();
}
}
写好以后,再次运行runner类,可以看到测试执行成功了:)

下一篇我们来使用tags对cucumber测试用例进行分组。
行为驱动:Cucumber + Selenium + Java(二) - 第一个测试的更多相关文章
- 行为驱动:Cucumber + Selenium + Java(二) - extentreports 测试报告+jenkins持续集成
1.extentreports 测试报告 pom文件 <dependency> <groupId>com.vimalselvam</groupId> <art ...
- 行为驱动:Cucumber + Selenium + Java(一) - 环境搭建
1.1 什么是行为驱动测试 说起行为驱动,相信很多人听说过. 行为驱动开发-BDD(Behavior Driven Development)是一个诞生于2003年的软件开发理念.其关键思想在于通过与利 ...
- 行为驱动:Cucumber + Selenium + Java(五) - 使用maven来实现cucumber测试和报告
在上一篇中,我们介绍了Selenium + Cucumber + Java框架下的测试用例参数化/数据驱动,这一篇我们来使用maven去搭建cucumber框架以及实现测试报告. 5.1 为什么要用m ...
- 行为驱动:Cucumber + Selenium + Java(四) - 实现测试用例的参数化
在上一篇中,我们介绍了Selenium + Cucumber + Java框架下的使用Tags对测试用例分组的实现方法,这一篇我们用数据表格来实现测试用例参数化. 4.1 什么是用例参数化 实际测试中 ...
- 行为驱动:Cucumber + Selenium + Java(一) - Cucumber简单操作实例
场景(Scenarios) 场景是Cucumber结构的核心之一.每个场景都以关键字“Scenario:”(或本地化一)开头,后面是可选的场景标题.每个Feature可以有一个或多个场景,每个场景由一 ...
- 接口自动化:HttpClient + TestNG + Java(二) - 第一个接口测试:get请求
在上一篇中,我们搭建好了HttpClient + TestNG + Java的自动化接口测试环境,这一篇我们就赶紧开始编写我们的第一个接口测试用例. 本篇会对问题解决的思路进行更详尽的阐述. 2.1 ...
- 行为驱动:Cucumber + Selenium + Java(三) - 使用标签实现测试分组
在上一篇中,我们写出了Selenium + Cucumber + Java环境下的第一个BDD自动化测试用例,这一篇我们说说怎么用标签对用例进行分组. 3.1 Cucumber标签 实际工作中,我们的 ...
- selenium+java二元素定位
页面元素定位是自动化中最重要的事情, selenium Webdriver 提供了很多种元素定位的方法. 测试人员应该熟练掌握各种定位方法. 使用最简单,最稳定的定位方法. 自动化测试步骤 定位元素 ...
- java开学第一周测试自我感想
开学第一周,王建民老师就对我们进行了java测试,对我们说测试题目是基于期末考试的基础难度来出的.我们的考试完全是靠暑假在家自学的基础,如果在家没有自学java,那完全就是看不懂试卷到底要考什么.由于 ...
随机推荐
- 使用HttpClient发送文件流到服务器端
适用场景:网络绝对路径的URL文件或图片,不存储到本地,转换成stream,直接使用HTTPClient传送到SpringBoot的服务端,将文件存储下来,并返回一个文件地址.目前分层架构的系统越来越 ...
- oracle行转列、列转行、连续日期数字实现方式及mybatis下实现方式
转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9977591.html 九月份复习,十月份考试,十月底一直没法收心,赶在十一初 由于不可抗拒的原因又不得不重新找 ...
- Git 实用指南
传送门: https://mp.weixin.qq.com/s?__biz=MzI3MzgxNDY2MQ==&mid=2247484159&idx=1&sn=2d28513ef ...
- ubuntu 18.04 安装mysql 8.0
1.下载配置(不然直接装的是mysql5.7): wget https://repo.mysql.com//mysql-apt-config_0.8.10-1_all.deb 2.更新配置: sudo ...
- wpf 的各个template
--转载 在使用TabControl.ListView.Menu.TreeView的时候被各种Template搞得头昏眼花,决心把这个问题搞清楚,究竟什么时候该用什么Template?这是个麻烦的问题 ...
- Python(day1)
一.Python的属于解释型语言. 编译型:一次性,将全部的程序编译成二进制文件,然后再运行. 优点:运行速度快. 缺点:开发效率低,不能跨平台. 解释型:当你的程序运行时,一行一行的解释,并运行. ...
- MVC5 Razor视图中不规范书写导致的编译问题
今天碰到一个非常让人难以理解的问题,如图所示,但是我在代码中并没有找到缺失"}"的地方: 根据源文件提示有去 AppData\Local\Temp\Temporary ASP.NE ...
- LeetCode 31 Next Permutation / 60 Permutation Sequence [Permutation]
LeetCode 31 Next Permutation / 60 Permutation Sequence [Permutation] <c++> LeetCode 31 Next Pe ...
- Charles抓包软件简介
Charles简介: Charles是一款抓包神器,因为他是基于 java 开发的,所以跨平台,Mac.Linux.Window下都是可以使用的,确保安装之前已经安装了JDK.Charles官网地址: ...
- xpath使用方法
一.选取节点常用的路劲表达式: 表达式 描述 实例 nodename 选取nodename节点的所有子节点 xpath(‘//div’) 选取了div节点的所有子节点 / 从根节点选取 xpath ...