Node.js躬行记(28)——Cypress自动化测试实践

简介: Node.js躬行记(28)——Cypress自动化测试实践

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

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


一、准备


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

npx cypress open

1)目录

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

|-- downloads
|-- e2e
|----- example.spec.js
|-- fixtures
|-- support

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

{
  "scripts": {
    "cypress": "cypress open"
  }
}

2)启动

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

  

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

  

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

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

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

  


二、实践


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

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

1)登录

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

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

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

{
  "name": "xxx@xxx.me",
  "pwd": "yyy2023",
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9",
  "authorities": "*"
}
  config.json 文件会被版本忽略,所以文件即使被修改,也不会提交到版本库中。
  然后将存储的功能封装成一条命令,这样在各个测试用例中调用会比较简洁。
Cypress.Commands.add('saveToken', () => {
  cy.fixture('config.json').then((config) => {
    const { token, authorities } = config;
    localStorage.setItem('token', token);
    localStorage.setItem('authorities', authorities);
  });
});
  在 beforeEach() 方法中只需执行 cy.saveToken() 就能保持登录态。
describe('短链服务', () => {
  beforeEach(() => {
    cy.saveToken(); // 保持登录态
    cy.visit('/operate/shortChain');// 跳转页面
  });
 });

2)测试

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

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

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

  

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

  

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

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

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

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

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

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

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

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

 

相关文章
|
5天前
|
敏捷开发 机器人 Java
自动化测试之美:从理论到实践
【9月更文挑战第28天】在软件开发的海洋中,自动化测试是一艘航向高效、精确和快速交付的船。它不仅减轻了手动测试的负担,还提升了软件质量的保障。本文将带你了解自动化测试的核心概念、流行的工具以及如何将这些理论应用到实践中去。我们将通过实际代码示例,探索自动化测试的魅力所在。
109 70
|
5天前
|
测试技术
探索软件测试的奥秘:从基础理论到实践应用
【9月更文挑战第28天】在数字化时代,软件已成为我们生活中不可或缺的一部分。然而,随着软件复杂性的增加,确保其质量和可靠性变得日益重要。本文将带你深入了解软件测试的核心概念、方法论以及如何在实际工作中运用这些知识来提升软件质量。无论你是软件测试新手还是希望深化理解,这篇文章都将为你提供宝贵的洞见和实用技巧。
|
3天前
|
Devops jenkins 测试技术
DevOps实践:持续集成与自动化测试的融合之道
【9月更文挑战第29天】在软件开发的快节奏竞赛中,DevOps如同一位智慧的舵手,引领着船只驶向效率与质量的彼岸。本文将揭开DevOps的神秘面纱,探索其核心理念如何通过持续集成(CI)和自动化测试的实践,实现软件开发流程的优化与加速。我们将一同见证代码从构思到部署的旅程,以及这一过程中的关键技术和工具如何协同工作,确保软件质量和交付速度的双重提升。
|
7天前
|
敏捷开发 监控 测试技术
提升软件质量的利器:自动化测试的实践与反思
在软件开发的生命周期中,测试作为保障产品质量的重要环节,其重要性不言而喻。随着敏捷开发和持续集成等实践的普及,传统的手动测试方式已逐渐无法满足快速迭代的需求。因此,自动化测试作为一种提高测试效率和准确性的有效手段,正受到越来越多开发者的青睐。本文将深入探讨自动化测试的价值、实施步骤以及在实践中可能遇到的问题和解决方案,帮助读者更好地理解和应用自动化测试。
12 2
|
9天前
|
存储 安全 jenkins
提升软件测试效率的策略与实践
在软件开发过程中,测试环节扮演着至关重要的角色。它不仅保障了软件产品的质量,还在很大程度上决定了产品的最终用户体验。本文将探讨几种实用的策略和实践方法,旨在提高软件测试的效率。从自动化测试工具的应用,到持续集成环境的搭建,再到测试用例的高效管理,我们将一一解析如何优化测试流程,减少重复工作,确保软件质量的同时,缩短上市时间。
|
6天前
|
小程序 测试技术 程序员
『软件工程12』软件工程实践方法——软件测试
该文章详细阐述了软件测试的重要性和基本原则,并按测试阶段顺序介绍了单元测试、集成测试、确认测试以及系统测试的具体内容和实施步骤。
『软件工程12』软件工程实践方法——软件测试
|
9天前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
|
10天前
|
测试技术 持续交付 Android开发
软件测试中的自动化测试策略与实践
本文深入探讨了软件测试中自动化测试的策略与实践,阐述了自动化测试的重要性、适用场景及常见工具。通过对自动化测试框架的搭建、脚本编写、持续集成等方面的详细分析,揭示了如何有效提升软件测试的效率和质量。同时,本文还指出了自动化测试在实际应用中可能面临的挑战,并提出了相应的解决方案。无论是对于初学者还是资深测试工程师,本文都提供了宝贵的参考和启示。
|
11天前
|
Web App开发 JavaScript Java
自动化测试的利剑:Selenium WebDriver入门与实践
【9月更文挑战第21天】在软件开发的海洋中,自动化测试犹如一艘船,帮助开发者们快速航行至质量保证的彼岸。本文将作为你的罗盘,指引你了解和掌握Selenium WebDriver这一强大的自动化测试工具。通过深入浅出的方式,我们将探索Selenium WebDriver的基本概念、安装过程以及编写简单测试脚本的方法。无论你是刚接触自动化测试的新手,还是希望提升测试技能的开发者,这篇文章都将为你提供有价值的指导。
|
11天前
|
Web App开发 测试技术 持续交付
自动化测试的利器:Selenium与Python的完美结合
【9月更文挑战第21天】在软件开发的世界里,测试是确保产品质量的关键步骤。随着敏捷开发和持续集成的流行,自动化测试工具变得尤为重要。本文将介绍如何使用Selenium和Python进行高效的自动化测试,不仅提供代码示例,还深入探讨如何设计测试用例、选择正确的测试框架、以及如何整合到CI/CD流程中。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧。
23 3
下一篇
无影云桌面