Template в Robot Framework

Введение

Шаблоны тестов преобразуют обычные тестовые наборы, управляемые ключевыми словами, в тесты, управляемые данными.

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

Вместо многократного повторения одного и того же ключевого слова для каждого теста и/или для всех тестов в файле можно использовать его только для каждого теста или только один раз для каждого файла.

Ключевые слова, используемые в качестве шаблона, могут принимать как обычные позиционные, так и именованные аргументы, а также аргументы, встроенные в название ключевого слова .

В отличие от других настроек, невозможно определить шаблон с помощью переменной.

Основное использование

То, как ключевое слово, принимающее обычные позиционные аргументы, может быть использовано в качестве шаблона, проиллюстрировано следующими примерами тестов. Эти два теста функционально полностью идентичны. официальная документация

То, что тест-кейс использует шаблон можно указать с помощью настройки тест кейса [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

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

Их обычная структура заключается в следующем:

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
…

Robot www.testsetup.ru

Если решение с одним тест кейсом на все варианты введённых данных не подходит - можно разбить тест кейс на несколько.

Так как везде будет использоваться один и тот же шаблон - уместно применить 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

Robot www.testsetup.ru
Test Template

Совместим встроенные аргументы, 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 www.testsetup.ru
Test Template

Автор статьи: Андрей Олегович