Cypress 的条件测试

简介: Cypress 的条件测试

条件测试用下列的编程范式可以清晰表示出来:

If X, then Y, else Z

如今,现代 JavaScript 应用程序是高度动态和可变的。 它们的状态和 DOM 在一段时间内不断变化。


条件测试的问题在于它只能在状态稳定后才能使用。 在现代应用程序中,知道状态何时稳定通常是不可能的。


对人类而言——如果从现在起 10 毫秒或 100 毫秒发生变化,我们甚至可能不会注意到这种变化并假设状态总是相同的。


对于机器人来说——即使是 10 毫秒也代表着数十亿+ 的时钟周期。 时间尺度的差异令人难以置信。


人也有直觉。 如果您单击一个按钮并看到一个加载微调器,您将假定状态处于不断变化中,并会自动等待它完成。


机器人没有直觉——它会完全按照编程的方式去做。


为了说明这一点,让我们举一个简单的例子来尝试有条件地测试不稳定状态。


The DOM is unstable

下面是我们的应用代码,在随机的时间间隔内,将新创建的 button 元素添加 active CSS 类。

// your app code
// random amount of time
const random = Math.random() * 100
// create a <button> element
const btn = document.createElement('button')
// attach it to the body
document.body.appendChild(btn)
setTimeout(() => {
  // add the class active after an indeterminate amount of time
  btn.setAttribute('class', 'active')
}, random)

看下面的测试代码:

// your cypress test code
it('does something different based on the class of the button', () => {
  // RERUN THIS TEST OVER AND OVER AGAIN
  // AND IT WILL SOMETIMES BE TRUE, AND
  // SOMETIMES BE FALSE.
  cy.get('button').then(($btn) => {
    if ($btn.hasClass('active')) {
      // do something if it's active
    } else {
      // do something else
    }
  })
})

我们会随机进入 if 和 else 分支。

Server side rendering

如果 web 应用的源代码在服务器端渲染,并且不存在随后通过 JavaScript 异步修改 DOM 的可能性,这种应用是极佳的进行条件测试的备选。


load 事件发生之后,DOM 不会再发生变化,这意味着其已经达到了一个稳定的状态(a stable state of truth).

Client side rendering

对于现代 Web 应用来说,当 load 事件发生时,屏幕上通常什么都还没有渲染。JavaScript 在此时会动态加载内容,并执行渲染。

这种情况下,不可能依靠 DOM 进行条件测试,除非我们有 100% 的把握,找到某个时间点,该时间点到达时,所有的异步渲染都已经结束,并且也不存在 pending network requests, setTimeouts, intervals, postMessage, or async/await code. 所有的 web 开发者都明白这是一件不可能的事情。


即使我们的应用里使用了 Zone.js, 也没办法捕捉到所有的异步编程点。

A/B campaign

使用 url 参数,显式告诉服务器我们期望返回的数据内容:

// tell your back end server which campaign you want sent
// so you can deterministically know what it is ahead of time
cy.visit('https://app.com?campaign=A')
...
cy.visit('https://app.com?campaign=B')
...
cy.visit('https://app.com?campaign=C')

It is crucial that you understand how your application works else you will write flaky tests.

看下面这段代码:

// app code
$('button').on('click', (e) => {
  // do something synchronously randomly
  if (Math.random() < 0.5) {
    // append an input
    $('<input />').appendTo($('body'))
  } else {
    // or append a textarea
    $('<textarea />').appendTo($('body'))
  }
})

应用程序会随机的在 body 里插入 input 或者 textarea.

我们可以使用如下代码进行条件测试:

// click the button causing the new
// elements to appear
cy.get('button').click()
cy.get('body')
  .then(($body) => {
    // synchronously query from body
    // to find which element was created
    if ($body.find('input').length) {
      // input was found, do something else here
      return 'input'
    }
    // else assume it was textarea
    return 'textarea'
  })
  .then((selector) => {
    // selector is a string that represents
    // the selector we could use to find it
    cy.get(selector).type(`found the element by selector ${selector}`)
  })

在应用达到一个稳定的状态前,我们应采取措施,阻止 Cypress 进一步执行命令。


相关文章
|
16天前
|
JavaScript 前端开发 安全
在众多的测试工具中,Cypress以其强大的端到端测试能力和与TypeScript的完美结合,成为了前端开发者的首选
【6月更文挑战第11天】Cypress结合TypeScript,打造前端测试新体验。TypeScript增强代码可读性和稳定性,Cypress提供强大端到端测试,二者结合提升测试准确性和可靠性。通过类型定义、自定义命令和断言,优化测试代码;Cypress模拟真实用户操作、时间旅行功能及内置调试工具,确保应用功能性能。推荐前端开发者使用TypeScript+Cypress进行端到端测试。
43 2
|
1月前
|
测试技术 Python
cypress 和allure 集成生成测试报告
cypress 和allure 集成生成测试报告
cypress 和allure 集成生成测试报告
|
15天前
|
JavaScript 前端开发 安全
Cypress因其强大的端到端测试能力备受青睐,尤其与TypeScript结合,提升了测试的规范性和准确性。
【6月更文挑战第12天】前端开发日益复杂,测试成为保障代码质量和稳定性的关键。Cypress因其强大的端到端测试能力备受青睐,尤其与TypeScript结合,提升了测试的规范性和准确性。TypeScript使Cypress测试代码更易读、维护,通过类型定义、自定义命令和断言增强测试可靠性。Cypress能模拟真实用户操作,支持时间旅行和高效调试,全面测试前端应用功能。因此,TypeScript+Cypress是前端端到端测试的理想选择。
54 2
|
1月前
|
JavaScript 前端开发 安全
【TypeScript技术专栏】TypeScript与Cypress端到端测试
【4月更文挑战第30天】随着前端开发复杂度提升,测试成为关键环节,Cypress因其强大的端到端测试和与TypeScript的集成备受青睐。TypeScript增强了代码的可读性和维护性,确保测试准确性和可靠性。在Cypress中,TypeScript用于定义测试变量、自定义命令和断言,提高测试代码质量。Cypress的优势包括模拟真实用户操作、时间旅行功能和强大的调试工具,能有效提升测试效率和准确性。结合两者,前端开发者能实现高效、全面的端到端测试。
|
10月前
|
JavaScript 测试技术 Python
cypress自动化测试框架搭建
cypress自动化测试框架搭建
101 0
|
JavaScript 数据可视化 IDE
测试自动化工具比较:Selenium vs. Cypress
在软件开发过程中,测试自动化是一个关键的环节,它可以提高测试效率和质量,并帮助开发团队更快地交付高质量的软件。在测试自动化领域,Selenium和Cypress是两个备受关注的工具。本文将对它们进行比较,帮助开发者选择适合自己项目的测试自动化工具。
389 0
|
存储 Web App开发 JavaScript
Node.js躬行记(28)——Cypress自动化测试实践
Node.js躬行记(28)——Cypress自动化测试实践
|
前端开发 测试技术
|
JavaScript 前端开发 安全
|
7天前
|
JSON Java Maven
使用`MockMvc`来测试带有单个和多个请求参数的`GET`和`POST`接口
使用`MockMvc`来测试带有单个和多个请求参数的`GET`和`POST`接口
21 3