测试兵器谱のCucumber-JVM框架篇

奇技指南php

测试兵器谱系列全集:
html

测试兵器谱の3分钟了解Appium(阅读原文查看)
java

测试兵器谱の移动测试篇(阅读原文查看
python

测试兵器谱の浅谈框架(阅读原文查看ios

测试兵器谱のCucumber-JVM框架篇(本文)git

本文转载自Qtest之道api

前言数组

最近业务上使用的自动化测试项目在改进项目执行方案,优化框架,正好结合实践记录一下最近遇到的问题和解决方法,打算从如下几个部分跟你们探讨一下:浏览器

  • 认识一下Cucumber-JVM框架缓存

  • 基于Anyproxy代理多端口分发

  • Appium多端口启动设备

  • Cucumber分布式执行设备调度和任务分发

  • Maven的一些配置问题

  • Pipeline集成Cucumber

关于Cucumber-JVM

项目背景

目前的自动化方案是针对咱们广告SDK项目来作的,以前关注过Qtest公众号的同窗应该看到过一篇文章介绍过《广告SDK自动化测试实践》。简单说一下当时为何这么选择这个架构体系。

  1. 咱们的自动化测试项目是针对Android SDK来作的,所以在一些API调用上优先考虑了java方向的框架,但愿能跟被测SDK集成的成本低一些

  2. 团队掌握java的同窗多一些,上手成本较低

  3. 选择Cucumber-JVM框架是想经过BDD的天然语言特性来对SDK的复杂打点字段作一些容易理解的描述,及所谓的“需求及用例”

Cucumber-JVM特色

首先介绍一下框架的特征及项目定位:

  1. Cucumber是一款支持BDD(Behaviour-Driven Development)而编写的框架,它的支撑语言称做Gherkin,可以解析后缀名为.feature和.txt的文本文件。

  2. Cucumber开发语言是ruby,可以运行ruby,java,.NET,python等多种语言的脚本。

  3. Cucumber的文本描述目前支持英、法、中文、日语等30多种语言。

  4. Cucumber 能够和主流的测试框架很好地集成,常见的 TestNG、Selenium、SpringFramework、Ruby on Rails 等,可以方便地引入到您的测试工做中去,几乎没有任何门槛。

  5. 咱们的SDK项目做为 Java 测试项目,所以使用 Cucumber 的 Java 语言实现版本:Cucumber-JVM

Cucumber-JVM关键字

如上面所说,Cucumber的核心语法是 Gherkin 提供支持的,每一个不为空的行必须以 Gherkin 自带关键字开头, 而后跟随有任意的文本。主要的关键字有:

  • Feature / 功能

  • Scenario / 场景

  • Given, When, Then, And, But (Steps/步骤)

  • Background / 背景

  • Scenario Outline / 场景大纲**

  • Examples / 示例

还有其余一些额外的关键字:

  • """ (文档描述)

  • | (表格参数分隔符)

  • @ (Tags标签)

  • # (注释)

Feature / 功能

"*.feature" 文件一般用来存放一批用例的集合,.feature文件中存放着大量的测试用例,即scenarios。feature有三个基本元素:

  • Feature: 关键字

  • name:名称, 在同一行

  • description:描述, 可选(可是强烈推荐),能够占据多行

若是你须要对当前的用例集合作一个详细的解释,能够直接这样写:

Feature: this is a feature 
 #这里是feature文件的详细描述
 I am a description, blablablablablabla.........

 Scenario: just a demo
    Given the cow weighs 450 kg
    When we calculate the feeding requirements

缘由是Cucumber-JVM 不会触发非保留关键字开头的行对应的step, 因此在feature文件开头建议有一个详细的用例集合描述,这是个好习惯。

Scenario / 场景

Scenario 其实就是具体的用例,描述一个用例的summary(标题)。它由若干步骤组成。用例能够有任意多个步骤,可是推荐数量保持在每一个场景3-5个步骤。若是太长,他们将丧失做为规范和文档的表单能力。场景遵循一样的模式:

  • 描述一个初始化上下文

  • 描述一个过程

  • 描述一个指望的产出

Given / 假设

Given 步骤用于描述用例的一些前提,包括数据准备、初始化环境等等均可以放在这里来写。固然能够有多个 Given 步骤(推荐使用 And 或者 But 来变的更可读)

When / 当

When 步骤用来描述一个事件, 或者一个动做。若是是连续的动做,推荐使用And提升可读性。一般咱们的用例都会有When步骤表示各类操做行为。

Then / 那么

Then 步骤用于描述指望的产出,或者结果。通常断言校验都在这个步骤里体现。

Background / 背景

整个feature文件中的全部用例在执行以前都会执行一次Background中描述的动做,Background中的步骤通常没有Then,用例作一些通用的初始化行为,好比“清空浏览器缓存”,“卸载以前安装的APP”等等。

Scenario Outline / 场景大纲

当有一种用例场景,存在大量重复性的步骤描述,变化的只是输入和输出的时候,很是适合用这个场景大纲结构,举个例子:

Scenario Outline: 这是一个登陆的例子
 Given 打开 <page> 登陆页面
 When 输入帐户名 <username>
 And 输入密码 <password>,点击登陆
 Then 成功进入 <result> 页面
 
 Examples:
   |   page| username| password|result   |
   |    奇虎|  test1  |   123456|奇虎欢迎你 |
   |    百度|  test2  |   123456|百度欢迎你 |
   |    网易|  test3  |   123456|网易欢迎你 |
   |    京东|  test4  |   123456|京东欢迎你 |

以上用例也比较适合接口校验类的用例,咱们的SDK就使用到了这种描述。

Cucumber-JVM几个例子

  • 一个简单的例子(英文版)

  • 一个简单的例子(中文版):

  • 中英文混合版(为何会用到这种,后面会提到)

  • 中英文关键字对照

步骤实现

Cucumber-JVM描述的每个场景(用例),背后都须要一个对于的step步骤来实现这个描述,Cucumber-JVM还不能作到文字自动生成代码的地步,目前不少关键字驱动的框架在作相似的事情。当Cucumber-JVM在解析和执行feature文件时,它将经过正则匹配的方式寻找代码实现的steps。好比这样的:

# 用例描述
Scenario: This is a testcase
 Given I have 10 dollor in my wallet

对应的step实现为:

@Given("I have (\\d+) dollor in my wallet")
public void I_have_dollor_in_my_wallet(int money){
   System.out.println("money: %n\n", money);
}

细心的读者应该发现上面有参数传递,那么feature文件是经过什么样的方式把参数传给step的呢?

  • 整型参数

# 用例描述
Scenario: This is a testcase
 Given I have 10 dollor in my wallet

这里能够用 (\d+) 来捕获:

@Given("I have (\\d+) dollor in my wallet")
public void I_have_dollor_in_my_wallet(int money){
}
  • 字符串参数

# 用例描述
Scenario: This is a testcase
 Given I have "10" dollor in my wallet

这里能够用"("*)" 来捕获(注意转义符):

@Given("I have \"([^\"]*)\" dollor in my wallet")
public void I_have_dollor_in_my_wallet(String money){
}
  • 布尔类型参数

这种参数一般用在Then步骤里做为校验结果。

# 用例描述
Scenario: This is a testcase
 Then 返回检查结果为 false

这里能够用"("*)" 来捕获(注意转义符):

@Then("^返回检查结果为 (true|false)$")
public void verify(boolean expected) {
}
  • 一维数组参数

简单的方式是使用逗号:

# 用例描述
Scenario: This is a testcase
 Given the following animals: cow, horse, sheep

将参数定义为List:

@Given("the following animals: (.*)")
 public void the_following_animals(List<String> animals) {
 }
  • 使用Data Table

# 用例描述
Scenario: This is a testcase
   Given the following animals:
   | cow   |
   | horse |
   | sheep |

将参数定义为List:

@Given("the following animals: (.*)")
 public void the_following_animals(List<String> animals) {
 }

Tags(标签)的妙用

Cucumber的标签很是好用,举个应用场景的例子,咱们的测试用例会有几种维度,好比

  • 按广告平台分,例如:

    360,google,gdt

  • 按手机厂商分,例如:

    apple,xiaomi,huawei

  • 按广告类型分,例如:

    native,video

咱们先给测试用例作了标签分类,能够这样写:

@360
Feature: this is a feature 
 #这里是feature文件的详细描述
 I am a description, blablablablablabla.........
 
 @native
 Scenario: just a demo
   Given the cow weighs 450 kg
   When we calculate the feeding requirements

 @video
 Scenario: just a demo
   Given the cow weighs 450 kg
   When we calculate the feeding requirements

 @xiaomi @native
 Scenario: just a demo
   Given the cow weighs 450 kg
   When we calculate the feeding requirements

假如我此次只想运行原生广告的用例,我能够在运行命令中这样写:

java cucumber.api.cli.Main --tags @native your_features

假如我此次只想运行除了原生广告的用例,我能够在运行命令中这样写:

java cucumber.api.cli.Main --tags ~@native your_features

各类组合状况,想怎么用就怎么用,咱们在项目中针对不一样case的归回能够灵活指定测试范围

按照行号执行测试用例

命令:java cucumber.api.cli.Main E:/codes/cucumber/demo/src/test/features/第一个例子.feature:12:21能够运行 FixedAmountWithdraw.feature 文件中的第 12 和21 行,若是须要运行更多的行,只须要在 feature 文件名以后加上“:行号”。

按照场景名称执行测试用例

命令:java cucumber.api.cli.Main --name 这是一个原生广告请求有table的例子 features能够运行名称为“这是一个原生广告请求有table的例子”的 Scenario 或者 Scenario Outline。对于跑单个失败的场景时很是有用。

以上命令行只是例子,缺乏本地classpath引入,强烈建议使用maven或者IDEA来运行,避免因环境问题致使的错误

Cucumber-JVM的安装和案例

补充:请确认本地有Android SDK、JDK1.八、Nodejs、NPM环境

方法一:Maven建立Cucumber-JVM项目

步骤一:初始化环境

  • 配置Maven环境(略过)

  • 建立个目录

  • 执行mvn archetype:generate目录

  • 提示输入maven Choose a number or apply filter的时候直接回车

  • 注意:groupId和你的package相关,好比这里输入com.qtest, 而artifactId和项目名称相关,好比我这里叫appiumDemo

步骤二:经过maven的pom在线安装各类依赖

Maven本地安装Cucumber-jvm,须要手动添加不少依赖的jar包,利用maven远程仓库一键安装完成,在建立的maven项目中找到pom.xml,好比增长以下的节点:

步骤三:直接执行feature文件

  1. 直接执行feature文件

  2. 把提示的代码复制到step文件中

#运行Cucumber-jvm须要用到的命令行:
#简单命令:
java -cp "./jars/*;." cucumber.api.cli.Main -d path/features/test.feature
#命令窗口颜色:
java -cp "./jars/*;." cucumber.api.cli.Main -p pretty features -g step_definitions
#生成测试报告:
java -cp "./jars/*;." cucumber.api.cli.Main -p html:output features -g step_definitions

步骤四:扩展step伪代码

  • 在定义的JAVA类中填充操做步骤,好比咱们项目的step实现是相似这样的:

步骤五:执行feature文件生成测试报告

Cucumber-JVM的测试报告比较简陋,后面部分会介绍Jenkins Cucumber插件生成美观的报告,生成的结果以下:

方法二:经过IDEA建立Cucumber-JVM项目

IDEA建立Cucumber-JVM项目

  • 安装IDEA

  • 配置JAVA环境

  • 配置Maven依赖

  • 经过IDEA自动导入依赖

  • 安装Cucumber-JVM的IDEA插件

  • 新建一个feature文件,能够看到关键字已经高亮

  • 建立step definition(必定要注意项目的层级目录)

  • 运行feature文件的configuration

以上为第一节的所有内容,主要是介绍了Cucumber(-JVM)框架的用法。BDD框架的好处在于至少两个方面:

  • 可执行性(Executable):从技术人员的视角来看,能够像执行代码(Java、Ruby...)同样运行这些用例,来验证、验收目标系统。

  • 规范性(Specification):从非技术人员的视角触发,相比验证自己,他们更加关心系统功能的清晰描述:系统在什么场景下可以作什么样的事情。

参考资料

https://skyao.gitbooks.io/learning-cucumber/content/practice/pass_parameters.htmlhttps://docs.cucumber.io/

关注咱们

界世的你当不

只作你的肩膀

 360官方技术公众号 

技术干货|一手资讯|精彩活动

空·