Cypress - 如何按顺序运行测试文件

Wou*_*ouX 20 automated-tests cypress

当我按下“运行所有规格”按钮或使用运行赛普拉斯中所有文件的运行命令时,它会按字母顺序运行所有测试文件,所以我不想要那样。

我想用我自己的规则对它们进行排序。


假设我在聊天应用程序测试中有 3 个步骤。

  1. 可以连接聊天应用
  2. 可以连接聊天
  3. 用户是否可以发送消息

我想测试每一步,而不是相互绑定。我的意思是,测试自己的功能之一。我做的是如下

chat_app_connect.spec.js

describe('Server Connecting Test', () => {
    it('Visit Server page', () => {
        cy.visit('https://chat.page..');
    });

    it('Check welcome messages', () => {
        cy.contains('Live Support');
        cy.contains('Hello, Stranger');
    });

    it('Check URL and status of circle', () => {
        // URL
        cy.url()
            .should('include', '/hello');
        // Status Circle    
        cy.get('circle')
            .should('have.class', 'positive');
    });
});
Run Code Online (Sandbox Code Playgroud)

chat_connect.spec.js

import './chat_app_connect.spec.js';

describe('Chat Connecting Test', () => {
    it('Type customer name', () => {
        cy.get('input')
            .clear()
            .type('E2E Test');
    });
    it('Click to the submit button', () => {
        cy.get('.submit-button')
            .click();
    });
    it('Check URL and status of circle', () => {
        // URL
        cy.url()
            .should('equal', 'https://client.dev.octopus.chat/');
        // Status Circle
        cy.get('circle', { timeout: 5000 })
            .should('have.class', 'positive');
    });
});
Run Code Online (Sandbox Code Playgroud)

chatting.spec.js

import './chat_connect.spec.js';

describe('Chatting Tests', () => {
    it('Type a test message then press Enter and check the message if it sent', () => {
        // Type
        cy.get('#chat-message')
            .clear()
            .type('Hey I\'m a test message{enter}');
        // Check the message
        cy.get('.message-list')
            .should('contain', 'Hey I\'m a test message');
    });
});
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,每个测试都是相互关联的,这意味着当我尝试仅测试 catting 功能时,它会调用每个测试,并且将测试整个测试。

我不知道这是不是正确的方法。

在这种情况下我应该怎么做或者这是一种可以接受的方式

Jea*_*ure 31

我有一个特殊的情况,我启动一个应用程序的多个实例,而不是使用固定装置或测试数据,我只是将用户反馈集成为从转发登录开始的赛普拉斯测试。

无论如何,我使用testFiles配置来cypress.json设置规范文件运行顺序:

{
  "baseUrl": "http://localhost:5000",
  "testFiles": [
    "login/*.js",
    "leads/new-lead.spec.js",
    "leads/leads-list.spec.js",
    "leads/lead-detail.spec.js",
    "leads/lead-modify.spec.js",
    //...
  ]
}
Run Code Online (Sandbox Code Playgroud)

不需要文件编号:D

  • 请注意:这(任何测试排序方法)是功能工作方式的副产品。“testFiles”的目的是仅包含某些规格,而不是用于订购。这恰好是它内部的工作方式,并且可能会也可能不会永远继续工作,因为 Cypress 并不声称它会以这种方式工作。 (6认同)
  • 如果您使用“*”模式,并以所有那些不显式的测试最终仍然执行的方式存储测试,这并不是一个缺点 (4认同)
  • 这将非常有用。我可以摆脱数字。 (2认同)

alc*_*eoh 10

最简单的解决方案是最有可能为所有测试文件添加前缀,例如:

  • 01-chat_app_connect.spec.js
  • 02-chat_connect.spec.js

等等。

Cypress 将按字母顺序获取这些文件,您可以通过使用数字作为前缀来“欺骗”您想要的行为。


Bre*_*dan 6

Cypress 并不是故意让您这样做的,并且有充分的理由:

  1. 这通常表明测试设计不佳。测试不应依赖于彼此的状态。任何测试都应该能够独立于测试套件的其余部分而成功运行。
  2. 您将永远无法利用cypress 内置的并行运行测试功能,因为您无法保证一个规范将在另一个规范之后运行

以下是有关此问题的更详细的相关讨论: https://github.com/cypress-io/cypress/issues/390

但是,如果您决定无论如何都要这样做,您可以通过在规范名称前加上一个数字来实现:

01-some-spec.js
02-alphabetically-first-spec.js
03-some-other-spec.js
Run Code Online (Sandbox Code Playgroud)

  • 我在测试中所做的是编写一个使用“cy.request()”登录的自定义命令,然后在“before()”块中调用我的“cy.login()”命令。这就是您应该如何设置状态以避免依赖特定的测试执行顺序。 (3认同)

Pet*_*nan 6

让·莱斯库尔的回答是救星。我们需要根据优先级运行测试,而不需要一堆重复的测试或符号链接。以下内容在我们的默认 cypress 配置文件中对我们有用:

  "integrationFolder":"cypress/integration",
  "testFiles": [
    "high_priority_specs/**/*.js",
    "medium_priority_specs/**/*.js",
    "low_priority_specs/**/*.js"
  ]
Run Code Online (Sandbox Code Playgroud)

为了更改优先级,我们使用了 3 个配置文件,这些文件是通过 cypress --configFile 参数加载的。为了运行更高优先级的测试(仅限冒烟测试),我们使用了以下命令:

  "integrationFolder":"cypress/integration",
  "testFiles": [
    "high_priority_specs/**/*.js"
  ]
Run Code Online (Sandbox Code Playgroud)