WEB自动化-08-Cypress 接口测试

8 接口测试

在服务和服务、系统和系统之间进行通信时,常常会使用到接口。通过接口测试,可以在项目早期更快发现问题。接口有很多类型,而现阶段使用的接口是基于HTTP协议的接口。

8.1 Cypress支持的HTTP请求方式

在Cypress中发起HTTP请求时,需要使用到的命令为 cy.request(),其基本语法格式如下所示:

cy.request(url)
cy.request(url, body)
cy.request(method, url)
cy.request(method, url, body)
cy.request(options)

主要参数详细信息如下所示:

  • *url

url(String),发起请求的接口地址。需要注意的事项如下所示:

1、如果cy.request()在cy.visit()后发起请求时,则Cypress将默认使用cy.visit()中的域名做为发起接口请求的域名地址,示例如下所示:

cy.visit('https://www.surpassme.com/app')
cy.request('users/add') //  实际访问的URL: https://www.surpassme.com/users/add

2、如果事先在 cypress.json设置了 baseUrl时,则在发送接口请求时,可以不填写域名,Cypress在实际发起请求时,会自动将baseUrl添加到接口地址前面。示例如下所示:

// cypress.json
{
  "baseUrl": "https://www.surpassme.com/
}
cy.request('user/add') // 实际访问的URL: https://www.surpassme.com/users/add

3、如果Cypress没有检测到域名,则抛错误异常

  • *body

body (String, Object)是发起请求的请求体。根据接口类型,body会有不同的形式。

  • *method

method (String) 是发起请求的方法。默认请求方法为 GET,其支持的方法比较多,最常见的有 GETPOSTPUTDELETE

  • **options *

options (Object)是可选项,可以定义一些其他的参数来改变cy.request的一些行为,主要哪下所示:

选项 默认值 功能描述 log true 是否在Command log中显示命令 url null 发起请求的URL地址 method GET 请求方法 auth null 添加鉴权头信息 body null 请求体 failOnStatusCode true 若返回的状态码不是2xx和3xx系列,则认为请求失败 followRedirect true 是否自动重定向 form false 是否以表单形式发送请求体,如果是的话,则设置urlencode为x-www-form-urlencoded encoding utf8 请求响应的编码方式,支持ascii, base64, binary, hex, latin1, utf8, utf-8, ucs2, ucs-2, utf16le, utf-16le等 gzip true 是否接受gzip编码 headers null 添加额外的请求头 qs null 查询参数,如果填写后,则自动追加到URL地址后面 retryOnStatusCodeFailure false 在通过状态码判定为失败后的重试次数,如果设置为true,则重试4次 retryOnNetworkFailure true 在通过网络问题判定后为失败后的重试次数,如果设置true,则重试4次 timeout responseTimeout 解析域名地址的超时时间

  • *输出内容

在通过cy.request()发送请求后,输出的响应内容主要有 statusbodyheadersduration

8.2 示例

8.2.1 发起GET请求

GET是平常使用最多的请求,我们来看看示例,如下所示:

///

describe('发送GET请求示例', () => {
    let url="http://httpbin.org/get"

    it('发送请求的GET示例用例-1', () => {
        cy.request(url).as("response");
        cy.get("@response").should((response)=>{
            expect(response.body).to.have.property("headers")
            expect(response.body.url).to.eq(url)
            expect(response.body.headers.Host).to.eq("httpbin.org")
        });
    });

    it('发送请求的GET示例用例-2', () => {
        cy.request("GET",url).as("response");
        cy.get("@response").should((response)=>{
            expect(response.body).to.have.property("headers")
            expect(response.body.url).to.eq(url)
            expect(response.body.headers.Host).to.eq("httpbin.org")
        });
    });

    it('发送请求的GET示例用例-3', () => {
        cy.request("GET",url,{"name":"Surpass","age":28}).as("response");
        cy.get("@response").should((response)=>{
            expect(response.body).to.have.property("headers")
            expect(response.body.url).to.contain(url)
            expect(response.body.headers.Host).to.eq("httpbin.org")
        });
    });

    it('发送请求的GET示例用例-4', () => {
        cy.request({
            method:"GET",
            url:url,
            qs:{"name":"Surpass","age":28}
        }).then((response)=>{
           expect(response.body.args.name).to.eq("Surpass")
           expect(response.body.args.age).to.eq("28")
           expect(response.status).to.eq(200)
           expect(response.body.headers.Host).to.eq("httpbin.org")
           expect(response.body).to.have.property("headers")
        });
    });

    it('获取图片示例', () => {
        cy.request({
            method:"GET",
            url:"https://www.cnblogs.com/images/logo.svg",
            encoding:"base64"
        }).then((response) => {
            let base64Content=response.body;
            let mime=response.headers["content-type"];
            let imageDataUrl=data:${mime};base64,${base64Content}
        })
    });

    it('下载文件', () => {
      cy.request({
          method:"GET",
          url:"https://www.cnblogs.com/images/logo.svg",
          encoding:"binary"
      }).then((response)=>{
          cy.writeFile("./cnblog.logo.svg",response.body,"binary");
      })
    });
});

运行结果如下所示:

WEB自动化-08-Cypress 接口测试

8.2.1 发起POST请求

示例如下所示:

///

describe('发送POST请求示例', () => {
    let url="http://httpbin.org/post";
    let body={"name":"Surpass","age":28};

    it('发送请求的POST示例用例-1', () => {
        cy.request("POST",url,body).as("response");
        cy.get("@response").should((response)=>{
             expect(response.body.json.name).to.eq("Surpass")
             expect(response.body.headers.Host).to.eq("httpbin.org")
        })
    });

    it('发送请求的POST示例用例-2', () => {
        cy.request({
           method:"POST",
           url:url,
           body:body,
           form:true
        }).then((response)=>{
            expect(response.body.form.name).to.eq("Surpass")
            expect(response.body.headers.Host).to.eq("httpbin.org")
        });
    });

    it('发送请求的POST示例用例-3', () => {
        cy.request({
           method:"POST",
           url:url,
           body:body,
           form:false,
           headers:{"Content-Type":"application/json","Customer-Header":"Surpass"}
        }).then((response)=>{
            expect(response.body.json.name).to.contain("Surpass")
            expect(response.body.headers.Host).to.eq("httpbin.org")
            expect(response.headers["content-type"]).to.eq("application/json")
            expect(response.body.headers["Customer-Header"]).to.eq("Surpass")
        });
    });
});

运行结果如下所示:

WEB自动化-08-Cypress 接口测试

原文地址:https://www.jianshu.com/p/007976277dc8

本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:

WEB自动化-08-Cypress 接口测试

Original: https://www.cnblogs.com/surpassme/p/16714101.html
Author: Surpassme
Title: WEB自动化-08-Cypress 接口测试

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581625/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • redis的 分布式锁 golang/erlang 简单实现

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% import (% “redigo/redis”% ) %…

    Linux 2023年5月28日
    0113
  • ElasticSearch & kibana安装

    ElasticSearch ElasticSearch 简介 ElasticSearch 概念 ElasticSearch quick start docker安装ElasticS…

    Linux 2023年6月13日
    0127
  • JDK8-Lambda 表达式

    Lambda 表达式 Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码…

    Linux 2023年6月13日
    078
  • 【C++基础】内存分区模型

    内存分区模型 C++程序在执行时,将内存大致划分为 4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理 全局区:存放 全局变量和 静态变量以及 常量 栈区:由 编译器自动…

    Linux 2023年6月13日
    083
  • 用户身份标识与账号体系实践

    互联网的账号自带备忘机制; 一、业务背景 通常在系统研发的过程中,需要不断适配各种业务场景,扩展服务的领域和能力,一般会将构建的产品矩阵划分出多条业务线,以便更好的管理; 由于各个…

    Linux 2023年6月14日
    089
  • [20211108]索引分裂块清除日志增加(唯一索引)2.txt

    [20211108]索引分裂块清除日志增加(唯一索引)2.txt –//链接http://blog.itpub.net/267265/viewspace-2840853…

    Linux 2023年6月13日
    083
  • nslookup:command not found的解决办法

    nslookup:command not found的解决办法 通过nslookup查看DNS记录,在这里遇到了一个小插曲,nslookup:command not found(未…

    Linux 2023年6月7日
    083
  • 国产化之银河麒麟安装达梦数据库DM8

    背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,数据库使用DM8。 虽然在之前的文章中已经成功模拟国产飞腾处理器,但是运行效率不高,所以这里的银河麒麟操作系统还…

    Linux 2023年5月27日
    0101
  • Kubernetes后台数据库etcd:安装部署etcd集群,数据备份与恢复

    服务器版本 docker软件版本 CPU架构 CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 x86_64…

    Linux 2023年6月7日
    092
  • Linux Ubuntu 添加新用户

    1. 了解配置文件 Linux下与用户信息相关的配置文件有 /etc/passwd、 /etc/group、 /etc/shadow等,其权限分别如下: /etc/passwd:保…

    Linux 2023年6月14日
    099
  • 配置免密登陆服务器

    前言 原来自己学习的时候在阿里云买自己的学习机,一台主机自己瞎折腾。但是参加工作以后管理的主机越来越多了,上服务器看的频率也越来越频繁,虽然有时候shell管理工具可以很方便的保存…

    Linux 2023年6月14日
    092
  • dbus的奇妙世界

    故事背景 在linux开发中我们经常会用到dbus来进行进程间通信,但是如何理解dbus服务端和客户端呢?很多小伙伴可能都会遇到类似的问题,而且都是含含糊糊的,接下来我们直接上硬菜…

    Linux 2023年5月27日
    086
  • cobbler的部署

    cobbler部署 //配置yum源 [root@localhost ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://m…

    Linux 2023年6月13日
    090
  • 路由层

    目录 django请求生命周期流程图 *路由层相关知识 内容 django请求生命周期流程图 整体概括请求的走向以及django的核心组成部分 路由匹配 路由匹配的特点 只要匹配上…

    Linux 2023年6月7日
    0105
  • Snap Build Your Own Blocks输入中文解决办法

    Snap Build Your Own Blocks 输入中文解决办法 Snap! (formerly BYOB) is a visual, drag-and-drop progr…

    Linux 2023年6月6日
    093
  • Web开发静态资源处理

    Web开发静态资源处理 7.1 静态资源处理 我们要引入前端资源,项目中有许多的静态资源,比如css,js等文件,这个SpringBoot是怎么处理呢? 如果我们是一个web应用,…

    Linux 2023年6月14日
    0113
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球