Здравствуйте!
В Части 5 этой серии статей мы добавили отчеты о тестировании Mochawesome в нашу платформу автоматизации тестирования. В этой статье мы добавим несколько оставшихся вещей, таких как поддержка нескольких сред, улучшенный запуск команд, добавление журналов отчетов (с помощью addContext()) и поддержка XPath.
Alles klar, lass uns anfangen!
Добавление поддержки нескольких сред
Часто нам нужно запускать наши наборы тестов в разных средах; скажем, при слиянии PR мы можем проверять изменения в среде Staging или Dev, и как только будет принято решение о выпуске, мы можем проверить изменения в более стабильной среде, такой как QA или среда, подобная prod.
В этом сценарии мы хотели бы запустить тесты, которые мы запускали в ходе нашей разработки, и было бы целесообразно написать наши тесты творчески, так, чтобы они требовали минимальных изменений для запуска наших тестов в различных средах.
Что следует учитывать при запуске тестов в нескольких средах:
– URL-адреса
– Роли и учетные данные пользователей (тестовые данные)
– Версия программного обеспечения или доступность функций
Мы собираемся использовать Cypress Configuration для достижения этой цели. Давайте сначала создадим 2 разных файла .JSON в каталоге /cypress/config/, которые будут содержать данные о нашей среде, которые мы будем называть наши среды DEV и QA.
Давайте добавим свойство с именем baseUrl в оба этих файла .JSON:
Прежде чем наш фреймворк сможет прочитать эти файлы, мы должны дать ему понять, где найти файл конфигурации, для этого нам нужно выполнить следующую строку кода в /cypress/plugins/index.js
const pathToConfigFile = path.resolve("cypress/config", `${env}.config.json`);
const fs = require('fs-extra');
const path = require('path');
const cucumber = require('cypress-cucumber-preprocessor').default;
module.exports = (on, config) => {
on('file:preprocessor', cucumber());
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config
function getConfigurationByFile(env) {
const pathToConfigFile = path.resolve("cypress/config", `${env}.config.json`);
return fs.readJson(pathToConfigFile);
}
//if no environment is provided, then PR env will be default
const env = config.env.configFile || "qa";
return getConfigurationByFile(env);
};
Теперь, чтобы запустить наши тесты на основе любой из этих сред, мы просто добавим флаг configFile, которому предшествует ключевое слово — env.
node runner.js cypress run --env configFile=dev
больше о различных типах использования файла конфигурации можно найти ЗДЕСЬ.
Также в коде клея кипариса мы должны сделать 1 последнее изменение флага configFile, которому предшествует ключевое слово — env.
Пока что мы нигде не используем файлы конфигурации env, поэтому в пользовательском интерфейсе stepDefinitions.js; мы собираемся заменить полноценный URL-адрес на '/'после этого наш код получит baseUrl из *.config.json. > файл
//changes in stepDefinitions.js
Given('I open the Google web url', () => {
cy.visit('/'); //replaced "https://www.google.com with '/'
});
Теперь на основе аргумента configFile значение baseUrl будет переключено на https://www.google.com. >» или https://www.google.co.in.
Теперь, когда у нас есть поддержка нескольких сред, имеет смысл организовать наши тестовые прогоны на основе этих сред для лучшей видимости. Поэтому для достижения этого мы внесем изменения в наш runner.js, добавив механизм для определения того, какую среду будет использовать наш тестовый запуск, на основе аргумента configFile
//mechanism to identify which environment is being used
...
// get environment from args..
const environment = getEnvironment(args);
...
// identify an environment; default is "qa"
function getEnvironment(args){
let environment;
if(args.env){
if(args.env === true){
// if --env flag is passed from CLI but without following any arguments
environment = "qa";
return "qa";
}
const getEnv = args.env.split(",");
getEnv.map((curr, index) => {
const envProperty = curr.split("=");
if(envProperty[0] === 'configFile'){
environment = envProperty[1];
}
// if --env flag is passed from CLI, but doesn't contain any 'configFile' argument
if(index >= getEnv.length && environment === undefined){
environment = "qa";
}
})
return environment;
} else{
// if no --env flag is passed from CLI
environment = "qa";
return "qa";
}
}
а затем замените все существующие пути к файлам в runner.js, что выглядит так:
«отчеты/Тестовый запуск -»с«отчеты/» + среда + «/» + «Тестовый запуск -»
Это все, что нам нужно сделать. После этого изменения наш каталог /reports будет выглядеть следующим образом:
Вандербар!!
Создание команд Better Run, также известных как Run Scripts
На данный момент наша полномасштабная команда запуска выглядит следующим образом:
node runner.js cypress run --env configFile=dev TAGS="@UI"
это много ключевых слов, если вы спросите кого-нибудь. Мы собираемся оптимизировать эти команды, используя скрипты package.json.
мы можем написать сценарий запуска для среды DEV как cy:test:dev для полной строки:
node runner.js cypress run — env configFile=dev
//package.json run scripts "scripts": { ... "cy:test:dev": "node runner.js cypress run --env configFile=dev", "cy:test:qa": "node runner.js cypress run --env configFile=qa" },
Теперь, чтобы запустить эти скрипты, мы выполняем следующую команду:
npm run cy:test:dev
или, если нам нужно предоставить какие-либо дополнительные аргументы — env, мы можем добавить их, как показано ниже, верно? Но нет, следующее не будет работать:
npm run cy:test:dev TAGS="@UI" //
TAGS part won't work
С этим подходом есть только одна проблема, то есть мы должны предоставить все аргументы — env в одном месте, разделенные запятой, как показано ниже:
//
grouping together different type of — env arguments, separated by commanode runner.js cypress run --env configFile=dev,TAGS="@UI"
Добавление журналов отчетов:
В наших отчетах Mochawesome, отчетах, которые мы видели до сих пор, содержится информация о том, пройден или нет тестовый сценарий или причина отказа.
Теперь, что мы хотели бы, чтобы в наших отчетах было больше информации о регистрации, например:
- Гибкость для добавления информации журнала по мере необходимости в нашем тестовом выполнении.
- Статус каждого шага теста Сценария и продолжительность выполнения этого шага
Для достижения целей ведения журнала отчетов мы будем использовать addContext(); предоставлено Mochawesome.
Гибкость добавления информации журнала по мере необходимости в нашем тестовом выполнении:
Мы напишем несколько Cypress Custom Commands вместо того, чтобы использовать их непосредственно в нашем коде. Итак, мы собираемся создать наши команды в cypress/support/commands.js.
const addContext = require('mochawesome/addContext');
Импорт addContext из Mochawesome
После импорта addContext() из Mochawesome создайте команду
//Following command logs only subject in Report file Cypress.Commands.add("reportLog", (context) => { cy.once("test:after:run", (test) => addContext({ test }, context)) }); //Following command logs only Context,Value as KEY-VALUE in Report file Cypress.Commands.add("reportLogKV", (context, value) => { cy.once("test:after:run", (test) => addContext({ test }, { title: context, value: value })) });
Теперь используем 2 команды, которые мы добавили в cypress/support/commands.js.
//
using addContext from custom commands inside stepDefinition classes
cy.reportLog("This is Subject");
cy.reportLogKV("This is key!","This is value!");
Они будут показаны в конце тестового запуска в Отчете о выполнении следующим образом:
Статус каждого шага теста Сценария и продолжительность выполнения этого шага:
Поскольку наши тестовые наборы — это тестовые наборы BDD, было бы неплохо увидеть подробности выполнения каждого шага теста в отчете о выполнении:
Чтобы получить подробную информацию о выполнении каждого шага, мы должны использовать состояние Cypress window.testState.
Мы добавим этот код для поддержки статуса шага в событии Cypress test:after:run в файле cypress/support/index.js.
... const addContext = require('mochawesome/addContext'); ... //Runs after a test completes Cypress.on('test:after:run', (test, runnable) => { ... let scenarioName = window.testState.currentScenario.name; let stepResult = window.testState.stepResults; window.testState.scenarioSteps[scenarioName].forEach(function(currStep,index) { addContext({ test }, { title: currStep.keyword + " " + currStep.text, value: stepResult[index].status + " " + stepResult[index].duration }) }); ...
Как только этот код будет добавлен в cypress/support/index.js, он будет запускаться после каждого теста и будет добавлять детали выполнения шагов BDD в рамках теста, как показано ниже:
Несмотря на то, что Mochawesome прямо сейчас ограничивает отображение reportLogs в наших отчетах, мы надеемся, что в будущем Mochawesome позволит нам интегрировать код HTML вaddContext(), чтобы мы могли видеть эту информацию в лучший визуальный формат
Добавление поддержки XPath:
Чтобы иметь поддержку x-path в нашей структуре, мы будем полагаться на Cypress-Xpath
npm install cypress-xpath --save-dev
Включить cypress-xpath
в cypress/support/index.js
require('cypress-xpath')
добавление импорта в cypress/support/index.js
Чтобы использовать XPATH в нашей структуре, мы добавим новый локатор XPATH в pages/HomePage/element.js.
//adding xpath locator in pages/HomePage/element.js
SEARCH_TXTBOX_XPATH: "//input[contains(@name,'q')]"
Теперь в наших pages/HomePage/HomePage.js мы заменимSEARCH_TXTBOX на SEARCH_TXTBOX_XPATH в функции typeInSearchTxtBox(). как показано ниже:
//Using XPATH locator in page object ... typeInSearchTxtBox(value) { return cy.xpath(elements.HOMEPAGE.SEARCH_TXTBOX_XPATH).type(value); }
Дас ист все.
В этой серии статей мы создали платформу автоматизации тестирования на базе Cypress.io. Это был забавный и познавательный опыт создания вещей в рамках этой серии статей. Я буду продолжать добавлять новые вещи в эту структуру и буду продолжать каталогизировать вещи в этом пространстве. Прост!
Вперед!
Репозиторий GitHub: https://github.com/far11ven/Cypress-TestFramework/tree/develop/Part 06
Первоначально опубликовано на https://kushalbhalaik.xyz/blog 9 октября 2020 г.