В Cypress, когда использовать Custom Command vs Task? - PullRequest
1 голос
/ 03 ноября 2019

В чем разница между пользовательской командой и задачей? Я пытаюсь понять, как их следует использовать.

Документация по пользовательским командам: https://docs.cypress.io/api/cypress-api/custom-commands.html

Документация по заданию: https://docs.cypress.io/api/commands/task.html

1 Ответ

2 голосов
/ 03 ноября 2019

A команда ( большинство методов для cy объекта) - это функция, которая ставит в очередь (помещает) «действие» в очередь выполняемых в данный момент команд и выполняет serially и асинхронно (вот почему возвращаемое значение команды имеет .then метод - при этом они не являются обещаниями , даже если они ведут себя какэто). Пока предыдущая команда не закончена, следующая команда не выполняется.

Команды определяются и выполняются непосредственно в браузере (но они могут отправлять сообщения вне браузера, для этого cy.task, см. Ниже).

A customКоманда - это не более чем обычная команда, определяемая пользователем, в отличие от команд по умолчанию, которые Cypress предоставляет из коробки. Пользовательские команды полезны для автоматизации рабочего процесса, который вы повторяете в своих тестах снова и снова (например, группирование нескольких команд cy по умолчанию).

Команды используются для взаимодействия с тестируемым веб-приложением (AUT) - главным образомс DOM, например, через cy.get(selector) для запроса DOM;и делать утверждения.

Также важно понимать, что, хотя команды выполняются последовательно, они сразу ставятся в очередь, и любые выражения, которые вы передаете им, оцениваются тут же. Это не специфичное для Cypress поведение, а специфичное для JavaScript поведение. Вот почему вы не можете делать такие вещи (я часто видел эти ошибки):

let value;
cy.get('.myInput').invoke('val').then(val => value = val);
cy.get('.mySecondInput').type(value); // value is undefined here

A task - это функция, определенная и выполненная вВнутренний процесс Cypress (узел), а не в браузере.

Чтобы выполнить задачу (которую вы ранее определили в файле cypress/plugins/index.js), вам нужно сначала поставить ее в очередь как обычную команду в своем тесте через cy.task(taskName, data). Затем Cypress (когда команда выполняет свою очередь на выполнение) отправляет сообщение бэкэнд-процессу (через канал IPC - объяснено ниже), где задача выполняется.

Если ваша задача возвращает данные, этоданные сериализуются (через JSON.stringify или что-то подобное) и отправляются обратно в браузер, где они передаются обратному вызову, который вы потенциально прикованы к вашему cy.task() вызову, используя .then(callback).

В основном используются задачиобщаться с вашим собственным серверным бэкэндом, например, для заполнения базы данных;или для операций ввода-вывода, таких как чтение / запись в файл.

Насколько я знаю, нет заданий по умолчанию - каждую выполняемую задачу сначала нужно определить самостоятельно.

Другим важным моментом (как частично упомянуто выше) является то, что сообщения, которые отправляются между процессами (процесс браузера Cypress и процесс узла Cypress), отправляются через межпроцессное взаимодействие (IPC) и должны быть сериализуемыми. Это означает, что данные, которые вы передаете в cy.task(taskName, data), являются строковыми, а также ответом, возвращаемым самой задачей. Таким образом, отправка, например, объекта, содержащего метод, не будет работать (то есть метод вообще не будет передан).

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