十一、用Cypress做接口测试——不止于UI的全能选手

用Cypress做接口测试------不止于UI的全能选手

提到Cypress,很多人觉得它只能做UI自动化,但其实它在接口测试方面同样强大。相比Postman这类工具,Cypress能无缝衔接UI操作和接口调用,特别适合端到端场景。这一章咱们就来解锁Cypress的接口测试技能。

一、发起接口请求:cy.request()的用法

Cypress用cy.request()命令发起HTTP请求,支持GET、POST、PUT、DELETE等所有常用方法,语法简单直接:

1. 基础用法:GET请求

比如调用用户信息接口,获取数据后做断言:

javascript 复制代码
it('获取用户信息接口返回正确', () => {
  // 发起GET请求
  cy.request('https://api.example.com/user/1')
    .then((response) => {
      // 断言状态码是200
      expect(response.status).to.equal(200)
      // 断言返回数据中的用户名正确
      expect(response.body.name).to.equal('jane.lane')
      // 断言用户ID存在
      expect(response.body).to.have.property('id', 1)
    })
})

2. 带参数的POST请求

登录接口通常用POST方法,需要传请求体(body):

javascript 复制代码
it('登录接口返回token', () => {
  cy.request({
    method: 'POST', // 请求方法
    url: '/api/login', // 接口地址(会自动拼接baseUrl)
    body: { // 请求体
      username: 'jane.lane',
      password: 'password123'
    },
    headers: { // 请求头(可选)
      'Content-Type': 'application/json'
    }
  }).then((response) => {
    // 断言登录成功,返回token
    expect(response.status).to.equal(200)
    expect(response.body).to.have.property('token')
    // 保存token,供后续接口使用
    Cypress.env('token', response.body.token)
  })
})

3. 带认证的请求

很多接口需要认证(比如JWT令牌),可以在请求头里带认证信息:

javascript 复制代码
it('带token访问个人中心接口', () => {
  cy.request({
    method: 'GET',
    url: '/api/profile',
    headers: {
      // 从环境变量取之前保存的token
      'Authorization': `Bearer ${Cypress.env('token')}`
    }
  }).then((response) => {
    expect(response.status).to.equal(200)
    // 断言返回的是当前登录用户的信息
    expect(response.body.username).to.equal('jane.lane')
  })
})

二、接口测试与UI测试结合:端到端场景

Cypress的优势在于能把接口调用和UI操作无缝结合,比如:

  1. 用接口快速创建测试数据(比UI操作快得多);
  2. 再用UI操作验证数据展示是否正确。

举个例子:测试"用户下单后,订单列表显示正确"

javascript 复制代码
it('下单后订单列表显示新订单', () => {
  // 步骤1:用接口快速创建订单(代替UI操作的"加购→结算")
  cy.request({
    method: 'POST',
    url: '/api/orders',
    headers: {
      'Authorization': `Bearer ${Cypress.env('token')}`
    },
    body: {
      productId: 1001,
      quantity: 2
    }
  }).then((response) => {
    expect(response.status).to.equal(201) // 201表示创建成功
    // 保存订单ID,供后续验证
    Cypress.env('orderId', response.body.id)
  })

  // 步骤2:用UI访问订单列表,验证新订单是否显示
  cy.visit('/orders')
  cy.get(`[data-cy=order-${Cypress.env('orderId')}]`)
    .should('be.visible')
    .and('contain', '商品ID:1001')
    .and('contain', '数量:2')
})

这种方式既快又稳定------用接口绕过长时间的UI操作,用UI验证用户实际看到的内容。

三、处理接口依赖:前置条件准备

复杂场景中,接口之间可能有依赖(比如"评论接口"依赖"登录"和"创建文章")。可以用beforeEach提前准备前置条件:

javascript 复制代码
describe('评论接口测试', () => {
  let articleId // 文章ID(评论的前置条件)

  // 测试前准备:登录→创建文章
  beforeEach(() => {
    // 1. 登录
    cy.request({
      method: 'POST',
      url: '/api/login',
      body: { username: 'jane', password: '123' }
    }).then((res) => {
      Cypress.env('token', res.body.token)
    })

    // 2. 创建一篇文章,供后续评论
    cy.request({
      method: 'POST',
      url: '/api/articles',
      headers: { 'Authorization': `Bearer ${Cypress.env('token')}` },
      body: { title: '测试文章', content: '欢迎评论' }
    }).then((res) => {
      articleId = res.body.id
    })
  })

  // 测试评论接口
  it('发表评论成功', () => {
    cy.request({
      method: 'POST',
      url: `/api/articles/${articleId}/comments`,
      headers: { 'Authorization': `Bearer ${Cypress.env('token')}` },
      body: { content: '这是一条测试评论' }
    }).then((res) => {
      expect(res.status).to.equal(201)
      expect(res.body.content).to.equal('这是一条测试评论')
    })
  })
})

四、接口测试的优势与适用场景

相比专门的接口测试工具(如Postman、JMeter),Cypress做接口测试的优势在于:

  • 无缝衔接UI:接口和UI测试用例可以写在同一个文件,共享数据和环境配置;
  • 复用认证信息:登录状态(如cookie、token)自动保存,不用手动处理;
  • 灵活的断言:支持Chai断言库的所有语法,断言逻辑可以很复杂。

适合用Cypress做接口测试的场景:

  • 端到端流程中的接口验证(如"下单→支付→发货"全链路);
  • 需要结合UI状态的接口测试(如"修改用户信息后,个人页展示正确");
  • 临时接口调试(写几行代码就能跑,比Postman手动填参数快)。
相关推荐
ai小鬼头5 分钟前
创业小公司如何低预算打造网站?熊哥的实用建站指南
前端·后端
阿星做前端12 分钟前
聊聊前端请求拦截那些事
前端·javascript·面试
阿凤2116 分钟前
在UniApp中防止页面上下拖动的方法
前端·uni-app
拾光拾趣录25 分钟前
DocumentFragment:高性能DOM操作
前端·dom
归于尽1 小时前
从JS到TS:我们放弃了自由,却赢得了整个世界
前端·typescript
palpitation971 小时前
Fitten Code使用体验
前端
byteroycai1 小时前
用 Tauri + FFmpeg + Whisper.cpp 从零打造本地字幕生成器
前端
用户1512905452201 小时前
C 语言教程
前端·后端
UestcXiye1 小时前
Rust Web 全栈开发(十):编写服务器端 Web 应用
前端·后端·mysql·rust·actix
kuekuatsheu1 小时前
《前端基建实战:高复用框架封装与自动化NPM发布指南》
前端