赛普拉斯 - 如何按顺序运行测试文件

Posted

技术标签:

【中文标题】赛普拉斯 - 如何按顺序运行测试文件【英文标题】:Cypress - How can I run test files in order 【发布时间】:2020-03-15 03:22:32 【问题描述】:

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

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


假设我在聊天应用测试中有 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');
    );
);

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');
    );
);

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 messageenter');
        // Check the message
        cy.get('.message-list')
            .should('contain', 'Hey I\'m a test message');
    );
);

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

我不知道这是否正确。

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

【问题讨论】:

【参考方案1】:

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

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


  "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",
    //...
  ]

不需要文件编号:D

【讨论】:

这将非常有用。我可以摆脱数字。 注意这一点:这(任何测试排序的任何方法)是功能工作方式的副产品。 testFiles 的目的是仅包含某些规格,而不是用于订购。这恰好是它在内部工作的方式,并且可能会或可能不会永远继续工作,因为赛普拉斯没有声称它会以这种方式工作。 这样做的缺点是每个新的测试文件都必须手动添加到cypress.json 如果您使用* 模式并以这样的方式存储您的测试,那么所有不明确的测试最终仍会执行【参考方案2】:

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

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

等等

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

【讨论】:

【参考方案3】:

Jean Lescure 的回答是救命稻草。我们需要根据优先级运行测试,而不需要一堆重复的测试或符号链接。以下内容在我们的默认 cypress 配置文件中为我们工作:

  "integrationFolder":"cypress/integration",
  "testFiles": [
    "high_priority_specs/**/*.js",
    "medium_priority_specs/**/*.js",
    "low_priority_specs/**/*.js"
  ]

为了更改优先级,我们使用了 3 个使用 cypress --configFile 参数加载的配置文件。为了运行更高优先级的测试(仅限烟雾测试),我们使用了以下内容:

  "integrationFolder":"cypress/integration",
  "testFiles": [
    "high_priority_specs/**/*.js"
  ]

【讨论】:

谢谢!作为参考,这些文件夹名称是相对于tests/e2e/specs 的/子级的,因此在 Peter Drinnan 的示例中,测试可能会组织为:tests/e2e/specs/medium_priority_specs/<various_test_files>.jstests/e2e/specs/high_priority_specs/<various_test_files>.js【参考方案4】:

赛普拉斯不会故意让您这样做,并且有充分的理由:

    这通常表示测试设计不佳。测试不应依赖于彼此的状态。任何测试都应该能够独立于测试套件的其余部分而成功运行。 您将永远无法利用 cypress' built in ability to run tests in parallel,因为您无法保证一个规范会在另一个规范中运行

这里有一个更详细的相关讨论:https://github.com/cypress-io/cypress/issues/390

但是,如果您决定这样做,您可以通过在规范名称前加上一个数字来做到这一点:

01-some-spec.js
02-alphabetically-first-spec.js
03-some-other-spec.js

【讨论】:

我正在为一个聊天应用编写测试,所以像“先登录然后开始聊天”这样的情况,有点挑战。我不想要大代码块,我想要小文件中的小代码块。我通过进口发现了这一点,但这似乎不对。 我在测试中所做的是编写一个使用cy.request() 登录的自定义命令,然后在before() 块中调用我的cy.login() 命令。这就是您应该如何设置状态以避免依赖特定的测试执行顺序。

以上是关于赛普拉斯 - 如何按顺序运行测试文件的主要内容,如果未能解决你的问题,请参考以下文章

如何通过将赛普拉斯指定为项目来运行特定的测试文件夹?

如何将环境变量添加到服务器,由赛普拉斯测试运行?

如何将赛普拉斯的测试运行程序的“控制台日志”(左侧)保存到文件中

如何使用赛普拉斯测试文件输入?

赛普拉斯:只运行一项测试

赛普拉斯在多项测试中冻结