TestCafe: создавать тесты с использованием данных от клиента?

Используя TestCafe [1], я хотел бы сделать следующее:

  1. Перейдите к URL-адресу.
  2. Выполните клиентский JavaScript, чтобы получить список других URL-адресов.
  3. Создайте тест для каждого URL.
  4. Выполняйте тесты одновременно.

Рабочий пример, который использует один тест и выполняется последовательно

Приведенный ниже сокращенный тестовый пример работает, но это не совсем то, что мне нужно, он выполняет следующее:

  1. Выполните тест.
  2. Перейдите к URL-адресу в ловушке «до» теста.
  3. Выполните клиентский JavaScript, чтобы получить список URL-адресов в ловушке «до» теста.
  4. Выполните утверждения для каждого URL последовательно в теле теста.

Мой тестовый файл, запускаемый через TestCafe, содержит следующее:

import { ClientFunction, Selector } from 'testcafe';

const getSiteMapFromClientSide = ClientFunction(
  () =>
    new Promise(resolve => {
      // this example looks like it could be synchronous, or that the data could
      // be defined in the test but this data comes from an async source which
      // is only reachable client side.
      resolve(['https://localhost:6007/some/url1', 'https://localhost:6007/some/url2']);
    })
);

fixture('Storybook').page('https://localhost:6007');

const modalError = Selector('#error-message');

test.before(async t => {
  t.ctx.siteMap = await getSiteMapFromClientSide();
})('Smoke Test all Stories for Full Screen Errors or Blank Screens', async t => {
  // assert we have URLs or we'll have a passing suite that looped over nothing
  await t.expect(t.ctx.siteMap.length > 0).ok('Site Map is Empty');
  // assert each story has no full screen error message
  await Promise.all(
    t.ctx.allStories.map(async url => {
      await t
        .navigateTo(url)
        .expect(modalError.exists && modalError.visible)
        .notOk(`Full Screen Error found at ${url}`);
    })
  );
});

Контекст

В реальном приложении я пишу дымовые тесты для Storybook [2]. Чтобы получить список всех URL-адресов, мне нужно вызвать результат require('@storybook/react').getStorybook(), который доступен только в клиентском приложении Storybook во время выполнения. Я исключил эти детали из сокращенного тестового примера, поскольку они не имеют ничего общего с TestCafe.

[1] http://devexpress.github.io/testcafe [2] https://storybook.js.org


person Jamie Mason    schedule 08.11.2018    source источник


Ответы (1)


Думаю, лучше разделить вашу задачу на две части. Во-первых, вам нужно получить все проверенные URL-адреса через ClientFunction и сохранить эти URL-адреса где-нибудь (например, в глобальную переменную), используя первый тестовый файл. Затем запустите новую задачу TestCafe с параметром concurrency и установите параметр src для вашего второго тестового файла. Лучший способ сделать это - использовать функцию createTestCafe. Также прочтите следующую статью http://devexpress.github.io/testcafe/documentation/using-testcafe/programming-interface/createtestcafe.html

person Alex Kamaev    schedule 12.11.2018
comment
как сохранить его в глобальной переменной в первом тестовом файле и использовать в другом? - person Prr; 14.01.2020
comment
Я добавил образец к своему ответу на основе Статья о создании помощников в вашем вопросе Как разделить глобальную переменную между тестовыми файлами из теста в TestCafe? - person Alex Skorkin; 15.01.2020