Общие сведения

ВступлениеПодготовка к запускуАрхитектура платформы TestoПорядок запускаПолитика запуска тестов

Обучающие материалы по Testo для Hyper-V

Часть 1. Самый первый тестЧасть 2. Устанавливаем Ubuntu ServerЧасть 3. Доступ в Интернет из виртуальной машиныЧасть 4. Гостевые дополненияЧасть 5. ПараметрыЧасть 6. КешированиеЧасть 7. Связываем две машины по сетиЧасть 8. ФлешкиЧасть 9. МакросыЧасть 10. Конструкция ifЧасть 11. No snapshotsЧасть 12. Управление мышкойЧасть 13. Импортирование жёстких дисковЧасть 14. JS-селекторыЧасть 15. Циклы

Обучающие материалы по Testo для QEMU

Часть 1. Самый первый тестЧасть 2. Устанавливаем Ubuntu ServerЧасть 3. Гостевые дополненияЧасть 4. ПараметрыЧасть 5. КешированиеЧасть 6. Доступ в Интернет из виртуальной машиныЧасть 7. Связываем две машины по сетиЧасть 8. ФлешкиЧасть 9. МакросыЧасть 10. Конструкция ifЧасть 11. No snapshotsЧасть 12. Управление мышкойЧасть 13. Импортирование жёстких дисковЧасть 14. JS-селекторыЧасть 15. ЦиклыЧасть 16. Макросы с объявлениями

Спецификация языка

Общая структура скриптовых файловБазовые конструкции языкаOбъявление виртуальной машиныОбъявление виртуального флеш-накопителяОбъявление виртуальной сетиПараметрыОбъявление тестовМакросыДействия с виртуальными машинамиДействия с мышкойПоиск изображений на экранеДействия с виртуальными флеш-накопителямиУсловияЦиклыСписок идентификаторов клавиш

Запросы на языке Javascript

Общая концепция построения JS-селекторовВстроенные глобальные функции JavascriptИсключенияКласс TextTensorКласс ImgTensorКласс Point

Часть 10. Конструкция if

С чем Вы познакомитесь

В этой части вы познакомитесь с механизмом условий в платформе Testo, а также увидите пример использования поисковых выражений в действии wait.

Начальные условия

  1. Платформа Testo установлена.
  2. Гипервизор Hyper-V установлен.
  3. Имеется установочный образ Ubuntu server 16.04 с расположением C:\iso\ubuntu_server.iso. Местоположение и название установочного файла может быть другим, в этом случае нужно будет соответствующим образом поправить параметр ISO_DIR, передаваемый через командную строку во время запуска тестов.
  4. Имеется образ с гостевыми дополнениями Testo для Hyper-V в одной папке с установочным образом Ubuntu.
  5. Хост имеет доступ в Интернет.
  6. (Рекомендовано) Настроена подсветка синтаксиса testo-lang в Sublime Text 3.
  7. (Рекомендовано) Проделаны шаги из девятой части.

Вступление

В ходе предыдущей части мы смогли добиться того, чтобы наш код стал более структурированным и компактным. Тем не менее, в нём есть ещё несколько моментов, которые хотелось бы улучшить.

В прошлом мы неоднократно сталкивались с необходимостью немного корректировать тест с установкой Ubuntu Server. Это было связано с тем, что процесс установки Ubuntu Server все время немного менялся в зависимости от конфигурации наших виртуальных машин: есть ли у неё сетевые адаптеры или доступ в Интернет и так далее. Сейчас наш макрос install_ubuntu неплохо справляется со своей работой только если выполнены следующие условия:

  1. У виртуальной машины есть два или более сетевых адаптера;
  2. У виртуальной машины есть доступ в Интернет;
  3. Пароль администратора достаточно слабый, чтобы вызвать соответствующее предупреждение.

Но что, если мы захотим, чтобы наш макрос работал в любых условиях? Чтобы при любых конфигурациях виртуальных машин макрос install_ubuntu корректно отрабатывал?

Очевидно, что для этого в макрос необходимо заложить возможность "вести себя" немного по-разному в зависимости от различных условий. Именно для этого в языке Testo-lang предусмотрены условные конструкции if-else. Условия могут базироваться как на обычных сравнениях строковых констант и параметров, так и на текущем содержимом экрана. В этой части обучения мы опробуем разные условия, начиная с базовых сравенний строк и заканчивания проверкой содержимого экрана.

С чего начать?

Для начала попробуем доработать макрос install_ubuntu так, чтобы он мог успешно отрабатывать в условиях ввода как нормального пароля администратора, так и слишком простого. Для начала необходимо понять, в чём разница с точки зрения набора действий в обоих случаях.

Сейчас, когда макрос может успешно работать только со слабыми паролями, он выглядит так:

macro install_ubuntu(hostname, login, password = "${default_password}") {
    start
    ...
    wait "Choose a password for the new user"; type "${password}"; press Enter
    wait "Re-enter password to verify"; type "${password}"; press Enter
    wait "Use weak password?"; press Left, Enter
    wait "Encrypt your home directory?"; press Enter
    ...
}

То есть мы ожидаем, что после ввода пароля появится экран с предупреждением "Use weak password?", в котором мы должны нажать клавиши Left и Enter.

Очевидно, что в случае использовании нормального пароля такой экран не появится и макрос должен будет выглядеть так:

macro install_ubuntu(hostname, login, password = "${default_password}") {
    start
    ...
    wait "Choose a password for the new user"; type "${password}"; press Enter
    wait "Re-enter password to verify"; type "${password}"; press Enter
    wait "Encrypt your home directory?"; press Enter
    ...
}

Давайте попробуем объединить оба случая с помощью условия if.

Обратите внимание, что в данный момент мы пробуем не самое оптимальное решение проблемы. Более оптимальное решение (распознавание содержимого экрана) будет рассмотрено позже в этом уроке. Текущее решение играет больше ознакомительную роль.

macro install_ubuntu(hostname, login, password="${default_password}", is_weak_password="") {
    start
    ...
    wait "Choose a password for the new user"; type "${password}"; press Enter
    wait "Re-enter password to verify"; type "${password}"; press Enter
    if ("${is_weak_password}") {
        wait "Use weak password?"; press Left, Enter
    }
    wait "Encrypt your home directory?"; press Enter
    ...
}

Мы добавили новый аргумент макроса - is_weak_password. Этот аргумент выполняет роль "подсказки" для макроса и позволяет указать при вызове макроса, является ли пароль сложным или простым. В случае, если значение этого аргумента имеет ненулевую длину, то выражение внутри if будет равно true, и выполнится соответствующая ветка действий. Если же длина значения аргумента нулевая, то выражение будет равно false, и действия не будут выполнены.

Мы спроектировали макрос так, что пароль по умолчанию ${default_password} должен быть достаточно сложным, чтобы дополнительный экран с предупреждением не появлялся. Т.к. текущий наш пароль по умолчанию - это 1111 (и очевидно не является сложным), то такой макрос не будет работать в случае использования значений по умолчанию. Давайте в этом убедимся.

C:\Users\Testo> testo run tests.testo --stop_on_fail --param ISO_DIR C:\iso --test_spec server_install_ubuntu --assume_yes
TESTS TO RUN:
server_install_ubuntu
[ 0%] Preparing the environment for test server_install_ubuntu
[ 0%] Restoring snapshot initial for virtual machine server
[ 0%] Running test server_install_ubuntu
[ 0%] Calling macro install_ubuntu(hostname="server", login="server-login", password="1111", is_weak_password="") in virtual machine server
[ 0%] Starting virtual machine server
[ 0%] Waiting "Install Ubuntu Server" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Choose the language" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Select your location" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Detect keyboard layout?" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Country of origin for the keyboard" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Keyboard layout" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Primary network interface" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Hostname:" for 5m with interval 1s in virtual machine server
[ 0%] Pressing key BACKSPACE 36 times in virtual machine server
[ 0%] Typing "server" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Full name for the new user" for 1m with interval 1s in virtual machine server
[ 0%] Typing "server-login" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Username for your account" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Choose a password for the new user" for 1m with interval 1s in virtual machine server
[ 0%] Typing "1111" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Re-enter password to verify" for 1m with interval 1s in virtual machine server
[ 0%] Typing "1111" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Encrypt your home directory?" for 1m with interval 1s in virtual machine server
C:/Users/Testo/tests.testo:6:9: In a macro call install_ubuntu
C:/Users/Testo/tests.testo:23:2: Error while performing action wait "Encrypt your home directory?" on virtual machine server
- Timeout

C:/Users/Testo/declarations.testo:35:1: note: the virtual machine server was declared here

[100%] Test server_install_ubuntu FAILED in 0h:1m:55s
C:\Users\Testo>

Как мы и предполагали, if сработал не совсем так, как мы бы хотели, поэтому давайте исправим параметр default_password так, чтобы он мог восприниматься как достаточно надежный:

param default_password "ThisIsStrongPassword"

Перезапустим тесты. Обратите внимание, что сейчас мы выполняем только тест server_install_ubuntu

C:\Users\Testo> testo run tests.testo --stop_on_fail --param ISO_DIR C:\iso --test_spec server_install_ubuntu --assume_yes
TESTS TO RUN:
server_install_ubuntu
[ 0%] Preparing the environment for test server_install_ubuntu
[ 0%] Restoring snapshot initial for virtual machine server
[ 0%] Running test server_install_ubuntu
[ 0%] Calling macro install_ubuntu(hostname="server", login="server-login", password="ThisIsStrongPassword", is_weak_password="") in virtual machine server
[ 0%] Starting virtual machine server
[ 0%] Waiting "Install Ubuntu Server" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Choose the language" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Select your location" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Detect keyboard layout?" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Country of origin for the keyboard" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Keyboard layout" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Primary network interface" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Hostname:" for 5m with interval 1s in virtual machine server
[ 0%] Pressing key BACKSPACE 36 times in virtual machine server
[ 0%] Typing "server" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Full name for the new user" for 1m with interval 1s in virtual machine server
[ 0%] Typing "server-login" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Username for your account" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Choose a password for the new user" for 1m with interval 1s in virtual machine server
[ 0%] Typing "ThisIsStrongPassword" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Re-enter password to verify" for 1m with interval 1s in virtual machine server
[ 0%] Typing "ThisIsStrongPassword" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Encrypt your home directory?" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Is this time zone correct?" for 2m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Partitioning method" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Select disk to partition" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Write the changes to disks and configure LVM?" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key LEFT in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Amount of volume group to use for guided partitioning" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Force UEFI installation?" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key LEFT in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Write the changes to disks?" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key LEFT in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "HTTP proxy information" for 3m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "How do you want to manage upgrades" for 6m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Choose software to install" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Installation complete" for 30m with interval 1s in virtual machine server
[ 0%] Unplugging dvd from virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "login:" for 2m with interval 1s in virtual machine server
[ 0%] Typing "server-login" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Password:" for 1m with interval 1s in virtual machine server
[ 0%] Typing "ThisIsStrongPassword" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Welcome to Ubuntu" for 1m with interval 1s in virtual machine server
[ 0%] Taking snapshot server_install_ubuntu for virtual machine server
[100%] Test server_install_ubuntu PASSED in 0h:7m:10s
PROCESSED TOTAL 1 TESTS IN 0h:7m:10s
UP-TO-DATE: 0
RUN SUCCESSFULLY: 1
FAILED: 0
C:\Users\Testo>

Итак, тест на установку Ubuntu снова проходит. Теперь давайте представим, что по какой-то причине нам все-таки очень нужно установить именно слабый пароль на виртуальную машину client. Для этого надо модернизировать вызов макроса в тесте client_install_ubuntu:

test client_install_ubuntu {
    client install_ubuntu("${client_hostname}", "${client_login}", "1111", "yes")
}

В этом вызове мы вместо пароля по-умолчанию default_password передаём явно пароль 1111. Для того, чтобы "подсказать" макросу, что это слабый пароль, необходимо передать непустую строку в качестве четвертого параметра.

C:\Users\Testo> testo run tests.testo --stop_on_fail --param ISO_DIR C:\iso --test_spec client_install_ubuntu --assume_yes
TESTS TO RUN:
client_install_ubuntu
[ 0%] Preparing the environment for test client_install_ubuntu
[ 0%] Restoring snapshot initial for virtual machine client
[ 0%] Running test client_install_ubuntu
[ 0%] Calling macro install_ubuntu(hostname="client", login="client-login", password="1111", is_weak_password="yes") in virtual machine client
[ 0%] Starting virtual machine client
[ 0%] Waiting "Install Ubuntu Server" for 1m with interval 1s in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Choose the language" for 1m with interval 1s in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Select your location" for 1m with interval 1s in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Detect keyboard layout?" for 1m with interval 1s in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Country of origin for the keyboard" for 1m with interval 1s in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Keyboard layout" for 1m with interval 1s in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Primary network interface" for 1m with interval 1s in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Hostname:" for 5m with interval 1s in virtual machine client
[ 0%] Pressing key BACKSPACE 36 times in virtual machine client
[ 0%] Typing "client" with interval 30ms in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Full name for the new user" for 1m with interval 1s in virtual machine client
[ 0%] Typing "client-login" with interval 30ms in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Username for your account" for 1m with interval 1s in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Choose a password for the new user" for 1m with interval 1s in virtual machine client
[ 0%] Typing "1111" with interval 30ms in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Re-enter password to verify" for 1m with interval 1s in virtual machine client
[ 0%] Typing "1111" with interval 30ms in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Use weak password?" for 1m with interval 1s in virtual machine client
[ 0%] Pressing key LEFT in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Encrypt your home directory?" for 1m with interval 1s in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Is this time zone correct?" for 2m with interval 1s in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Partitioning method" for 1m with interval 1s in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Select disk to partition" for 1m with interval 1s in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Write the changes to disks and configure LVM?" for 1m with interval 1s in virtual machine client
[ 0%] Pressing key LEFT in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Amount of volume group to use for guided partitioning" for 1m with interval 1s in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Force UEFI installation?" for 1m with interval 1s in virtual machine client
[ 0%] Pressing key LEFT in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Write the changes to disks?" for 1m with interval 1s in virtual machine client
[ 0%] Pressing key LEFT in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "HTTP proxy information" for 3m with interval 1s in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "How do you want to manage upgrades" for 6m with interval 1s in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Choose software to install" for 1m with interval 1s in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Installation complete" for 30m with interval 1s in virtual machine client
[ 0%] Unplugging dvd from virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "login:" for 2m with interval 1s in virtual machine client
[ 0%] Typing "client-login" with interval 30ms in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Password:" for 1m with interval 1s in virtual machine client
[ 0%] Typing "1111" with interval 30ms in virtual machine client
[ 0%] Pressing key ENTER in virtual machine client
[ 0%] Waiting "Welcome to Ubuntu" for 1m with interval 1s in virtual machine client
[ 0%] Taking snapshot client_install_ubuntu for virtual machine client
[100%] Test client_install_ubuntu PASSED in 0h:7m:9s
PROCESSED TOTAL 1 TESTS IN 0h:7m:9s
UP-TO-DATE: 0
RUN SUCCESSFULLY: 1
FAILED: 0
C:\Users\Testo>

Мы видим, что наше решение работает - теперь макрос install_ubuntu работает как при достаточно надежном пароле, так и при слабом. Но, конечно, такой способ управления сценарием не слишком удобен. Если бы в нашем макросе было еще несколько ветвлений (а они нам ещё потребуются), то пришлось бы вводить новые аргументы, и рано или поздно их станет слишком много и в них можно будет запутаться.

Поэтому в языке Testo-lang существует возможность конструировать условия на основе содержимого экрана.

Условия на основе содержимого экрана

Для того, чтобы строить условия на основе содержмого экрана, в языке Testo-lang существует проверка check. Её формат очень похож на формат действия wait, но принцип действия у неё несколько другой: если действие wait пытается дождаться некоторого события на экране и генерирует ошибку, если этого события не произошло за указанный промежуток времени, то проверка check в случае, если событие так и не наступило за заданный промежуток времени, просто возвращает false. Проверку check можно использовать только внутри условных выражений внутри if.

Давайте посмотрим на такую проверку в деле.

macro install_ubuntu(hostname, login, password = "${default_password}") {
    ..
    wait "Re-enter password to verify"; type "${password}"; press Enter
    if (check "Use weak password" timeout 3s) {
        press Left, Enter
    }
    wait "Encrypt your home directory?"; press Enter
    ...

Вместо того, чтобы полагаться на значение аргумента is_weak_password, наш макрос теперь полагается на фактическое положение вещей - на содержимое экрана. Наша проверка, приведенная выше, дословно означает следующее: если в течение трех секунд на экране появится надпись Use weak password, то необходимо выполнить действие press Left, Enter. Если надпись появится раньше, чем через 3 секунды - то проверка тут же закончится. Если надпись так и не появилась за 3 секунды, то делать ничего не нужно.

Если бы мы не указали timeout 3s - то по умолчанию check стал бы проверять только содержимое экрана на текущий момент времени, без выжидания каких-либо таймаутов. Нам это не очень подходит, потому что экран Use weak password может появиться после предыдущего не моментально, а, скажем, через 0,5-1 секунду. Поэтому таким способом мы как бы говорим себе: "Ну, если экран Use weak password не появится за 3 секунды, он вообще не появится".

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

Не забываем подкорректировать вызов макроса в client_install_ubuntu и запускаем оба теста на установку ещё раз.

test client_install_ubuntu {
    client install_ubuntu("${client_hostname}", "${client_login}", "1111")
}
C:\Users\Testo> testo run tests --stop_on_fail --param ISO_DIR C:\iso --test_spec \*_install_ubuntu --assume_yes
TESTS TO RUN:
server_install_ubuntu
client_install_ubuntu
...
PROCESSED TOTAL 2 TESTS IN 0h:11m:14s
UP-TO-DATE: 0
RUN SUCCESSFULLY: 2
FAILED: 0
C:\Users\Testo>

Оба теста успешно прошли, а это значит, что пора двигаться дальше.

Один макрос - разное количество интерфейсов

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

Давайте внимательно поисследуем этот участок макроса по установке Ubuntu.

wait "Keyboard layout"; press Enter
#wait "No network interfaces detected" timeout 5m; press Enter
wait "Primary network interface"; press Enter
wait "Hostname:" timeout 5m; press Backspace*36; type "${hostname}"; press Enter

Всего может быть три возможных варианта:

  1. Если сетевых адаптеров вообще нет, то появляется экран с предупреждением о том, что сетевые адаптеры не найдены, из-за чего нам дополнительно приходилось нажимать Enter в первых уроках. После чего сразу появлялся экран с Hostname.
  2. Если сетевой адаптер ровно один, то после Keyboard layout никаких предупреждений и дополнительных экранов не возникает, и установщик Ubuntu сразу предлагает выбрать Hostname.
  3. Если сетевых адаптеров два или больше, то после Keyboard layout появляется экран с предложением выбрать главный сетевой интерфейс. После выбора интерфейса появляется экран Hostname.

Получается, что мы не можем быть уверены, какой именно экран у нас появится после keyboard layout: или No network interfaces detected или Primary network interface или Hostname. Как же нам объединить все три возможных варианта в одном макросе?

Для этого мы воспользуемся приёмом, который по сути очень напоминает известный многим оператор switch-case, правда выглядит этот приём немного по-другому.

Для начала мы воспользуемся возможностью действия wait ожидать не фиксированную надпись, а целые логические выражения, состоящие из надписей (поподробнее про поисковые выражения можно почитать здесь):

wait "Keyboard layout"; press Enter
wait "No network interfaces detected" || "Primary network interface" || "Hostname:" timeout 5m

Сложные поисковые выражения можно делать как в действии wait, так и в условии check.

Этим действием wait мы говорим, что нас устроит, если на экране появится хотя бы одна из перечисленных надписей. Такой wait успешно сработает независимо от того, какой именно экран у нас появится.

Пол дела мы сделали.

Но нам мало дождаться хоть какого-нибудь экрана. Нам еще нужно совершать разные действия, в зависимости от того, какой именно экран у нас высветился. В этом нам поможет уже знакомый if(check):

wait "No network interfaces detected" || "Primary network interface" || "Hostname:" timeout 5m
if (check "No network interfaces detected") {
    press Right, Enter
} else if (check "Primary network interface") {
    press Enter
}
wait "Hostname:" timeout 5m; press Backspace*36; type "${hostname}"; press Enter

Получается примерно следующая картина: сначала мы дожидаемся любого из устраивающих нас экранов, а затем с помощью перебора пытаемся понять, какой именно экран мы получили. И применяем соответствующие действия. Конечно, нам не хватает ещё секции else, которая бы соответствала экрану Hostname, но т.к. в двух других случаях после определенных действий всё равно затем требуется ожидать экран Hostname, мы можем себе позволить немного сократить количество кода.

Заметим, что в этом случае в check не указывается timeout, т.к. нас интересует состояние экрана на текущий момент, а не в течение некоторого времени. Какое бы событие не наступило на экране, оно уже точно наступило - в этом мы уверены.

Остался лишь один нерешённый вопрос. Он кроется в этом участке макроса:

wait "Encrypt your home directory?"; press Enter
#wait "Select your timezone" timeout 2m; press Enter
wait "Is this time zone correct?" timeout 2m; press Enter
wait "Partitioning method"; press Enter

В зависимости от того, есть ли у виртуальной машины доступ в Интернет или нет, могут появляться разные экраны: либо с предложением самостоятельно выбрать часовой пояс, либо с готовым предположением относительно вашего местоположения. К счастью, в обоих случаях действия с нашей стороны должны быть одинаковыми: необходимо нажать Enter. Поэтому этот участок сценария можно унифицировать без if.

wait "Encrypt your home directory?"; press Enter
wait "Select your time zone" || "Is this time zone correct?" timeout 2m; press Enter
wait "Partitioning method"; press Enter

Готово! Теперь наш макрос install_ubuntu работает в самых разных условиях и с самыми разными виртуальными машинами. Мы можем вынести этот макрос в отдельный файл и фактически забыть про него. Всё, что нам теперь нужно для установки Ubuntu Server на виртуальную машину в тесте - это вызывать макрос, не заботясь о деталях его реализации.

Подключаем HTTP_PROXY

Ещё один момент, на который стоит обратить внимание - необходимость вводить информацию о HTTP PROXY в случае, если наш хост находимся за прокси-сервером. До текущего момента наши сценарии предполагали, что хостовая машина имеет прямой доступ к Интернету, но если мы хотим по-настоящему унифицировать тест по установке Ubuntu Server, нам необходимо предусмотреть все возможные случаи.

Понятно, что наличие прокси-сервера является внешним параметром для тестового сценария (как и ISO_DIR), и эту информацию необходимо передавать с помощью аргумента командной строки примерно таким образом: --param HTTP_PROXY "192.168.1.1".

Остаётся вопрос, как нам предусмотреть работоспособность теста по установке в случае наличия и отсутствия параметра HTTP_PROXY? В этом нам поможет выражение DEFINED:

...
wait "HTTP proxy information" timeout 3m;

if (DEFINED HTTP_PROXY) {
    type "${HTTP_PROXY}"
}

press Enter
...

Это выражение позволяет определить, определён ли параметр HTTP_PROXY. Обратите внимание, что имя параметра указывается в виде идентификатора, а не в виде строки.

В нашем случае при наличии параметра HTTP_PROXY нам достаточно просто вписать его значение в поле ввода, после чего нажать Enter.

Обратите внимание, что если бы мы попытались выполнить действие type "${HTTP_PROXY}" при неопределенном параметре HTTP_PROXY, мы бы получили ошибку.

Итоги

Условный оператор if в языке Testo-lang позволяет менять ход проведения тестовых сценариев в зависимости от различных условий, в том числе на основе происходящего на экране. С помощью этого инструмента вы можете писать более гибкие тесты и макросы, которые будут работать в разных условиях.

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

Готовые скрипты можно найти здесь