使用 cypress 做 E2E 测试

龙骑士
• 阅读 3127

E2E 测试即 End to End,也就是端到端测试,属于黑盒测试。通过编写测试用例,自动化模拟用户操作,确保应用程序能够如期运行。以 react-multi-page 模版为例,谈谈如何使用 cypress 做 E2E 测试

技术栈

  • cypress[3.8.2]
  • eslint-plugin-cypress[2.8.1]

如何配置

安装 cypress

npm i cypress eslint-plugin-cypress -D

设置 npm 脚本命令

{
  "scripts": {
    "test:e2e": "cypress open"
  }
}

运行 cypress

node_modules/.bin/cypress open

使用 cypress 做 E2E 测试

cypress 启动后,会在根目录看到 cypress 目录,里面存放了运行 cypress 相关的配置资料,为了分类处理目录结构,可以约定将测试相关的资料统一放在 test 目录中。那么在根目录建立 test/e2e 目录用于存放 E2E 测试相关资料,并把 cypress 目录中的资料转移到 test/e2e 目录中

<root>
  |__ test
    |__ e2e
      |__ fixtures
      |__ integration
      |__ plugins
      |__ support

在根目录创建 cypress.json,配置相关目录指向 test/e2e 文件夹

{
  "baseUrl": "http://localhost:3000/",
  "fixturesFolder": "test/e2e/fixtures",
  "integrationFolder": "test/e2e/integration",
  "pluginsFile": "test/e2e/plugins/index.js",
  "screenshotsFolder": "test/e2e/screenshots",
  "supportFile": "test/e2e/support/index.js",
  "videosFolder": "test/e2e/videos",
  "video": false
}
其中 baseUr 根据实际网站域名端口自行配置,video 默认是启用状态,我这里设置关闭即不保存测试录屏文件

编写测试用例

现在我们可以来编写一些简单的测试用例,来测试我们的 APP 的运行是否按预期执行

使用 cypress 做 E2E 测试

假设我们的测试点有:

  • 首页包含 Index 文字
  • 首页包含 Link To Home 文字
  • 可以点击 Link To Home 文字
  • 点击 Link To Home 文字后进入新页面,新页面 url 中包含 home 文字

编写成对应的 E2E 测试用例如下:

// test/e2e/integration/Index.spec.js
describe('The Home Page', function() {
  it('successfully loads', function() {
    cy.visit('/')
    cy.contains('Index')
    cy.contains('Link To Home').click()
    cy.url().should('include', 'home')
  })
})

运行结果

重新启动 cypress,选择 Index.spec.js,可以看到完整的测试流程,并显示测试已经通过

使用 cypress 做 E2E 测试

持续集成

上面我们通过 cypress open 命令手动测试,但在实际工作中可能需要在持续集成环境中运行 E2E 测试,可以使用 cypress run 命令

{
  "scripts": {
    "test:e2e": "npm run serve && cypress run"
  }
}

但是很快就发现问题了,执行 npm run serve 后终端被服务器进程挂起,无法执行后面的 cypress run 命令,于是我引入 start-server-and-test 来处理 npm run serve 的阻塞问题,也可以使用官方文档中的 wait-on

{
  "scripts": {
    "cypress:open": "cypress open",
    "cypress:run": "cypress run",
    "serve": "node prod.server.js",
    "test:e2e": "start-server-and-test serve http://localhost:3000 cypress:open",
    "test-ci:e2e": "start-server-and-test serve http://localhost:3000  cypress:run"
  }
}

现在 npm run serve 不会阻塞后面的任务了,终端运行结果如下

====================================================================================================

  (Run Starting)

  ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
  │ Cypress:    3.8.2                                                                              │
  │ Browser:    Electron 78 (headless)                                                             │
  │ Specs:      1 found (Index.spec.js)                                                            │
  └────────────────────────────────────────────────────────────────────────────────────────────────┘


────────────────────────────────────────────────────────────────────────────────────────────────────

  Running:  Index.spec.js                                                                   (1 of 1)
undefined

  The Home Page
    √ successfully loads (1395ms)
undefined
undefined
  1 passing (2s)
undefined

  (Results)

  ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
  │ Tests:        1                                                                                │
  │ Passing:      1                                                                                │
  │ Failing:      0                                                                                │
  │ Pending:      0                                                                                │
  │ Skipped:      0                                                                                │
  │ Screenshots:  0                                                                                │
  │ Video:        false                                                                            │
  │ Duration:     1 second                                                                         │
  │ Spec Ran:     Index.spec.js                                                                    │
  └────────────────────────────────────────────────────────────────────────────────────────────────┘


====================================================================================================

  (Run Finished)


       Spec                                              Tests  Passing  Failing  Pending  Skipped
  ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
  │ √  Index.spec.js                            00:01        1        1        -        -        - │
  └────────────────────────────────────────────────────────────────────────────────────────────────┘
    √  All specs passed!                        00:01        1        1        -        -        -

参考资料

点赞
收藏
评论区
推荐文章
亚瑟 亚瑟
4年前
React之集成测试 – 测试概览
你可以用像测试其他JavaScript代码类似的方式测试React组件。现在有许多种测试React组件的方法。大体上可以被分为两类:渲染组件树在一个简化的测试环境中渲染组件树并对它们的输出做断言检查。运行完整应用在一个真实的浏览器环境中运行整个应用(也被称为“端到端(endtoend)”测试)。本章节主要专
Easter79 Easter79
3年前
Testlink导入测试用例 附:Excel转换XML工具
TestLink是基于web的测试用例管理系统,主要功能是测试用例的创建、管理和执行,还提供简单的统计功能。通常情况下,我们都习惯于在Excel表中编写测试用例,写完之后经过用例评审,修改调整并汇总形成最终版的测试用例,再批量导入到Testlink系统。一、根据《导入测试用例模板.xlsx》编写测试用例,如下图所示:!(https://im
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Cypress学习15
前言Cypress提供了hooks函数,方便我们在组织测试用例的时候,设置用例的前置操作和后置清理。类似于python的unittest里面的setUp和setUpclass功能HooksCypress提供了hooks函数。这些有助于设置要在一组测试之前或每个测试之前运行的条件。它们也
Wesley13 Wesley13
3年前
Java将List中的实体按照某个字段进行分组的算法
publicvoidtest(){List<UserlistnewArrayList<();//User实体测试用Stringid,name;//当前测试以id来分组,具体请按开发场景修改list.add(newUse
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
API 小达人 API 小达人
1年前
流程测试用例的详细指南|Eolink Apikit 接口自动化测试
流程测试用例是为验证特定业务流程而设计和编写的测试案例,专注于检查系统或应用程序在执行某一业务流程时的正确性、稳定性和可靠性。一个业务流程可能涉及多个步骤、多个用户交互和多个系统组件的协作,流程测试用例有助于确保整个流程在各种情况下都能正常运行。在API自动化测试中,所有的测试用例都是以项目维度来进行管理,一个自动化测试项目可以从多个API文档项目中引用API信息来创建API测试用例。
京东云开发者 京东云开发者
11个月前
研发视角浅谈R2流量回放测试
一、背景测试小伙伴们在2023年保障了团队线上系统0问题,这简直就是一项了不起的壮举!这得益于咱们测试组同事对工作的细致投入、风险把控、以及严格遵循流程规范进行测试用例评审、自动化建设、联调推动、回归验证、常态化压测、大促高保真压测、引流回放等多重保险策略
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
龙骑士
龙骑士
Lv1
离别家乡岁月多,近来人事半消磨。
文章
2
粉丝
0
获赞
0