Динамически создавать тесты с помощью cy.task - PullRequest
1 голос
/ 23 октября 2019

Я хотел бы создать идентичные тесты с переменными данными в Cypress. Идея заключается в том, что тестеры могут создавать новые папки в папке fixtures, и эти папки будут автоматически подбираться и использоваться для генерации новых тестов.

Я создал этот фрагмент в моем plugins/index.js. Когда вызывается cy.task('getAllDirectories', 'someURL'), он выдаст мне список всех подкаталогов внутри someURL.

const { readdirSync, lstatSync } = require('fs');
const { join } = require('path');
const _ = require('lodash');

const isDirectory = source => lstatSync(source).isDirectory();

module.exports = (on, config) => {
  on('task', {
    getAllDirectories(source) {
      const fullSource = `${process.cwd()}/cypress/${source}`;

      return readdirSync(fullSource)
        .map(name => join(fullSource, name))
        .filter(isDirectory)
        .map(name => _.last(name.split('/')));
    },
  });
};

Кажется, это работает нормально, мне удалось успешно вызвать его внутри it()и before() в кипарисе. Проблема, однако, заключается в том, что, поскольку эти динамически генерируемые тесты являются единственными в этом файле, этот код в моем контексте вообще не запускается.

let TESTS = [];

  before(() => {
    cy.task('getAllDirectories', '').then((output) => {
      TESTS = output;
      cy.log(TESTS);
    });
  });

Даже когда я добавляю фиктивный тест, такой как it('dummy', () => {})переменная TESTS установлена ​​в новый массив имен, но уже слишком поздно для генерации тестов, когда я пытаюсь выполнить итерации ниже метода before.

TESTS.forEach((TEST) => {
    it(`Validates request: ${TEST}`, () => {
      ...

Поэтому я решил, что мне нужно вызвать cy.taskвне теста или before хука, однако, помещая его только внутри context(), говорится, что cy.task должен быть запущен внутри теста.

1 Ответ

1 голос
/ 29 октября 2019

Хорошо, у меня было почти подобное требование, как я сказал в комментарии. И я обнаружил, что в кипарисе нет прямого способа сделать это.

Так что я сделал это косвенным путем, но все же цель может быть достигнута, может быть, не на 100% хорошее решение.

Iсделал скрипт, который собирает необходимую информацию и экспортирует данные в формате json в cypress/fixtures. Я напишу шаги в виде псевдо-кода:

Let say file named: load-test-data.ts

1. Search for all spec files in my project
2. Find directory having data in each spec file's directory
3. Build object of information which contains:
  {
     [specFilePath]: {
       componentName,
       data,
     }
  }
where 'data' is data for which I want to generate tests.
4. Generate JSON and save in cypress/fixtures/test-data.json

Затем в моей тестовой утилите (которая генерирует тесты)

describe('Should test component', () => {

  const path = Cypress.spec.relative;
  const fixtureData = require('../../../cypress/fixtures/test-data.json');

  const info = fixtureData[path];

  info.data.forEach((datum) => {
    it(`Should pass test for ${datum}`, () => {
      cy.visit(`http://localhost:9001/?page=${datum}`); // this is not real, just for demo purpose!!

      // and do something more
    });
  });

});

А затем, когда я хочу запустить Cypress, я делаю:

#!/usr/bin/env bash

# Generate fixture which will contain test-data to generate tests
./node_modules/.bin/ts-node  load-test-data.ts

# Run cypress
./node_modules/.bin/cypress run

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...