Тесты, управляемые данными, довольно просты, один обобщенный шаблон -
const arrayOfTestData = [...];
const arrayOfExpectedResults = [...];
const functionContainingSingleTest = (dataItem, index) => {
// Commands that use dataItem, and check arrayOfExpectedResults[index]
}
arrayOfTestData.forEach((dataItem, index) =>
functionContainingSingleTest(dataItem, index)
);
// After loop, reached before commands finish.
Что происходит, когда ваша очередь тестов находится в командах внутри функции, как если бы вы написали их последовательно.
Если вы хотите собрать результаты, это становится более сложным, поскольку команды не возвращают пригодное для использования значение. Вы можете попробовать связать .then(result => results.push(result))
, но проблема в том, что любой код, внешний по отношению к l oop, который использует массив результатов, скорее всего, запустит до того, как последовательность команд завершится.
Один из способов - установить псевдоним Cypress на конце l oop и дождаться его.
Проверка
describe('Data-driven tests', () => {
it('should wait for results', () => {
const arrayOfTestData = [1,2,3];
const results = [];
const functionContainingSingleTest = (dataItem, index) => {
cy.visit('app/data-driven.html');
cy.get('input').type(dataItem);
cy.get('input').invoke('val')
.then(result => {
results.push(result[0]);
});
if (index === arrayOfTestData.length -1) {
// Note, the following line executes before all tests finish,
// but is just queueing a command, which will run after
// all the tests have completed
cy.wrap(true).as('done');
}
}
arrayOfTestData.forEach((dataItem, index) =>
functionContainingSingleTest(dataItem, index)
);
// After loop, reached before commands finish.
console.log(results); // outputs []
// Wait for the signal
cy.get('@done').then(_ => {
console.log(results); // outputs ["1", "2", "3"]
});
})
})
приложение / управляемый данными. html
<input />