Доброго вечера.
Есть jest, puppeteer и связующее звено в виде jest-puppeteer. Есть список урлов (неск. десятков), которые хочется тестировать на http статус, чтобы был 200 ок. Для этого написал нужный код, который на лету генерирует для каждого урла утверждение (it). Это работает, но плохо. Приведу сразу код.
spoilerconst assertStatus = require('./status');
// cards.js
// Это тест, вызывается в index.js так: assertions.cards({ ... });
// jest настроен обрабатывать только один файл, т.е. пишу jest /tests/index.js
module.exports = cards => {
const cardsGenerator = generateCards();
describe('all cards should have 200 ok and adding to basket', () => {
jest.setTimeout(50000);
generateTests(cardsGenerator);
});
// Генерирует тесты, рекурсивно
function generateTests(generator) {
const generated = generator.next();
if(generated.done) {
return false;
}
const card = generated.value;
const testTitle = `card with type '${card.type}' and url '${card.url}' should have 200 ok`;
assertStatus(card.url, 200, testTitle);
generateTests(generator);
};
// Просто генератор, который обходит массив карточек и отдает одну за другой
function* generateCards() {
for(const card of cards) {
if(!card.type || !card.urls) {
continue;
}
for(const urlIndex in card.urls) {
const url = card.urls[urlIndex];
yield {
type: card.type,
url,
};
}
}
return null;
}
};
// assertions/status.js
const actions = require('../actions');
module.exports = (url, status = 200, testTitle = null) => {
if(!testTitle) {
testTitle = `url '${url}' should have status ${status}`;
}
return describe('assert.status', () => {
let lastResponse;
let page;
beforeAll(async () => {
page = await browser.newPage();
await page.setRequestInterception(true);
// Это просто для того, чтобы ускорить загрузку страницы, разрешаем только document реквесты
page.on('request', async request => actions.denyAllExceptDocument()(request));
[lastResponse] = await Promise.all([
page.goto(url, {
waitUntil: 'load',
}),
]);
});
it(testTitle, async () => {
await expect(lastResponse.status()).toEqual(status);
});
});
};
Проблемы следующие:
Во-первых, это все обрабатывается jest'ом пачкой и сразу. То есть, цикл проходит, и джест начинает обрабатывать все утверждения как одно - долго думает, а потом сразу выплевывает результат всех утверждений, или ошибки.
Во-вторых, это жрет много памяти и просто неудобно - ты не видишь, какое утверждение (it) сейчас проверяется.
Если отказаться от динамической генерации и накидать it в код вручную, все работает, как надо - джест выполнит it по отдельности и для каждого будет динамически в консоли показывать результат, сразу.
Если бы в доках джеста был какой-нибудь колбэк, который вызывался бы только после выполнения утверждения (it), я бы смог сгенерить новый тест в этом колбэке, но в доках такого нет.
Как быть, что делать?
Заранее спасибо.