赛普拉斯 - 如何按顺序运行测试文件
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>.js
tests/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()
命令。这就是您应该如何设置状态以避免依赖特定的测试执行顺序。以上是关于赛普拉斯 - 如何按顺序运行测试文件的主要内容,如果未能解决你的问题,请参考以下文章