行为驱动: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,那完全就是看不懂试卷到底要考什么.由于 ...
随机推荐
- 光流法-opencv python
import cv2 import numpy as np cap = cv2.VideoCapture("D:/Workspace/week2/test/test_256_12.mp4&q ...
- hadoop ha zkfc 异常自动切换机制和hdfs 没有空间问题解决
在我搭建hadoop ha 后,我启动了各个功能,但是发现hadoop hdfs 没法使用,在web 页面也显示hdfs 可用空间为零,并且自动备份机制无法使用,本人也不理解,然后就是指定hdfs t ...
- APM(pixhawk)飞控疑难杂症解决方法汇总(持续更新)
本文转自下面博主 https://blog.csdn.net/junzixing/article/details/79310159 APM/Pixhawk常用链接汇总(持续更新) https://bl ...
- linux视频录制,推流处理
1.linux视频合成(视频后缀要一致) ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -lavfi hstack=inputs=3 4.mp4 (input=3表示希望合并的视 ...
- JS中[object object]怎么取值
错误信息:本来是要显示JSON对象的 结果控制台打印了[object object] 需要做一个简单的转换,如下: var jsonData = JSON.stringify(data);// 转成 ...
- ASP.NET C# 实现实时用户在线
public static class UserOnline { /// <summary> /// 获取或设置在线列表 /// </summary> public stati ...
- pycahrm 安装Vue项目
首先在pycharm > preference > plugins > vue > 点绿色install 创建一个文件夹 然后cmd里cd到这个文件夹 npm install ...
- 关于Django字段类型中 blank和null的区别
blank 设置为True时,字段可以为空.设置为False时,字段是必须填写的.字符型字段CharField和TextField是用空字符串来存储空值的. 如果为True,字段允许为空,默认不允许. ...
- ssh 报error: kex protocol error: type 30 seq 1
由于近期服务器升级了openssl,在使用navicat连接数据库报 查看日志 sshd[1990]: error: kex protocol error: type 30 seq 1 [preaut ...
- 轮播效果/cursor
cursor属性:改变鼠标中的属性 例如: cursor:pointer(鼠标移动上去变小手) <!doctype html> <html> <head> < ...