cypress初探

简介: E2E测试会发现启动的方式很简单,那么对应的组件测试,也是一样的简单。这样就不演示了,等一下来编写对应的组件,来看看效果

cypress 是啥,cypress 的初衷是创造一个友好的体验,用于web端的e2e测试 。换一句话说就是,书写测试用例,然后ui自动化测试,详情请查看官网


项目搭建


使用vite来搭建一个vue的项目,在里面使用cypress来进行e2e测试和组件测试


pnpm create vite try-cypress-init --template vue  // 初始化项目
pnpm add cypress -D  // 安装依赖


配置打开cypress的脚本,在package.json中增加指令


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


启动命令后,就能看到下面的结果


e02e9164572e4cdaaa7252bf12cfc1bc.png


选择需要测试的类型


在这里可以选择E2E(端到端)的测试,然后点击确定,就会在项目里面生成配置文件,如下:


fef5180813bd44c6b166ffb08114557d.png


生成完成后,在控制台会出现配置完成,可以进行测试啦!


0051436a42a94406a5ae6df76e385ab0.png


E2E 测试启动


920241fb766a6fdef4e37a93e728cb12.png

9d72cb36e4c2417cb0b19e64a93ecf58.png


在上面的测试用例中,可以点击对应的测试用例,然后cypress会自动按照脚本的内容来跑起来。


E2E测试会发现启动的方式很简单,那么对应的组件测试,也是一样的简单。这样就不演示了,等一下来编写对应的组件,来看看效果


编写项目测试用例


在开发的过程中,有一种思想叫做TDD(测试驱动开发),接下来就使用改思想来开发一个页面。TDD的开发思想总共分为三个步骤:


  • 编写测试用例
  • 让测试用例通过
  • 重构


编写测试用例


在src/cypress/e2e中添加一个文件夹try-cypress-init中增加咋们的测试用例,内容如下:


describe('尝试使用cypress来测试项目', () => {
  // 在窗口打开本地项目的连接
  beforeEach(() => {
    cy.visit('http://localhost:5173')
  })
  it('测试一个小demo', () => {
    // 做一个这样demo, 一个输入框,一个按钮,输入框输入数据后,点击按钮,输入框的内容消息,下面的数据列表展示对应的数据
    // 拿到输入框,输入对应的数据
    cy.get('[data-test=testMessage]').type('hello cypress');
    // 拿到按钮,并且点击按钮
    cy.get('[data-test=testButton]').click();
    // 输入框的值是空
    cy.get('[data-test=testMessage]').should('have.value', '');
    // 下面的数据列表展示对应的数据
    cy.get('[data-test=testList] li').should('have.length', 1);
    // ul li显示的数据
    cy.get('[data-test=testList] li').first().should('have.text', 'hello cypress');
  })
})


写完测试用例后,接下来写页面。


通过测试用例


为了快速通过代码,咋们就在app.vue中来进行书写对应的代码


<script setup>
import { reactive, ref } from 'vue'
const message = ref('')
const messageList = reactive([])
const send = () => {
  messageList.push(message.value)
  message.value = ''
}
</script>
<template>
  <div class="app-container">
    <div class="operation-container">
      <input type="text" data-test="testMessage" v-model="message" />
      <button data-test="testButton" @click="send">send</button>
    </div>
    <div class="show-container">
      <ul data-test="testList">
        <li v-for="msg in messageList" :key="msg">{{ msg }}</li>
      </ul>
    </div>
  </div>
</template>
<style scoped>
.app-container {
  text-align: center;
}
</style>


接下来就是见证奇迹的时刻了🤔🤔🤔


a84f93a232d62979e579685a807f5091.gif


点击测试用例,然后就自动测试了。是不是感觉很爽哇!


重构


目前是所有的代码都卸载了App.vue中,一般来说,可以把对应的功能封装成对应的组件。


封装对应的组件,然后可以使用cypress来测试组件哦!


在这个功能中,总共可以分为两个组件,一个用于输入的组件MessageInput,另一个用于展示的组件MessageList


编写组件测试


MessageInput


功能的话,很简单。只有输入框输入数据,点击按钮,把当前事件对外抛出,并且清空输入框的内容。


编码


测试用例的内容可以如下:


import MessageInput from './MessageInput.vue'
describe('<MessageInput>', () => {
  // 挂载组件
  it('mount component', () => {
    cy.mount(MessageInput)
  })
  it('MessageInput在数据输入,点击功能测试', () => {
    const onMessageInput = cy.spy().as('onMessageInputSpy')
    cy.mount(MessageInput, { props: { onSendMessage: onMessageInput } })
    // 找到input输入内容
    cy.get('[data-test=testMessage]').type('hello cypress');
    // 找到按钮并且点击
    cy.get('[data-test=testButton]').click();
    // 触发事件onSendMessage,并且值是hello cypress
    cy.get('@onMessageInputSpy').should('be.calledWith', 'hello cypress')
    // 验证输入框是否为空
    cy.get('[data-test=testMessage]').should('have.value', '')
  })
})


有了对应的测试用例,那来实现下组件的功能。


<script setup>
import { ref } from "vue"
const message = ref('')
const emits = defineEmits(['sendMessage'])
const send = () => {
  emits('sendMessage', message.value)
  message.value = ''
}
</script>
<template>
  <div class="operation-container">
    <input type="text" data-test="testMessage" v-model="message" />
    <button data-test="testButton" @click="send">send</button>
  </div>
</template>
<style scoped>
</style>


测试结果


4c229fa83cee4ca3b9b482c65ebe6c35.gif


attention!!!


在进行组件测试的时候,不能使用 node17版本,如果是17版本的请减低到16版本。17版本会导致组件测试一直处于loading状态,无法测试组件


有了第一个功能组件,接下来做一个展示的组件。


展示组件


展示组件需要做到的,传入一个list列表,我负责展示即可


编码


在测试用例中,只需要在挂载组件的时候传入数据,然后进行页面展示赋值即可


import MessageList from './MessageList.vue';
describe('<MessageList>', () => {
  it('mount component', () => {
    cy.mount(MessageList)
  })
  it('test show dataList', () => {
    // 传入数据
    cy.mount(MessageList, { props: { messageList: ['hello cypress'] } })
    // ul元素下的li元素个数为1
    cy.get('[data-test=testList] li').should('have.length', 1);
    // ul li显示的数据
    cy.get('[data-test=testList] li').first().should('have.text', 'hello cypress');
  })
})


有了测试用例,那么来实现一下业务代码吧😉😉😉


<script setup>
import { ref } from "vue"
defineProps({
  messageList: {
    type: Array,
    default: () => []
  }
})
</script>
<template>
  <div>
    <ul data-test="testList">
      <li v-for="msg in messageList" :key="msg">{{ msg }}</li>
    </ul>
  </div>
</template>
<style lang="scss" scoped>
</style>


测试结果


ebfede160be54235b18d800289a42d6d.gif


整合归一


重构App.vue的代码


<script setup>
import { reactive, ref } from 'vue'
import MessageInput from './components/MessageInput.vue'
import MessageList from './components/MessageList.vue';
const messageList = reactive([])
const send = (val) => {
  messageList.push(val)
}
</script>
<template>
  <div class="app-container">
    <div class="operation-container">
      <MessageInput @send-message="send"></MessageInput>
    </div>
    <div class="show-container">
      <MessageList :message-list="messageList"></MessageList>
    </div>
  </div>
</template>
<style scoped>
.app-container {
  text-align: center;
}
</style>


既然咋们有了测试用例,拿咋就都跑一下吧!来检测一下效果😀😀😀


37f4bb4fb2cd4291bf93b2ad103bbe97.gif


总结


本期主要使用cypress 来测试ui界面


  • 使用cypress 来编写e2e测试
  • 使用cypress来编写组件测试,但是在使用组件的时候,可千万要看自己的node环境的版本哦,不然测试组件一直处于loading


只写文章不放源码有点谈恋爱不结婚耍流氓的感觉😶‍🌫️😶‍🌫️😶‍🌫️


my code in here

相关文章
|
安全 数据建模 网络安全
什么是泛域名证书
什么是泛域名证书
2933 0
|
存储 文件存储 数据安全/隐私保护
文件管理介绍
文件管理是操作系统中的一个重要组成部分,它负责管理计算机系统中的文件和文件系统的组织结构。文件是存储在存储介质上的一组相关数据,可以是文本文件、图像文件、音频文件、视频文件等。文件管理的目标是有效地组织、存储、检索和保护文件,提供方便的文件操作和共享功能。 文件管理的主要功能包括文件存储和文件操作两个方面: 1. 文件存储: - 文件组织结构:文件系统采用一种层次化的组织结构,常见的有层次目录结构、索引结构和扁平文件结构等。层次目录结构是最常见的文件组织方式,通过目录和子目录的层次关系来组织文件。索引结构是利用索引表来存储文件的位置和属性信息,可以提高文件的访问速度。扁平文件结构是将
688 1
|
5月前
|
SQL 存储 供应链
如何开发ERP系统中的库存管理板块(附架构图+流程图+代码参考)
本文介绍如何通过ERP系统实现企业库存管理的数字化与自动化,涵盖仓库管理、库位管理、出入库操作、库存调拨与盘点等功能设计,并提供开发技巧及代码参考,帮助企业提升库存管理效率,减少错误与资源浪费。
|
4月前
|
C++
什么是单项式
单项式是代数式中的一种
|
网络协议 文件存储 Docker
如何搭建HomeAssistant智能家居管理平台并实现公网访问内网管理界面
如何搭建HomeAssistant智能家居管理平台并实现公网访问内网管理界面
|
机器学习/深度学习 搜索推荐 数据可视化
小白入门机器学习必学案例分享。
小白入门机器学习必学案例分享。
1209 0
小白入门机器学习必学案例分享。
|
10月前
|
机器学习/深度学习 人工智能 弹性计算
阿里云《AI 剧本生成与动画创作》解决方案深度评测
阿里云《AI 剧本生成与动画创作》解决方案深度评测
434 7
|
缓存 资源调度 数据可视化
云效常见问题之 Flow中使用 pnpm 安装依赖失败如何解决
云效(CloudEfficiency)是阿里云提供的一套软件研发效能平台,旨在通过工程效能、项目管理、质量保障等工具与服务,帮助企业提高软件研发的效率和质量。本合集是云效使用中可能遇到的一些常见问题及其答案的汇总。
1163 3
|
存储 API 开发工具
OSS工作原理
OSS工作原理
323 6
|
机器学习/深度学习 人工智能 自然语言处理
人工智能浪潮下的自然语言处理技术演进
本文从自然语言处理(NLP)技术的历史发展出发,深入剖析了在人工智能(AI)大潮中该领域的创新突破。我们将探讨深度学习如何推动语言模型的革新、多语言处理技术的发展,以及机器翻译和语音识别的最新进展。文章还将讨论这些技术进步如何影响社会,并展望未来NLP技术的潜力与挑战。
460 0