Cucumber+Rest Assured快速搭建api自动化测试平台

转载:http://www.jianshu.com/p/6249f9a9e9c4

  什么是Cucumber?什么是BDD?这里不细讲,不懂的直接查看官方:https://cucumber.io/
  什么是Rest Assured?传送门:https://github.com/rest-assured/rest-assured

  以下以java为开发语言,快速搭建一个cucumber+Rest Assured的api自动化测试平台。
  1. 用IDEA 新建一个Maven工程,并pom文件添加如下配置:

        <!--ccucumber 相关依赖--><dependency><groupId>info.cukes</groupId><artifactId>cucumber-java8</artifactId><version>1.2.4</version><scope>test</scope></dependency><dependency><groupId>info.cukes</groupId><artifactId>cucumber-java</artifactId><version>1.2.4</version></dependency><!-- https://mvnrepository.com/artifact/info.cukes/cucumber-html --><dependency><groupId>info.cukes</groupId><artifactId>cucumber-html</artifactId><version>0.2.3</version></dependency><!--rest-assured 接口测试框架--><!-- https://mvnrepository.com/artifact/com.jayway.restassured/rest-assured --><dependency><groupId>com.jayway.restassured</groupId><artifactId>rest-assured</artifactId><version>2.9.0</version></dependency><!-- https://mvnrepository.com/artifact/org.testng/testng --><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>6.9.10</version></dependency><!--log 引入--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.5</version><scope>provided</scope></dependency><!--compare jsoon--><dependency><groupId>net.javacrumbs.json-unit</groupId><artifactId>json-unit</artifactId><version>1.13.0</version></dependency><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.8.1</version></dependency>
  1. 新建个ApiTools类,并对Rest Assured进程二次封装,主要是Post 和 Get请求的基础封装和对返回json解析的封装,具体代码如下:

    /*** 带json的post请求** @param apiPath api地址* @param json    请求json* @return api返回的Response*/public static Response post(String apiPath, String json) {
    //        开始发起post 请求String path = Parameters.BOSEHOST + apiPath;Response response = given().contentType("application/json;charset=UTF-8").headers("header1", "value1").cookies("cookies1", "value1").body(json).when().log().all().post(path.trim());log.info(response.statusCode());log.info("reponse:");response.getBody().prettyPrint();return response;}/*** get 请求** @param apiPath api路径* @return api的response*/public static Response get(String apiPath) {
    //        开始发起GET 请求String path = Parameters.BOSEHOST + apiPath;Response response = given().contentType("application/json;charset=UTF-8").headers("headers1", "value1").cookie("cookie1", "value1").when().log().all().get(path.trim());log.info(response.statusCode());log.info("reponse:");response.getBody().prettyPrint();return response;}/*** 获取json中某个key值* @param response  接口返回* @param jsonPath  jsonpath, 例如 a.b.c   a.b[1].c  a* @return*/public static String getJsonPathValue(Response response, String jsonPath) {String reponseJson = String.valueOf(response.jsonPath().get(jsonPath));
    //        String jsonValue = String.valueOf(from(reponseJson).get(jsonPath));return reponseJson;}

    3.新建个Steps 类,完成常用step的封装,具体代码如下:

    import com.jayway.restassured.response.Response;
    import com.tools.apitools.ApiTools;
    import com.tools.apitools.MyAssert;
    import com.tools.filetools.ReadTxtFile;
    import cucumber.api.java.en.Then;
    import cucumber.api.java.en.When;
    import static net.javacrumbs.jsonunit.JsonAssert.assertJsonEquals;
    /**
    * Created by MeYoung on 8/1/2016.
    * <p>
    * Steps 集合
    */
    public class Steps {Response response = null;@When("^I send a GET request to \"(.*?)\"$")public void getRequest(String path) {response = ApiTools.get(path);}@When("^I send a POST request to \"(.*?)\"$")public void postRequest(String apiPath) throws Throwable {response = ApiTools.post(apiPath);}@When("^I send a POST request to \"(.*?)\" and request json:$")public void postRequestWithJson(String apiPath, String json) {response = ApiTools.post(apiPath, json);}@When("^I use a \"(.*?)\" file to send a POST request to \"(.*?)\"$")public void postRequestWihtFile(String fileName, String path) {String json = ReadTxtFile.readTxtFile(fileName);response = ApiTools.post(path, json);}@Then("^the JSON response equals$")public void assertResponseJson(String expected) {String responseJson = response.body().asString();assertJsonEquals(responseJson, expected);}@Then("^the JSON response equals json file \"(.*?)\"$")public void theJSONResponseEqualsJsonFile(String fileName) {String responseJson = response.body().asString();String fileJson = ReadTxtFile.readTxtFile(fileName);assertJsonEquals(responseJson, fileJson);}@Then("^the response status should be \"(\\d{3})\"$")public void assertStatusCode(int statusCode) {Object jsonResponse = response.getStatusCode();MyAssert.assertEquals(jsonResponse, statusCode);}@Then("^the JSON response \"(.*?)\" equals \"(.*?)\"$")public void assertEquals(String str, String expected) {String jsonValue = ApiTools.getJsonPathValue(response, str);MyAssert.assertEquals(jsonValue, expected);}@Then("^the JSON response \"(.*?)\" type should be \"(.*?)\"$")public void assertMatch(String str, String match) {String jsonValue = ApiTools.getJsonPathValue(response, str);MyAssert.assertMatch(jsonValue, match);}@Then("^the JSON response \"(.*?)\" should be not null$")public void assertNotNull(String str) {String jsonValue = ApiTools.getJsonPathValue(response, str);MyAssert.assertNotNull(jsonValue);}@Then("^the JSON response \"(.*?)\" start with \"(.*?)\"$")public void assertStartWith(String str, String start) {String jsonValue = ApiTools.getJsonPathValue(response, str);MyAssert.assertStartWith(jsonValue, start);}@Then("^the JSON response \"(.*?)\" end with \"(.*?)\"$")public void assertEndWith(String str, String end) {String jsonValue = ApiTools.getJsonPathValue(response, str);MyAssert.assertEndWith(jsonValue, end);}@Then("^the JSON response \"(.*?)\" include \"(.*?)\"$")public void assertInclude(String str, String include) {String jsonValue = ApiTools.getJsonPathValue(response, str);MyAssert.assertInclude(jsonValue, include);}
    }

      当然上面代码还涉及到一些Asssert的封装,这里就不列出来,个人喜好不同,更具自己熟悉的情况去引入自己熟悉的jar包。

  ok,最后我们愉快的写两个case,看看效果:

  @getScenario Outline: use examplesWhen I send a GET request to "apiurl"Then the response status should be "200"Then the JSON response "<jsonPath>" equals "<value>"Examples:| jsonPath     | value             || genericPlan  | false             || ehiCarrierId | 90121100          || carrierName  | Anthem Blue Cross |@postScenario: test post requestWhen I send a POST request to "apiurl"Then the response status should be "200"And the JSON response "message" equals "success"#    校验放回值是否是某种类型And the JSON response "sessionId" type should be "^\d{6}$"#    校验返回值不为空And the JSON response "url" should be not null#    校验是否以XX开头Then the JSON response "message" start with "su"#    校验是否以XX开头Then the JSON response "message" end with "ss"#    校验是否以XX开头Then the JSON response "message" include "ss"#    校验返回json是否为XXX,对整个返回json的校验Then the JSON response equals"""{"result":"success"}"""

通过Junit 运行feature.

  1. 在Pom.xml 文件添加junit相关包:

         <dependency><groupId>info.cukes</groupId><artifactId>cucumber-junit</artifactId><version>1.2.4</version><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
  2. 在feature 同级目录下新建个运行类,代码例子如下:
import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;
import org.junit.runner.RunWith;@RunWith(Cucumber.class)
@CucumberOptions(strict = true,monochrome = true,plugin = {"pretty", "html:target/cucumber", "json:target/cucumber.json"},features = {"src/test/java/bosev2"},glue = {"com.bose.step"},tags = {"~@unimplemented"})
public class RunnerBoseTest {
}

@RunWith(Cucumber.class) : 注解表示通过Cucumber的Junit 方式运行脚本
@CucumberOptions () :注解用于配置运行信息,其中代码中的plugin 表示测试报告输出的路径和格式, feature 表示被运行的feature文件的包路径, glue中配置steps的包路径地址,tags中配置要运行的用例的tags名,其实~符号表示除了这个tags的所有tags.

通过Jenkins 执行

  1. 在Pom.xml 文件里面添加运行插件,如下:

    <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.3</version><inherited>true</inherited><configuration><source>1.7</source><target>1.7</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.18.1</version><configuration><reuseForks>false</reuseForks></configuration></plugin></plugins></build>
  2. 在Jenkins 中添加Cucumber-JVM reports插件。
  3. 新建Maven job,配置maven构建方式和构建后的测试报告展示。

Paste_Image.png

Cucumber-JVM reports 提供了非常漂亮的report,如下:


Paste_Image.png

最后附上项目地址:https://github.com/MeYoung/cucumber_restassured



作者:米阳MeYoung
链接:http://www.jianshu.com/p/6249f9a9e9c4
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
参考:https://github.com/jenkinsci/cucumber-reports-plugin

转载于:https://www.cnblogs.com/ceshi2016/p/7481527.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

让这个该死的服务跑起来了~

#前言被该死的Openssl编译嘲讽了一个下午之前的文章说了我的那个编译的问题&#xff0c;这里说下&#xff0c;知识点有点零散&#xff0c;最后的解决也是一个同事提示&#xff0c;感觉也有点奇葩的赶脚。到目前为止&#xff0c;我现在感受到了写文章的好处&#xff0c;昨晚的问…

深度学习概述

深度学习 传统学习与深度学习 深度学习应用特点 深度学习框架比较 Tensorflow 神经元 卷积核 分类 回归 生成

Python--递归

面向函数编程 def func():print(从前有座山&#xff0c;山里有座庙&#xff0c;庙里有个老和尚讲故事&#xff0c;讲的什么呀&#xff1f;)func() 解耦&#xff1a;尽量把不相关的功能拆开&#xff0c;用的时候再调用函数&#xff0c;增强代码重用性&#xff0c;减少代码变更的…

传统神经网络

文章目录神经网络的起源&#xff1a;线性回归一个线性回归问题线性回归优化方法&#xff1a;梯度下降梯度计算梯度计算总结线性回归&#xff1a;输出线性回归&#xff1a;局限从线性到非线性非线性激励常用的非线性激励函数tanhRELULecky RELU神经元—神经网络神经网络构建神经…

深度学习之卷积神经网络

文章目录深度学习之卷积神经网络链式反向梯度链式法则的计算神经网络中链式法则实例二、卷积神经网络-卷积层&#xff08;一&#xff09;什么是卷积层&#xff08;二&#xff09;有什么组成受什么影响&#xff0c;有何特点卷积网络正向传播反向传播卷积和神经网络功能层深度学习…

卷积神经网络高级篇

【 文章目录Alextnet参数计算VGG alexnet增强版VGG参数计算VGG作用GoogleNet 多分辨率融合全卷积神经网络RESNET结构特性有效性结构化图片特殊处理识别效果全局部卷积网络缺陷U-net图片生成网络VGG u-netAlextnet 参数计算 VGG alexnet增强版 VGG参数计算 VGG作用 GoogleNet 多…

LinuxGPIO操作和MTK平台GPIO

GPIO口配置是一个历史性的问题&#xff0c;不管我们使用什么MCU&#xff0c;单片机也好&#xff0c;ARM也好&#xff0c;都离不开驱动GPIO口。Linux下有一个宏&#xff0c;GPIO_GPIO_SYSFS&#xff0c;打开这个宏后&#xff0c;编译烧录到设备端&#xff0c;去看看sys/class/gp…

Linux cpu亲和力

最近在对项目进行性能优化&#xff0c;由于在多核平台上&#xff0c;所以了解了些进程、线程绑定cpu核的问题&#xff0c;在这里将所学记录一下。不管是线程还是进程&#xff0c;都是通过设置亲和性(affinity)来达到目的。对于[进程]的情况&#xff0c;一般是使用sched_setaffi…

卷积神经网络(目标分类)

文章目录目标分类基本框架数据准备数据扩充数据规范模型设计任务分类局部更改训练细节目标分类基本框架 数据准备 现有数据集的子集&#xff0c;网络采集&#xff0c;现有数据人工标注 数据扩充 原始数据切割&#xff0c;噪声颜色等像素变化&#xff0c;旋转平移 数据规范…

安卓9.0添加服务修改SELinux

#文章目录#前言#SELinux来源#SELinux基本框架#SELinux 在不同版本的表现#使用audit2allow工具生成SELinux 权限#完整代码#前言先推荐下之前的SELinux文章&#xff0c;但是那个是7.1的&#xff0c;在9.0上已经在差别很大的了。Android7.1 在init.rc 添加shell服务题外话~在企业里…

卷积神经网络-目标探测

文章目录目标探测介绍任务思路DPMRCNN1&#xff09;候选区域选择2&#xff09;CNN特征提取3&#xff09;分类与边界回归R-CNN总结优点缺陷FAST-RCNNFASTER-RCNNYOLO目标探测介绍 任务 分类获取坐标 目标探测 图片分割 思路 回归问题&#xff1a;利用神经网络进行目标识别&am…

相机视场角和焦距_镜头小讲堂(一)镜头的焦距

在刚购买完相机的时候&#xff0c;我们久会考虑需要什么样的镜头来配合机身来使用。而市场上的镜头种类是在太多了&#xff0c;所以我们就要学习了解下镜头都有哪些种类&#xff0c;选择哪种镜头比较有优势。这也是学习摄影必备的基础知识。01 镜头的焦距焦距是镜头的重要指标&…

C语言指定初始化器解析及其应用

由于笔者能力有限&#xff0c;文中如果出现错误的地方&#xff0c;欢迎大家给我指出来&#xff0c;我将不胜感激&#xff0c;谢谢&#xff5e;#指定初始化器的概念C90 标准要求初始化程序中的元素以固定的顺序出现&#xff0c;与要初始化的数组或结构体中的元素顺序相同。但是在…

递归神经网络

文章目录LSTM![在这里插入图片描述](https://img-blog.csdnimg.cn/20200609171449198.pngLSTM 4INPUTS 1outputs

CNN+RNN

文章目录相同点不同点组合意义组合方式图片标注基本思路模型设计&#xff0d;数据准备视频行为识别视频行为识别图片问答相同点 传统神经网络的扩展 前向计算产生结果&#xff0c;反向计算模型更新 每层神经网络横向可以多个神经元共存&#xff0c;纵向可以多层神经网络链接 …

深入理解Linux内核链表

之前写过的链表文章&#xff0c;再结合这篇&#xff0c;我觉得是一道硬菜。Linux内核链表C语言&#xff0c;链表大家五一节日快乐&#xff0c;我知道劳动节大家都辛苦了&#xff0c;吃点硬菜好顶住饿肚子~#一、 链表数据结构简介链表是一种常用的组织有序数据的数据结构&#x…

GAN

文章目录生成对抗网络(GAN)基础生成对抗网络 优点&#xff1a;缺点&#xff1a;生成对抗网络深度GANDCGAN结构细节特征研究DCGAN总结条件GAN模型结构INFOGANInfoGAN: 自动学习z中部分变量意义Wasserstein GANGAN存在问题原因WGAN特点改进方法&#xff1a;生成对抗网络(GAN)基础…

1200可以读取modbus tcp_S7-1200 作 MODBUS TCP服务器

S7-1200 Modbus TCP 通信指令块STEP 7 V13 SP1 软件版本中的Modbus TCP库指令目前最新的版本已升至V4.0&#xff0c;该版本的使用需要具备以下两个条件&#xff1a;1. 软件版本&#xff1a; STEP 7 V13 SP1及其以上2. 固件版本&#xff1a; S7-1200 CPU 的固件版本V4.1图1. Mod…

Linux一定需要文件系统吗?

开篇题外话&#xff1a;对于Linux初学者来说&#xff0c;这是一个很纠结的问题&#xff0c;但这也是一个很关键的问题&#xff01; 一语破天机&#xff1a;“尽管内核是 Linux 的核心&#xff0c;但文件却是用户与操作系统交互所采用的主要工具。这对 Linux 来说尤其如…

迁移学习

文章目录为什么需要迁移学习模型Fine-‐tune![在这里插入图片描述](https://img-blog.csdnimg.cn/20200612000845217.png)保守训练层迁移Multitask Learning渐进式神经网络/Progressive Neural Networks域对抗零样本学习Self-‐taught learning为什么需要迁移学习 使用深度学习…