Nano Hash - криптовалюты, майнинг, программирование

Тесты TestCafé на основе данных с авторизацией

Я написал несколько тестов с использованием циклов 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`);
    }
  });
});

Он отлично работает, так как избавляется от самой большой проблемы и продолжает выполнять тесты, даже если предыдущий не прошел. Однако это создает гораздо большую проблему. Теперь это происходит значительно медленнее, потому что он должен входить в систему каждый раз, когда проходит итерацию теста. Как видите, я уже использую роли, чтобы ускорить процесс, но это все еще довольно медленно. Я не хочу продолжать этот путь рефакторинга, если он в конечном итоге не удастся.

Есть ли способ получить лучшее из обоих миров? В идеале хотелось бы сделать следующее:

  • войдите в систему один раз в начале фиксации
  • оставаться на странице без перезагрузки
  • перебрать все соответствующие селекторы
  • продолжать итерацию, даже если отдельный тест не прошел

  • Вы нашли какое-нибудь решение? 09.09.2020

Ответы:


1

TestCafe перезагружает страницу перед каждым тестом, чтобы избежать недетерминированного поведения, вызванного взаимным влиянием тестов друг на друга. Однако существует экспериментальная и недокументированная функция, которая отключает этот механизм. В вашем случае вы можете попробовать использовать метод fixture.disablePageReloads следующим образом:

fixture `Advanced Account Manager`
  .page `https://app.wistia.io/logout`
  .disablePageReloads
  .beforeEach(async (t) => {
    await t
      .useRole(advAccountManager);
  });

Пожалуйста, используйте его на свой страх и риск.

31.01.2020
  • Спасибо за совет! Это действительно имело значение, но, к сожалению, я думаю, что это все еще слишком сильно замедлит процесс в сравнении. Вариант использования, который я пытаюсь протестировать, вероятно, всегда будет значительно быстрее, если просто перебрать селекторы внутри тестового примера, а не использовать тестовую среду для итерации, даже с учетом недостатков этого способа, потому что время - это первоочередная задача для нас. 04.02.2020

  • 2

    Другой способ - собрать селекторы всех несуществующих элементов в массив и проверить его длину.

    Например:

    import { Selector } from 'testcafe';
    
    fixture `Log all requests`
        .page`https://devexpress.github.io/testcafe/example/`;
    
    test('Test 1', async t => {
        const selectors = [
            {
                name: 'Remote testing',
                selector: Selector('label').withText('Support for testing on remote devices')
            },
            {
                name: 'Reuse JS code',
                selector: Selector('label').withText('Re-using existing JavaScript code for testing')
            },
            {
                name: 'Background parallel testing',
                selector: Selector('label').withText('Running tests in background and/or in parallel')
            }
        ];
    
        const assertions       = await Promise.all(selectors.map(async item => ({ name: item.name, exists: await item.selector.exists })));
        const nonExistingItems = assertions.filter(item => !item.exists).map(item => item.name);
    
        await t.expect(nonExistingItems.length).eql(0, `This items should exist: ${nonExistingItems.join(', ')}. `);
    });
    
    06.02.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..