在上一篇中,我们介绍了Selenium + Cucumber + Java框架下的使用Tags对测试用例分组的实现方法,这一篇我们用数据表格来实现测试用例参数化。

4.1 什么是用例参数化

  实际测试中,我们可能经常会去测试几个类似的场景,或者一些大同小异的测试点。

  比如说,测试用户登录的过程中,为了满足测试的完整性,我们会要通过等价类划分等基本方法,去测试登录系统对于有效类--正确的用户名密码;和无效类--错误的用户名密码等场景。

  这一些场景的前序步骤都很类似,如果我们对于每一个这样的用例都从头到尾按照我们之前的例子那样,从gherkin的用例编写,到java代码的解释这么写下来,代码量会很多而且没有必要。

  所以我们就要想,对于这样的测试,我们能不能将他们集合在一起,用参数化或者数据驱动的方式去实现?

4.2 Cucumber的数据驱动

  我们直接去我们的代码里新建一个test.feature特性文件,如果eclipse的cucumber插件正确安装的话,那么不但这个文件会有独特的外观,你还会发现文件中自带了对于gherkin用例的一个模板:

  

#Author: your.email@your.domain.com
#Keywords Summary :
#Feature: List of scenarios.
#Scenario: Business rule through list of steps with arguments.
#Given: Some precondition step
#When: Some key actions
#Then: To observe outcomes or validation
#And,But: To enumerate more Given,When,Then steps
#Scenario Outline: List of steps for data-driven as an Examples and <placeholder>
#Examples: Container for s table
#Background: List of steps run before each of the scenarios
#""" (Doc Strings)
#| (Data Tables)
#@ (Tags/Labels):To group Scenarios
#<> (placeholder)
#""
## (Comments)
#Sample Feature Definition Template
@tag
Feature: Title of your feature
I want to use this template for my feature file @tag1
Scenario: Title of your scenario
Given I want to write a step with precondition
And some other precondition
When I complete action
And some other action
And yet another action
Then I validate the outcomes
And check more outcomes @tag2
Scenario Outline: Title of your scenario outline
Given I want to write a step with <name>
When I check for the <value> in step
Then I verify the <status> in step Examples:
| name | value | status |
| name1 | 5 | success |
| name2 | 7 | Fail |

  我们可以看到,@tag2这个标签标记的测试用例用了一种我们之前没有用过的格式来组织用例,并且下面还有一个Examples表格。这就是cucumber自带的数据驱动表格。

  下面我们就用这种形式来实现数据驱动和参数化。

4.3 编写参数化的feature特性文件

  我们来实现之前提到的登录测试。

  先在features文件夹底下新建一个名为testLogin.feature的特性文件。文件中写入如下gherkin代码:

@tag
Feature: Test login feature of lemfix
I want to use this case to test login functionality @tag1
Scenario Outline: Test login feature of lemfix
Given I navigated to lemfix site
When I input “<username>” and “<password>” to login
Then I verify login “<result>” Examples:
| username | password | result |
| vincent20181030 | password1 | success |
| vincent20000000 | password1 | fail |

  这里我们在一个用例里,用数据表格的方式,分别想去测试用户登录成功/失败的案例。数据表格的第一行是存在的用户名和密码,预计登录成功;而第二行的用户是不存在,预计登录失败。

4.4 将feature进行步骤定义

  在stepDefinitions文件夹下新建TestLogin.java,写入如下代码:

package stepDefinitions;

import static org.testng.Assert.assertTrue;

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 TestLemfix {
WebDriver driver; @Given("^I navigated to lemfix site$")
public void i_navigated_to_lemfix_site() throws Throwable {
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.manage().window().maximize(); driver.get("http://fm.lemfix.com");
} @When("^I input \"([^\"]*)\" and \"([^\"]*)\" to login$")
public void i_input_vincent_and_password_to_login(String us_name, String us_psswd) throws Throwable {
WebElement loginTop;
WebElement username;
WebElement password;
WebElement loginBTN; loginTop = driver.findElement(By.xpath("html/body/div[1]/div/div[3]/ul/li[2]/a"));
loginTop.click(); username = driver.findElement(By.id("user_login"));
password = driver.findElement(By.id("user_password"));
loginBTN = driver.findElement(By.xpath(".//*[@id='new_user']/div[4]/input")); username.sendKeys(us_name);
password.sendKeys(us_psswd);
loginBTN.click(); Thread.sleep(1000);
} @Then("^I verify login \"([^\"]*)\"")
public void i_verify_login_result(String rs) throws Throwable {
String title = driver.getTitle();
String result;
if(title.contains("登录")){
result = "fail";
}else if(title.equals("Lemfix")){
result = "success";
}else{
result = null;
}
System.out.println(title);
System.out.println("result=" + result);
Assert.assertTrue(result.equals(rs)); Thread.sleep(1000);
driver.quit();
}
}

  注意在java代码中,解释方法也同样对应的引入参数,如:

  运行runner类,测试通过,到此为止我们就实现了用参数化/数据驱动的形式来实现cucumber测试。

  下一篇我们改用maven对cucumber环境进行配置并实现测试报告输出。

行为驱动:Cucumber + Selenium + Java(四) - 实现测试用例的参数化的更多相关文章

  1. 行为驱动:Cucumber + Selenium + Java(一) - 环境搭建

    1.1 什么是行为驱动测试 说起行为驱动,相信很多人听说过. 行为驱动开发-BDD(Behavior Driven Development)是一个诞生于2003年的软件开发理念.其关键思想在于通过与利 ...

  2. 行为驱动:Cucumber + Selenium + Java(二) - 第一个测试

    在上一篇中,我们搭建好了Selenium + Cucumber + Java的自动化测试环境,这一篇我们就赶紧开始编写我们的第一个BDD测试用例. 2.1 创建features 我们在新建的java项 ...

  3. 行为驱动:Cucumber + Selenium + Java(一) - Cucumber简单操作实例

    场景(Scenarios) 场景是Cucumber结构的核心之一.每个场景都以关键字“Scenario:”(或本地化一)开头,后面是可选的场景标题.每个Feature可以有一个或多个场景,每个场景由一 ...

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

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

  5. 行为驱动:Cucumber + Selenium + Java(三) - 使用标签实现测试分组

    在上一篇中,我们写出了Selenium + Cucumber + Java环境下的第一个BDD自动化测试用例,这一篇我们说说怎么用标签对用例进行分组. 3.1 Cucumber标签 实际工作中,我们的 ...

  6. 行为驱动:Cucumber + Selenium + Java(二) - extentreports 测试报告+jenkins持续集成

    1.extentreports 测试报告 pom文件 <dependency> <groupId>com.vimalselvam</groupId> <art ...

  7. Selenium+Java(四)Selenium Xpath元素定位

    前言 关于Selenium元素定位,这是最后一篇博客. Xpath定位可以实现的功能 Selenium+Java(三)Selenium元素定位中讲的定位方式也可以实现,具体要用那种定位方式要根据自己的 ...

  8. Selenium Java环境配置

    Selenium Java环境配置 上次配置的是C#的环境,今天主要来配置一下Java环境. 首先,对于java环境配置最基础的JDK和JRE 先前我做过配置,这里就不重述了,网上的教程超级多.在基础 ...

  9. 利用Selenium+java实现淘宝自动结算购物车商品(附源代码)

    转载请声明原文地址! 本次的主题是利用selenium+java实现结算购买购物车中的商品. 话不多说,本次首先要注意的是谷歌浏览器的版本,浏览器使用的驱动版本,selenium的jar包版本.   ...

随机推荐

  1. 一道令人抓狂的零一背包变式 -- UVA 12563 Jin Ge Jin Qu hao

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

  2. CF498C. Array and Operations [二分图]

    CF498C. Array and Operations 题意: 给定一个长为 n 的数组,以及 m 对下标 (a, b) 且满足 a + b 为奇数,每次操作可以将同一组的两个数同时除以一个公约数 ...

  3. JUC

    1.Java JUC简介 在Java5.0提供了java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池.异 ...

  4. pip离线安装依赖包

    pip安装离线本地包 导出本地已有的依赖包 pip freeze > requirements.txt 将依赖包下载到本地 # 下载到当前目录,指定pip源 pip download -r re ...

  5. 如何设置body高度为浏览器高度

    html{height:100%} body{min-height:100%} 有时我们的页面上内容不多,但设计师要求背景色必须铺满全屏,这时候只需在样式表中加上这行,body就以浏览器的高度显示,超 ...

  6. nginx + springboot 配置

    1.spring boot 访问地址http://localhost:13000/test/hello 2.配置nginx.conf文件 upstream my_ngix { server local ...

  7. Android Gradle Task-中文

    任务可以从根项目运行 Android 任务 androidDependencies-显示项目的Android依赖项 signingReport-显示基础和测试模块的签名信息 sourceSets-打印 ...

  8. 3.ifconfig

    Windows下查看IP地址用ipconfig Linux 下查看IP地址用ifconfig 还有 ip addr      而ipconfig 和ip addr的区别则是与net-tools工具和i ...

  9. 一个帮助理解python星号的例子

  10. JAVA 热文

    Java技术面试篇 Javase基础面试题(1) Javase基础面试题(2) Javase基础面试题(3) Javase基础面试题(4) Javase基础面试题(5) Javaweb面试题(6) J ...