Я написал несколько тестов с использованием циклов for и недавно обнаружил эту удобную страницу документации, в которой описывается, как писать тесты, управляемые данными.
https://devexpress.github.io/testcafe/documentation/recipes/create-data-driven-tests.html
Сейчас я пытаюсь провести рефакторинг своих тестов, но сталкиваюсь с проблемой. Цель теста - войти в систему как группа разных учетных записей, а затем проверить, существуют ли определенные элементы страницы. (Я понимаю, что это тяжелый молоток в использовании, но наше приложение имеет огромное количество разрешений, и комбинации часто забываются при разработке новых функций, так что это казалось самым быстрым способом получить истинную правду о том, что находится на экран для реального пользователя).
Мои старые тесты выглядят примерно так:
test('Account manager', async (t) => {
const existingItems = [
[mediaSidePanel.customize, 'Customize'],
[mediaSidePanel.stats, 'Stats'],
[mediaSidePanel.download, 'Download'],
[mediaSidePanel.delete, 'Delete'],
];
const notExistingItems = [
[mediaSidePanel.adminTools, 'Admin Tools'],
];
await t
.useRole(advAccountManager)
.navigateTo(`https://${accountKey}.wistia.io/medias/${mediaHashedID}`);
await Promise.all(existingItems.map(async item => await t
.expect(item[0].exists).ok(`${item[1]} should exist for an Account Manager`)));
await Promise.all(notExistingItems.map(async item => await t
.expect(item[0].exists).notOk(`${item[1]} should not exist for an Account Manager`)));
});
Тест работает нормально, за исключением очевидных проблем наличия циклов в тестах: мне нужны подробные диагностические сообщения, чтобы убедиться, что я знаю, какой элемент на самом деле не работает, и, что еще хуже, если что-то в начале цикла выходит из строя, тест завершается, и я нет возможности узнать, были ли последующие отказы.
Я начал пытаться реорганизовать это, вытащив все существующие / несуществующие элементы в массив, определенный в отдельном файле, и написал следующее:
import * as dataSet from '../helpers/rolePermissions';
fixture `Advanced Account Manager`
.page `https://app.wistia.io/logout`
.beforeEach(async (t) => {
await t
.useRole(advAccountManager);
});
dataSet.advAccountManager.project.forEach(data => {
test.page `https://${accountKey}.wistia.io/projects/${projectHashedID}`(`Project - ${data.name}`, async t => {
if (data.present) {
await t
.expect(await data.selector.exists).ok(`${data.name} should exist for an Account Manager`);
}
else {
await t
.expect(await data.selector.exists).notOk(`${data.name} should not exist for an Account Manager`);
}
});
});
Он отлично работает, так как избавляется от самой большой проблемы и продолжает выполнять тесты, даже если предыдущий не прошел. Однако это создает гораздо большую проблему. Теперь это происходит значительно медленнее, потому что он должен входить в систему каждый раз, когда проходит итерацию теста. Как видите, я уже использую роли, чтобы ускорить процесс, но это все еще довольно медленно. Я не хочу продолжать этот путь рефакторинга, если он в конечном итоге не удастся.
Есть ли способ получить лучшее из обоих миров? В идеале хотелось бы сделать следующее:
- войдите в систему один раз в начале фиксации
- оставаться на странице без перезагрузки
- перебрать все соответствующие селекторы
- продолжать итерацию, даже если отдельный тест не прошел