经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Node.js » 查看文章
Node.js躬行记(28)——Cypress自动化测试实践
来源:cnblogs  作者:咖啡机(K.F.J)  时间:2023/5/8 10:21:21  对本文有异议

  最近在研究如何提升项目质量,提炼了许多个用于自测的测试用例,但是每次修改后,都手工测试,成本太高,于是就想到了自动化测试。

  在一年前已将 Cypress 集成到管理后台的项目中,不过没有投入到实践中。今天在实践时发现,版本已经到了 12.X,当时集成的版本是 8.X。

一、准备

  在重新安装后,将之前的目录直接删除,运行命令后。

  1. npx cypress open

1)目录

  又会在根目录自动生成新文件,测试用例都会写在 e2e 目录中。

  1. |-- downloads
  2. |-- e2e
  3. |----- example.spec.js
  4. |-- fixtures
  5. |-- support

  将 cypress open 命令添加到 scripts 中,就能通过 npm run cypress 命令执行E2E测试了。

  1. {
  2. "scripts": {
  3. "cypress": "cypress open"
  4. }
  5. }

2)启动

  在刚启动时,会先让你选择一款浏览器,我选择了 Chrome。

  

  然后就会自动打开浏览器,右边的控制台我自己打开的,用于查看通信和打印信息。

  

  中间有许多自动生成的 demo spec,初学者可以作为参考。

  在点击某一个 spec 文件后,就会进入测试页面,左侧是可以回溯的测试过程和结果,中间是在执行的界面。

  若测试不通过,会有醒目的红色错误提示。

  

二、实践

  本次实践的测试对象是一个管理后台,管理后台是需要登录的,肯定不能在每一个测试用例都要重复登录的操作。

  况且,我们的后台会限制登录次数,若登录太多,就会禁用账号。

1)登录

  思前想后,决定直接存储登录后的鉴权信息,我们在登录后,会将此信息存储到 localStorage 中。

  此时需要考虑一个问题,那就我团队中每个人的登录账号是不同的,如何存储这些信息。

  阅读官方文档后,发现可以将配置信息放在 fixtures 目录中,创建 config.json 文件,内容如下。

  1. {
  2. "name": "xxx@xxx.me",
  3. "pwd": "yyy2023",
  4. "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9",
  5. "authorities": "*"
  6. }

  config.json 文件会被版本忽略,所以文件即使被修改,也不会提交到版本库中。

  然后将存储的功能封装成一条命令,这样在各个测试用例中调用会比较简洁。

  1. Cypress.Commands.add('saveToken', () => {
  2. cy.fixture('config.json').then((config) => {
  3. const { token, authorities } = config;
  4. localStorage.setItem('token', token);
  5. localStorage.setItem('authorities', authorities);
  6. });
  7. });

  在 beforeEach() 方法中只需执行 cy.saveToken() 就能保持登录态。

  1. describe('短链服务', () => {
  2. beforeEach(() => {
  3. cy.saveToken(); // 保持登录态
  4. cy.visit('/operate/shortChain');// 跳转页面
  5. });
  6. });

2)测试

  在解决登录态后,就开始正式的测试。

  Cypress 的断言集成了 Chai,并且扩展了 SinonjQuery,也就是说,可以在框架内使用它们提供的功能。

  下图是需要测试的短链服务界面,接下来会测试新建、更新、查询、分页和删除。

  

  点击新建,会有一个弹框,在弹框中有一个表单。

  

  cy.get() 用于查找元素,其参数可以是一个 CSS 选择器字符串,官方文档有专门一栏介绍查询方法。

  cy.type() 用于填写文本框,官方还提供了点击、双击、上传文件等功能。scrollBehavior: false 是为了禁止移动滚动条。

  页面截图需要上传,测试用的图像保存在 fixtures 目录中,cy.fixture() 可以读取此目录中的文件。

  cy.selectFile() 用于上传文件,demo 加了个 @ 符号,不加就无法获取到文件。

  1. it('存储', () => {
  2. // 定位到新建按钮
  3. cy.get('.ant-btn').first().click();
  4. cy.wait(500);
  5. // 在填写表单控件时禁用滚动
  6. cy.get('.ant-modal #url').type(`http://www.xxx.com/test${random()}.html`,
  7. { scrollBehavior: false });
  8. cy.get('.ant-modal #remark').type('测试', { scrollBehavior: false });
  9. // 上传图像,图像存储在 fixtures 目录内
  10. cy.fixture('demo.png', { encoding: null }).as('demo');
  11. cy.get('input[type=file]').selectFile('@demo', { force: true });
  12. cy.wait(1000);
  13. // 存储
  14. cy.get('.ant-modal .ant-btn-primary').click();
  15. cy.get('.ant-modal').should('not.exist'); // 断言存储流程是否正常
  16. cy.scrollTo(0, 0);
  17. cy.wait(2000);
  18. });

  cy.wait() 就是等待,因为自动操作速度很快,有时候需要停顿下,用肉眼观察下结果。

  cy.should() 用于创建断言,这与之前的 expect() 断言稍有不同,其参数就是断言结果,关键字可以参考 Chai 的断言方法。

  Cypress 提供了众多的 API,还有很大的挖掘空间,并且提供了丰富的 demo,学习起来也比较方便。

 

 

原文链接:https://www.cnblogs.com/strick/p/17268829.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号