Template в Robot Framework
Введение | |
Test Template Setting | |
Data-driven Style | |
Именованные столбцы | |
Аргументы встроенные в имя ключевого слова | |
Похожие статьи |
Введение
Шаблоны тестов преобразуют обычные тестовые наборы, управляемые ключевыми словами, в тесты, управляемые данными.
В то время как тело тестового набора, управляемого ключевыми словами, строится из ключевых слов и их возможных аргументов,
тестовые наборы с шаблоном содержат только аргументы для ключевого слова шаблона.
Вместо многократного повторения одного и того же ключевого слова для каждого теста и/или для всех тестов в файле можно использовать его только для каждого теста или только один раз для каждого файла.
Ключевые слова, используемые в качестве шаблона, могут принимать как обычные позиционные, так и именованные аргументы, а также
аргументы, встроенные в название ключевого слова
.
В отличие от других настроек, невозможно определить шаблон с помощью переменной.
Основное использование
То, как ключевое слово, принимающее обычные позиционные аргументы, может быть использовано в качестве шаблона, проиллюстрировано следующими примерами тестов. Эти два теста функционально полностью идентичны.
официальная документация
То, что тест-кейс использует шаблон можно указать с помощью настройки тест кейса [Template] после объявления имени тест-кейса.
*** Test Cases *** Normal test case Example keyword first argument second argument Templated test case [Template] Example keyword first argument second argument Another templated test case [Template] Example keyword first argument second argument
Test Template
Если все тест-кейсы в тестовом наборе (Test Suite) используют один и тот же шаблон, можно указать его
в разделе
*** Settings ***
с помощью Test Template
*** Settings *** Test Template Example keyword *** Test Cases *** Templated test case first round 1 first round 2 second round 1 second round 2 third round 1 third round 2 Another templated test case first round 1 first round 2 second round 1 second round 2 third round 1 third round 2
В этом примере не пришлось два раза писать [Template]. Использовать или не использовать Test Template обычно
решают на основе конкретной архитектуры тестов.
Пример, совмещающий в себе применение Test Template и
встроенные в имя ключа аргументы
(Embedded Arguments), вы можете изучить
здесь
Подходы к написанию тестов
Шаблоны - это инструмент для Data-driven тестирования. Чтобы понять суть этого подхода обычно объясняют его отличия от Keyword-driven тестирования.
Keyword-driven Style
Тесты рабочего процесса, такие как, например описанный
здесь
позитивный тест входа в систему,
создаются на основе нескольких ключевых слов и их возможных аргументов.
Их обычная структура заключается в следующем:
-
Сначала система переводится в исходное состояние
- Open Browser To Login Page в примере Valid Login
-
Затем с системой что-то делается
- Вводится имя пользователя - Input Username
- Вводится пароль - Input Password
- Отправляются учетные данные - Submit Credentials
-
И, наконец, проверяется, что система ведет себя должным образом
- Страница приветствия должна быть открыта - User Page Should Be Open
Data-driven Style
Другим стилем написания тест-кейсов является подход, основанный на данных, при котором в тест-кейсах
используется только одно ключевое слово более высокого уровня, часто создаваемое как пользовательское ключевое слово,
которое скрывает фактический рабочий процесс тестирования.
Эти тесты очень полезны, когда необходимо протестировать один и тот же сценарий с разными входными и/или выходными данными.
Можно было бы повторять одно и то же ключевое слово в каждом тесте, но функциональность шаблонов позволяет указать
ключевое слово для использования только один раз.
официальная документация
Пример
Пример с использованием шести отдельных тестов, разница между которыми только в названии и аргументах, которые передаются в шаблон. В этом примере используется Test Template и именованные столбцы. Для имитации незаполненного поля используем специальную переменную ${EMPTY}
*** Settings *** Test Template Login with invalid credentials should fail *** Test Cases *** USERNAME PASSWORD Invalid User Name invalid ${VALID PASSWORD} Invalid Password ${VALID USER} invalid Invalid User Name and Password invalid invalid Empty User Name ${EMPTY} ${VALID PASSWORD} Empty Password ${VALID USER} ${EMPTY} Empty User Name and Password ${EMPTY} ${EMPTY}
Присвоение столбцам имен, как в примере выше, облегчает понимание тестов.
Это возможно потому, что в строке заголовка
игнорируются
все ячейки, кроме первой.
Приведенный выше пример содержит шесть отдельных тестов, по одному для каждой недопустимой комбинации пользователя и пароля.
Приведенный ниже пример иллюстрирует, как провести только один тест со всеми комбинациями. Такой же подход + встроенные
в имя ключа аргументы мы уже использовали
здесь
При использовании тестовых шаблонов все раунды теста выполняются даже при наличии сбоев, поэтому реальной функциональной
разницы между этими двумя стилями нет.
В приведенном выше примере отдельные комбинации названы так, чтобы было легче увидеть, что они тестируют, но потенциально
большое количество этих тестов может привести к искажению статистики.
Какой стиль использовать, зависит от контекста и личных предпочтений.
*** Test Cases *** Invalid Password [Template] Login with invalid credentials should fail invalid ${VALID PASSWORD} ${VALID USER} invalid invalid whatever ${EMPTY} ${VALID PASSWORD} ${VALID USER} ${EMPTY} ${EMPTY} ${EMPTY}
Именованные столбцы
Применим подход с именованными столбцами к тесту из моего демо проекта
*** Settings *** Documentation Flasky App Login DD Test Resource users/users.resource Suite Setup Setup Suite Force Tags ui login Test Template Submiting credentials should forward to page with title *** Variables *** *** Keywords *** Create Unique User &{unique_user}= Generate Unique User Set Suite Variable ${unique_user} Setup Suite Create Unique User Register User user=${unique_user} # To reduce variable names two new # variables are created here ${VALID USER}= Set Variable ${unique_user.username} Set Suite Variable ${VALID USER} ${VALID PASSWD}= Set Variable ${unique_user.password} Set Suite Variable ${VALID PASSWD} Test Setup Tasks Start Chromium Browser Test Teardown Tasks Close Browser Submiting credentials should forward to page with title [Arguments] ${username} ${password} ${expected_title} Open Browser To Login Page Log ${username} Log ${password} Input Username ${username} Input Password ${password} Submit Credentials ${title}= Get Title Log ${title} Should Be Equal ${title} ${expected_title} *** Test Cases *** USERNAME PASSWORD EXPECTED TITLE Valid Credentials ${VALID USER} ${VALID PASSWD} User Information - Demo App Invalid User Name invalid ${VALID PASSWD} Login Failure - Demo App Invalid Password ${VALID USER} invalid Login Failure - Demo App Invalid User Name and Password invalid invalid Login Failure - Demo App Empty User Name ${EMPTY} ${VALID PASSWD} Log In - Demo App Empty Password ${VALID USER} ${EMPTY} Log In - Demo App Empty User Name and Password ${EMPTY} ${EMPTY} Log In - Demo App Empty User Name Invalid Password ${EMPTY} invalid Log In - Demo App Invalid User Name Empty Password invalid ${EMPTY} Log In - Demo App
Аргументы встроенные в имя ключевого слова
Рассмотрим пример шаблона, в котором аргументы встроены в само название ключевого слова.
Из
официальной документации
можно узнать, что
шаблоны поддерживают вариацию
синтаксиса встроенных аргументов
.
В шаблонах этот синтаксис работает таким образом,
что если ключевое слово Template содержит переменные в своем названии,
они считаются заполнителями аргументов и заменяются фактическими аргументами,
используемыми в шаблоне.
Результирующее ключевое слово затем используется без позиционных аргументов.
Лучше всего это проиллюстрировать на примере:
*** Keywords *** The result of ${calculation} should be ${expected} ${result} = Calculate ${calculation} Should Be Equal ${result} ${expected} *** Test Cases *** Normal test case with embedded arguments The result of 1 + 1 should be 2 The result of 1 + 2 should be 3 Template with embedded arguments [Template] The result of ${calculation} should be ${expected} 1 + 1 2 1 + 2 3
Когда встроенные аргументы используются с шаблонами, количество аргументов в имени ключевого слова шаблона должно
соответствовать количеству аргументов, с которыми оно используется.
Однако имена аргументов не обязательно должны совпадать с аргументами исходного ключевого слова, и
также возможно использовать совершенно разные аргументы:
*** Test Cases *** Different argument names [Template] The result of ${foo} should be ${bar} 1 + 1 2 1 + 2 3 Only some arguments [Template] The result of ${calculation} should be 3 1 + 2 4 - 1 New arguments [Template] The ${meaning} of ${life} should be 42 result 21 * 2
Основное преимущество использования встроенных аргументов с шаблонами заключается в том, что имена
аргументов указываются явно.
При использовании обычных аргументов похожего эффекта можно достичь, присвоив имена столбцам, содержащим аргументы.
Это проиллюстрировано в разделе
Data-driven Style
, более того можно
совместить
именованные столбцы и встроенные аргументы.
*** Settings *** Documentation Flasky App Login DD Test Resource users/users.resource Suite Setup Setup Suite Force Tags ui login *** Variables *** *** Keywords *** Create Unique User &{unique_user}= Generate Unique User Set Suite Variable ${unique_user} Setup Suite Create Unique User Register User user=${unique_user} Test Setup Tasks Start Chromium Browser Test Teardown Tasks Close Browser Providing ${username} and ${password} Title Should Be ${expected} Open Browser To Login Page Log ${username} Log ${password} Input Username ${username} Input Password ${password} Submit Credentials ${title}= Get Title Log ${title} Should Be Equal ${title} ${expected} *** Test Cases *** Login With Credentials [Documentation] A test case that covers both ... valid, invalid and missing ... credentials entry [Template] Providing ${username} and ${password} Title Should Be ${expected} ${unique_user.username} ${unique_user.password} User Information - Demo App WRONG WRONG Login Failure - Demo App ${unique_user.username} WRONG Login Failure - Demo App WRONG ${unique_user.password} Login Failure - Demo App ${EMPTY} ${EMPTY} Log In - Demo App ${unique_user.username} ${EMPTY} Log In - Demo App ${EMPTY} ${unique_user.password} Log In - Demo App WRONG ${EMPTY} Log In - Demo App ${EMPTY} WRONG Log In - Demo App
Такой набор тестов считается одним текст кейсом
robot login.robot
============================================================================== Login :: Flasky App Login DD Test ============================================================================== Login With Credentials | PASS | ------------------------------------------------------------------------------ Login :: Flasky App Login DD Test | PASS | 1 test, 1 passed, 0 failed ============================================================================== Output: /robot/src/tests/ui/output.xml Log: /robot/src/tests/ui/log.html Report: /robot/src/tests/ui/report.html
Внутри этого тест кейса кейворд Providing ${username} and ${password} Title Should Be ${expected} будет выполнен восемь раз, причём в логе будут видны уже подставленные значения аргументов, например:
Providing WRONG and WRONG Title Should Be
Login Failure - Demo App
…

Если решение с одним тест кейсом на все варианты введённых данных не подходит - можно разбить тест кейс на несколько.
Так как везде будет использоваться один и тот же шаблон - уместно применить
Test Template
и не писать везде
[Template]
В следующем примере используется код из
предыдущего
с тем отличием, что в *** Settings *** добавлен Test Template а тест кейс разбит на три части по типу введённых учётных данных.
*** Settings *** … Test Template Providing ${username} and ${password} Title Should Be ${expected} … *** Test Cases *** With Valid Credentials ${unique_user.username} ${unique_user.password} User Information - Demo App With Invalid Credentials WRONG WRONG Login Failure - Demo App ${unique_user.username} WRONG Login Failure - Demo App WRONG ${unique_user.password} Login Failure - Demo App With Missing Credentials ${EMPTY} ${EMPTY} Log In - Demo App ${unique_user.username} ${EMPTY} Log In - Demo App ${EMPTY} ${unique_user.password} Log In - Demo App WRONG ${EMPTY} Log In - Demo App ${EMPTY} WRONG Log In - Demo App

Совместим встроенные аргументы, Test Template и именованные столбцы
*** Settings *** Documentation Flasky App Login DD Test Resource users/users.resource Suite Setup Setup Suite Force Tags ui login Test Template Providing ${username} and ${password} Title Should Be ${expected} *** Variables *** *** Keywords *** Create Unique User &{unique_user}= Generate Unique User Set Suite Variable ${unique_user} Setup Suite Create Unique User Register User user=${unique_user} # To reduce variable names two new # variables are created here ${VALID USER}= Set Variable ${unique_user.username} Set Suite Variable ${VALID USER} ${VALID PASSWD}= Set Variable ${unique_user.password} Set Suite Variable ${VALID PASSWD} Test Setup Tasks Start Chromium Browser Test Teardown Tasks Close Browser Providing ${username} and ${password} Title Should Be ${expected} Open Browser To Login Page Log ${username} Log ${password} Input Username ${username} Input Password ${password} Submit Credentials ${title}= Get Title Log ${title} Should Be Equal ${title} ${expected} *** Test Cases *** USERNAME PASSWORD EXPECTED TITLE Valid Credentials ${VALID USER} ${VALID PASSWD} User Information - Demo App Invalid User Name invalid ${VALID PASSWD} Login Failure - Demo App Invalid Password ${VALID USER} invalid Login Failure - Demo App Invalid User Name and Password invalid invalid Login Failure - Demo App Empty User Name ${EMPTY} ${VALID PASSWD} Log In - Demo App Empty Password ${VALID USER} ${EMPTY} Log In - Demo App Empty User Name and Password ${EMPTY} ${EMPTY} Log In - Demo App Empty User Name Invalid Password ${EMPTY} invalid Log In - Demo App Invalid User Name Empty Password invalid ${EMPTY} Log In - Demo App
Такой тест-кейс трактуется как девять отдельных тестов.

Robot Framework | |
Основы | |
Тест входа в систему | |
Переменные | |
Передача аргументов в кейворд |