• 12
  • 12
分享
  • Cucumber测试场景应用——软件测试圈
  • 曼倩诙谐 2021-07-06 11:15:56 字数 5114 阅读 1707 收藏 12

  应用场景

  “这个测试用例的前置条件、步骤、检验点是什么?”

  “让我看下代码。”

  这可能是大多数做自动化测试的朋友遇到一种场景吧。

  用例多了、代码有时候也就 “乱” 了。 清晰明了地组织自己的测试场景,让领导、同事一看就明白的你的测试步骤与检查点,不用费神费力地解释,又简单快速地维护用例代码。

  这就是今天向大家介绍的BDD,让你的测试工作变得更高效、更简洁。

  温馨提示

  如果阅读者想按示例进行操作,您一定要具备以下的配置, 当然您也可以使用其它IDE。

  自动化框架:Cucumber+Selenium

  语言:Java

  项目:Maven

  IDE:IntelliJ IDEA

  知识重点

  Cucumber配置

  Cucumber场景描述(Gherkin语言)

  Cucumber参数传递(Example应用)

  Cucumberstep definition

  Cucumber运行

  POM设置

  首先我们建立Maven项目,然后如下图所示,添加必要的Cucumber的dependency。

2-1.png

2-2.png

  安装Cucumber Plugin

  在IDE开发的项目中,依次打开File>Settings>Plugins, 确保Cucumber for Java和Gherkin已经安装。 如下图所示:

2-3.png

  创建测试场景

  创建demoTest.feature文件,feature文件是BDD概念中的核心部份,它是应用Gherkin描述性语言来表述一个测试场景,使得测试场景易读、易懂。

  如本例中描述了测试场景对百度首页面的搜索功能进行测试。

  Scenario Outline: 表述当前测试场景的目的(由于这里用了Example,Outline就是必须的)

  Given: 可以看作是执行步骤的前置条件

  When: 是指具体的执行动作

  Then:  是描述动作执行后的结果

  And:由于前置条件,动作,执行结果都可能是一系列的,可以用And来继续表述(如示例中When语句结束后,就用了And语句)

  Example:列出了三种不同的测试用例

  1. 输入正常的查询字符

  2. 输入JavaScript脚本语言

  3. 输入空查询字符

  从这个测试场景中可以了解到,这三个测试例在前置条件,执行步骤上都是一样的,唯一不同是要验证的测试结果,前两个用例我们期待看到查询结果,并且结果列表里要有输入的查询关键字,最后一个用例是期待保持当前查询页面不变。

  这样组织测试场景是不是很有条理性。任何时候,任何人看了这个场景的表述,瞬间对测试用例一清二楚,使用的测试数据也是一目了然。

2-4.png

  开发测试脚本

  在BDD中,场景被描述在.feature文件 ,具体的测试代码被称做step definition(java 文件中)。

  顾名思义,就是在场景中描述的每个动作都会对应一段代码的运行。简单地说,这段代码也就是一个Java的方法。

  如下图,如果对应的表述没有相应的方法时(Given的表述),表述中显示的颜色参数部分是不会变蓝的,且整条表述语句的背景显示为浅灰色。

  这就是为什么要安装Gherkin plugin的原因。通过加亮代码让我们迅速地知道我们要做什么或不需要做什么。

  创建step definition

  点击对应的提示框 “黄色的警示灯”,会出现Create step definition、Create all step definitions,这里我们点击 Create step definition > ,接着出现另一个对话框: Create new file,<已有的java file name>。

  本例中,已经有一个创建好的 step definition java 文件 <DemoTestStep.java> ,我们选择 <DemoTestStep>。

  修改step definition

  首先,要修改Given 中的表述,在场景描述中 Url 是加了双引号与尖括号的,这里表示Url是一个参数,可能有些朋友已经猜到,Url的值就是在example里对应的标题Url。

  由于java语言的规则,双引号是要由转义符\开始, 尖括号在这里变成了圆括号,结尾处多加了标识符$。这一段动作的描述被放在括号与双引号里。

  添加执行动作

  这里的动作就是打开要测试Url在浏览器里。示例中用的是selenium webdriver模拟打开的浏览器 。

  当这些步骤都做好以后,在回到测试场景中 (demoTest.feature),Given的描述就被加亮,参数 “<Url>”也会变成蓝色了。

  如果您用的是IDE:Itelligence,那么试试用鼠标指向Given描述的同时点按Ctrl,整条描述是不是都加亮了,变蓝了。试着点击一下(这说明描述语句与步骤定义已经关联正确)。

  接着一个步骤一个步骤把剩下的几句描述也创建出对应的代码吧。

2-5.png

Create all step definitions

2-6.png

选择definition Java文件

2-7.png

系统自动生成的step definition方法

2-8.png

修改生成的step definition方法

2-9.png

可链接的场景步骤描述

  Selenium的设置

  为了不使大家麻烦,这里就把selenium的dependency与driver配置的脚本贴图一下以供参考。

  注:chromedriver.exe 就放在当前项目driver 的文件夹下 (完整的Maven项目路径:D:\ideaProjects\CucumberProject\driver)。

2-10.png

Pom.xml: selenium dependency

2-11.png

demoTestStep.java: selenium driver

  创建运行文件

  好啦,现在创建一个运行文件吧。

  运行文件

  示例中是RunCucumberTest.java。如图<运行文件>所示,需要用到junit.Cucumber以及其它两个Library。

  运行测试

  运行文件写好以后,现在去到项目的目录下,执行mvn test,从运行结果中可以看到执行了3个场景、12个步骤,耗费18.796s。

  3 Scenarios (3 passed)

  12 Steps (12 passed)

  0m18.796s

  查看报表

  通常在target >cucumber-reports > index.html。

  现在,我们再打开报表看看,您会遇到一个弹出的对话框<testing>。

  记得吗,我们有一个测试用了查询字符JavaScript alert,没想到cucumber的报表没有处理JavaScript,在浏览器里竟然把它当做弹出框了。

  不过,这一点不用担心,自有其它集成的报表可以使用。

2-12.png

运行文件

2-13.png

运行测试

2-14.png

运行结果

2-15.png

测试运行报表

  结语

  执行操作下来,是不是有所感悟啊?

  对了,这类型的自动化框架设计特别适用于有着不同的状态转换与身份不断变换的业务,比如ERP、CRM、 银行、订单,这类型系统的记录状态根据不同角色的操作变动着,但原始记录的数据始终保持不变,测试重点就是要确保原始数据一致性,有些字段又要根据状态的改变进行修改,或者添加。

  这样一条业务链手动测试下来时间长不说,最主要的是测试到一半,被其它重要事情耽搁了,再重新测回时,又必须重新来过,真真是耗时耗力。赶快试试这个框架组织你的业务记录测试吧。

  附:step definitions

import cucumber.api.PendingException;
import cucumber.api.java.Before;
import cucumber.api.java.en.And;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.io.File;
import static org.junit.Assert.*;
public class DemoTestStep {
    private WebDriver driver;
    @Before
    public void setup() {
        String driverPath = System.getProperty("user.dir") + File.separator + "driver" + File.separator + "chromedriver.exe";
        System.setProperty("webdriver.chrome.driver", driverPath);
        driver = new ChromeDriver();
    }
    @Given("^User is on \"(.*)\" page$")
    public void user_on_page(String url) {
        driver.get(url);
    }
    @When("^User enter \"(.*)\" in search box \"(.*)\"$")
    public void userEnterInSearchBox(String searchKeywords, String textBoxId) {
        driver.findElement(By.id(textBoxId)).sendKeys(searchKeywords);
    }
    @And("^User clicks on Search button \"(.*)\"$")
    public void userClicksOnSearchButton(String searchButtonId) {
        driver.findElement(By.id(searchButtonId)).click();
    }
    @Then("^user should see \"(.*)\"$")
    public void userShouldSee(String expectedResult) {
        WebDriverWait wait = new WebDriverWait(driver, 5);
        if (!expectedResult.contains("remain")) {
            wait.until(ExpectedConditions.titleContains("_百度搜索"));
            searchResultPageVerify(driver.getPageSource(), expectedResult);
        } else {
            wait.until(ExpectedConditions.titleIs("百度一下,你就知道"));
            searchResultPageVerify(driver.getPageSource(), driver.getTitle());
        }
        driver.close();
    }
    private void searchResultPageVerify(String pageSource, String expectedKeywords) {
        assertTrue("testing pass", pageSource.contains(expectedKeywords));
    }
}

   



作者:胡军英   

来源:51Testing软件测试网原创

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 1、添加线程组2、配置http信息头管理;使用json格式传递数据时,必须配置此项;3、添加httpcookie管理器,根据具体情况配置cookie信息,本例中未配置4、配置http请求默认值;同一个项目的接口请求放在一个线程组中,可配置请求默认值,这样无需在各接口请求中单独配置;5、配置http请求,就是具体请求的接口;本例中参数格式为json格式,使用bodydata;6、添加查看结果树,可查看接口执行情况整体的可看聚合报告Label:每个JMeter的element(例如HTTPRequest)都有一个Name属性,这里显示的就是Name属性的值#Samples:表示你这次测试中一共发出...
            13 13 1925
            分享
          •   近年来,随着信息技术的飞速发展,IT行业成为了当今社会最热门的行业之一,吸引了越来越多的人加入其中。然而,相比男性,女性在IT行业中的就业比例还是较低的。那么,女生适合转软件测试吗?本文将从IT行业的就业前景、软件测试岗位分析、零基础如何转型成功以及后期职业发展等方面探讨这个问题,为有志于转型软件测试行业的女性提供参考和建议。  一、IT行业的就业前景和发展趋势  IT行业作为一个高速发展的行业,近年来就业情况持续稳定增长。根据数据显示,2019年全国互联网及相关服务业从业人员规模为4904.4万人,同比增长12.9%。而在未来,IT行业的发展趋势将越来越好,相关职位需求将会不断增加。但是...
            0 0 707
            分享
          • 读者提问:如何做 APP 更新测试 ?阿常回答:这个问题我分别从 1、更新方式;2、测试点 这两点来回答。昨天阿常和大家分享了 APP 的安装测试,卸载功能因为是系统做的,而不是应用实现的,所以不需要做特别的测试。今天我们继续聊聊 APP 的更新测试。一、APP 的几种更新方式一)全量更新1、应用内检查版本更新。2、第三方应用商店更新。二)热更新发布补丁方式的更新,一般热更新用于紧急修复 BUG。二、APP 更新测试测试点一)强制更新1、强制更新的提示信息是否正确、完整。2、强制更新的提示弹窗能否被关掉。3、点击确定更新按钮,是否能更新成功。4、强制更新...
            0 0 2062
            分享
          •   在职场的浩渺海洋中,每一位航行者都怀揣着乘风破浪的梦想,期盼着能够稳健驾驶自己的航船,穿越迷雾,直达那象征着成就与荣誉的成功港湾。然而,现实中的职场世界绝非总是风平浪静,它更像是变化莫测的大海,隐藏着无数突如其来的暗礁与风暴,其中最为令人感到无助与憋屈的便是那不时冒出来的“背锅事件”。  比如,有一次,小张是个热衷于团队合作的年轻人,他被同事小李请求帮忙审核一份重要的销售报告。出于好心,小张加班加点,认真审查了报告的数据和逻辑,自认为已经尽到了义务。然而,报告提交上去后,却发现关键数据存在严重误差,引发了客户对公司业务专业度的质疑。结果,由于小李是项目的主导者,但他在问题暴露后立刻将所有责...
            0 0 788
            分享
          •   马斯克的社交媒体平台 X(推特)日前迎来了又一个“里程碑”—— 该平台提供的招聘信息现已收录超过 100 万个职位。  X 公司 CEO 琳达·亚卡里诺发文庆祝:万能应用现在一天比一天更近!从更多的视频(播放)选项,再到通话功能,再到 Grok(IT之家注:马斯克旗下 xAI 的聊天机器人),乃至求职招聘平台。特别提醒一下,我们现在有 100 万个职位任君挑选!  随后,马斯克也转发了这条推文,同时还转发了一张梗图:马斯克的 X 已经攻占了 Facebook、Instagram、Reddit、YouTube 等应用的“领地”,正欲“拿下”招聘平台领英 LinkedIn。  去年 11 月,...
            0 0 789
            分享
      • 51testing软件测试圈微信