У меня есть тесты e2e для библиотеки javascript, которая работает с элементом canvas. Это организовано следующим образом: есть страница html со списком ссылок, холстом и элементом изображения. Когда я нажимаю на ссылку в библиотеке dr aws, на холсте появляется конкретный контрольный пример и загружается изображение с ожидаемым видом. Также у меня есть скрипт node.js для автоматизации этих действий с помощью webdriverio, похожий на js (библиотека для сравнения изображений) и магнитную ленту (инфраструктура тестирования).
Теперь эта необычная часть (этот пример ниже работает как ожидается, что тесты не пройдены, если изображение отличается от холста и т. д. c.), где я беру все ссылки, сравниваю изображение и холст с похожим js и сохраняю данные (что является результатом сходства js сравнение в массиве), затем я запускаю другой l oop, где я вызываю ленту и проверяю вещи:
const links = await browser.$$('#ul li a');
const testsData = [];
for (const link of links) {
const data = await compare(link);
const testName = await link.getText();
testsData.push([testName, data]);
}
for (const [testName, data] of testsData) {
tape(testName, t => {
t.equal(data.rawMisMatchPercentage < 1, true);
t.end();
});
}
await browser.deleteSession();
Но если я попытаюсь использовать один l oop, как здесь:
const links = await browser.$$('#ul li a');
let counter = 1;
for (const link of links) {
console.log('LOOP START ' + counter);
const data = await compare(link);
const testName = await link.getText();
tape(testName, t => {
console.log('TEST START ' + counter);
t.equal(data.rawMisMatchPercentage < 1, true);
t.end();
console.log('TEST END ' + counter);
});
console.log('LOOP END ' + counter++);
}
await browser.deleteSession();
скрипт выполняется следующим образом:
- L OOP START 1 // начались действия на странице, затем было выполнено сравнение и возвращен результат
- L OOP END 1 // вызвана лента, куда-то положили обратный вызов и вернули
- L OOP START 2 // начались действия на странице (запросы были отправлены веб-драйверу), что создало свободное время для * 10 67 * сценарий, поэтому обратный вызов из первого вызова ленты может выполнить
- TEST START 1
- TEST END 1
- L OOP END 2
- L OOP START 3 // по какой-то причине действия на странице больше не позволяют выполнять предыдущие тесты, как это было на L OOP START 2
- L OOP END 3
- L OOP START 4
- L OOP END 4
- et c.
И все тесты, кроме теста 1, заканчиваются сообщением: not ok TEST_NUM test exited without ending
. Очевидно, сценарий node.js завершается без обратных вызовов ленты (кроме первого).
Я понимаю, что лента не запускает тест сразу, она принимает обратный вызов, который запускается позже, но что меня озадачивает: почему получается, что сценарий завершается, когда еще нужно выполнить обратные вызовы?
Любая подсказка очень ценится
В настоящее время я Я подозреваю, что это ошибка или что-то еще в ленточной библиотеке. Вот что происходит (что я смог исследовать): лента принимает обратные вызовы, запускает первый, сообщает о результатах, но затем не запускает оставшиеся обратные вызовы, но сообщает о том, что они «не выполнены», даже без попытки вызвать их .