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

ВступлениеПодготовка к запускуАрхитектура платформы 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

Часть 5. Параметры

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

В этой части вы познакомитесь с механизмом параметров в языке Testo lang.

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

  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. (Рекомендовано) Проделаны шаги из четвертой части.

Вступление

В течение прошлых уроков мы написали довольно много кода для наших тестовых сценариев, и вы могли заметить, что в этом коде фигурирует довольно много фиксированных значений, которые при этом неоднократно повторяются. Например, путь для iso-образов ubuntu server и testo-guest-additions прописан явно в самом тестовом сценарии, что не очень удобно. Если iso-файлы будут располагаться в другой папке, то потребуется исправлять сам тестовый сценарий. Или, например, логин my-ubuntu-login тоже явно повторяется несколько раз по ходу сценария, и если бы мы захотели исправить этот логин на другое значение, то нам пришлось бы искать все вхождения этой строки в тестовом сценарии. Конечно, всё это не добавляет гибкости и лаконичности таким тестовым сценариям.

Для решения этой проблемы в языке Testo-lang существует механизм параметров. Параметры можно рассматривать как глобальные строковые константы. Давайте познакомимся с этим механизмом на примере.

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

Давайте вспомним, в каком виде находится тестовый сценарий на текущий момент.

...

test ubuntu_installation {
	my_ubuntu {
		start
		...
		wait "Hostname:" timeout 5m; press Backspace*36; type "my-ubuntu"; press Enter
		wait "Full name for the new user"; type "my-ubuntu-login"; press Enter
		wait "Username for your account"; press Enter
		wait "Choose a password for the new user"; type "1111"; press Enter
		wait "Re-enter password to verify"; type "1111"; press Enter
		...
		wait "login:" timeout 2m; type "my-ubuntu-login"; press Enter
		wait "Password:"; type "1111"; press Enter
		wait "Welcome to Ubuntu"
	}
}

test ubuntu_prepare: ubuntu_installation {
	my_ubuntu {
		# Enter sudo mode
		type "sudo su"; press Enter
		wait "password for my-ubuntu-login"; type "1111"; press Enter
		wait "root@my-ubuntu"
		...
		wait "login:" timeout 2m; type "my-ubuntu-login"; press Enter
		wait "Password:"; type "1111"; press Enter
		wait "Welcome to Ubuntu"

		# Enter sudo once more
		type "sudo su"; press Enter;
		wait "password for my-ubuntu-login"; type "1111"; press Enter
		wait "root@my-ubuntu"
		...
	}
}
...

Можно заметить, что в тестовом сценарии несколько раз повторяются строковые константы my-ubuntu, my-ubuntu-login и 1111. Понятно, что чем больше будет наш тестовый сценарий и чем больше там будет таких строковых констант, тем проще будет в них запутаться и рано или поздно допустить ошибку. Для того, чтобы избежать такой неприятной ситуации, давайте попробуем объявить несколько параметров.

param hostname "my-ubuntu"
param login "my-ubuntu-login"
param password "1111"

test ubuntu_installation {
    ...

Объявление параметров должно располагаться на том же уровне, что и объявление виртуальных машин или тестов (в глобальном пространстве). Нельзя объявлять параметры внутри тестов или внутри объявлений виртуальных машин и других сущностей.

Нельзя переобъявлять ранее объявленные параметры.

Теперь внутри самих тестов мы можем использовать обращение к этим параметрам:

...

test ubuntu_installation {
    my_ubuntu {
        start
        ...
        wait "Hostname:" timeout 5m; press Backspace*36; type "${hostname}"; press Enter
        wait "Full name for the new user"; type "${login}"; press Enter
        wait "Username for your account"; press Enter
        wait "Choose a password for the new user"; type "${password}"; press Enter
        wait "Re-enter password to verify"; type "${password}"; press Enter
        ...
        wait "login:" timeout 2m; type "${login}"; press Enter
        wait "Password:"; type "${password}"; press Enter
        wait "Welcome to Ubuntu"
    }
}

test ubuntu_prepare: ubuntu_installation {
    my_ubuntu {
        # Enter sudo mode
        type "sudo su"; press Enter
        wait "password for ${login}"; type "${password}"; press Enter
        wait "root@${hostname}"
        ...
        wait "login:" timeout 2m; type "${login}"; press Enter
        wait "Password:"; type "${password}"; press Enter
        wait "Welcome to Ubuntu"

        # Enter sudo once more
        type "sudo su"; press Enter;
        wait "password for ${login}"; type "${password}"; press Enter
        wait "root@${hostname}"
        ...
    }
}
...

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

Передача параметров через аргумент командной строки

Однако вы могли заметить, что у нас в тестовом сценарии остался еще один не очень приятный момент: мы вынуждены указывать полный путь к iso-образам: при объявлении виртуальной машины my_ubuntu в атрибуте iso, а также в действии plug dvd при установке гостевых дополнений.

Конечно, мы могли бы, как и в предыдущем пункте, объявить параметр iso_dir "C:\\iso\\", однако в этом случае мы привязываем наш тестовый сценарий к конкретному местоположению необходимых iso-образов. Конечно, это не очень здорово.

В языке Testo-lang существует возможность указывать параметры не только в виде языковой конструкции, но и как аргумент командной строки. Давайте посмотрим на примере:

machine my_ubuntu {
    cpus: 1
    ram: 512Mb
    disk main: {
        size: 5Gb
    }
    iso: "${ISO_DIR}\\ubuntu_server.iso"
}
...
test ubuntu_install_guest_additions: ubuntu_prepare {
    my_ubuntu {
        plug dvd "${ISO_DIR}\\testo-guest-additions.iso"
        ...
    }
}

Мы изменили тестовый сценарий таким образом, что теперь папка с нужными iso-файлами указывается в качестве параметра ISO_DIR (заметьте, что обращаться к параметрам можно и в объявлении виртуальных машин). Однако мы нигде не объявляли параметр ISO_DIR. Если мы попытаемся запустить этот тестовый сценарий таким же способом, как в предыдущем уроке, то увидим ошибку:

C:\Users\Testo> testo run params.testo --stop_on_fail --test_spec ubuntu_guest_additions_demo
C:/Users/Testo/testo/params.testo:6:1: In the virtual machine "my_ubuntu" declaration
C:/Users/Testo/testo/params.testo:12:7: Error while resolving "${ISO_DIR}\ubuntu_server.iso"
- param "ISO_DIR" is not defined
C:\Users\Testo>

Т.к. параметр ISO_DIR нигде не был объявлен, то при попытке выяснить его значение в атрибуте iso виртуальной машины my_ubuntu будет сгенерирована ошибка.

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

C:\Users\Testo> testo run params.testo --stop_on_fail --test_spec ubuntu_guest_additions_demo --param ISO_DIR C:\iso

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

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

C:\Users\Testo> testo run params.testo --stop_on_fail --test_spec ubuntu_guest_additions_demo --param ISO_DIR C:\iso
UP-TO-DATE TESTS:
ubuntu_installation
ubuntu_prepare
ubuntu_install_guest_additions
ubuntu_guest_additions_demo
PROCESSED TOTAL 4 TESTS IN 0h:0m:0s
UP-TO-DATE: 4
RUN SUCCESSFULLY: 0
FAILED: 0
C:\Users\Testo>

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

А сейчас, просто для того чтобы убедиться в работоспособности нашего тестового сценария уже с наличием параметров, запустим интерпретатор testo с аргументом invalidate, после чего все тесты должны прогнаться заново:

C:\Users\Testo> testo run params.testo --stop_on_fail --test_spec ubuntu_guest_additions_demo --param ISO_DIR C:\iso --invalidate *
TESTS TO RUN:
ubuntu_installation
ubuntu_prepare
ubuntu_install_guest_additions
ubuntu_guest_additions_demo
[ 0%] Preparing the environment for test ubuntu_installation
[ 0%] Restoring snapshot initial for virtual machine my_ubuntu
[ 0%] Running test ubuntu_installation
[ 0%] Starting virtual machine my_ubuntu
[ 0%] Waiting "Install Ubuntu Server" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Choose the language" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Select your location" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Detect keyboard layout?" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Country of origin for the keyboard" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Keyboard layout" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Hostname:" for 5m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key BACKSPACE 36 times in virtual machine my_ubuntu
[ 0%] Typing "my-ubuntu" with interval 30ms in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Full name for the new user" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Typing "my-ubuntu-login" with interval 30ms in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Username for your account" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Choose a password for the new user" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Typing "1111" with interval 30ms in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Re-enter password to verify" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Typing "1111" with interval 30ms in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Use weak password?" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key LEFT in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Encrypt your home directory?" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Is this time zone correct?" for 2m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Partitioning method" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Select disk to partition" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Write the changes to disks and configure LVM?" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key LEFT in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Amount of volume group to use for guided partitioning" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Force UEFI installation?" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key LEFT in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Write the changes to disks?" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key LEFT in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "HTTP proxy information" for 3m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "How do you want to manage upgrades" for 6m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Choose software to install" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Installation complete" for 30m with interval 1s in virtual machine my_ubuntu
[ 0%] Unplugging dvd from virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "login:" for 2m with interval 1s in virtual machine my_ubuntu
[ 0%] Typing "my-ubuntu-login" with interval 30ms in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Password:" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Typing "1111" with interval 30ms in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
[ 0%] Waiting "Welcome to Ubuntu" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Taking snapshot ubuntu_installation for virtual machine my_ubuntu
[ 25%] Test ubuntu_installation PASSED in 0h:7m:14s
[ 25%] Preparing the environment for test ubuntu_prepare
[ 25%] Running test ubuntu_prepare
[ 25%] Typing "sudo su" with interval 30ms in virtual machine my_ubuntu
[ 25%] Pressing key ENTER in virtual machine my_ubuntu
[ 25%] Waiting "password for my-ubuntu-login" for 1m with interval 1s in virtual machine my_ubuntu
[ 25%] Typing "1111" with interval 30ms in virtual machine my_ubuntu
[ 25%] Pressing key ENTER in virtual machine my_ubuntu
[ 25%] Waiting "root@my-ubuntu" for 1m with interval 1s in virtual machine my_ubuntu
[ 25%] Typing "dhclient -r eth0 && dhclient eth0 && echo Result is $?" with interval 30ms in virtual machine my_ubuntu
[ 25%] Pressing key ENTER in virtual machine my_ubuntu
[ 25%] Typing "clear && apt update && echo Result is $?" with interval 30ms in virtual machine my_ubuntu
[ 25%] Pressing key ENTER in virtual machine my_ubuntu
[ 25%] Waiting "Result is 0" for 1m with interval 1s in virtual machine my_ubuntu
[ 25%] Typing "clear && apt install -y linux-azure && echo Result is $?" with interval 30ms in virtual machine my_ubuntu
[ 25%] Pressing key ENTER in virtual machine my_ubuntu
[ 25%] Waiting "Result is 0" for 15m with interval 1s in virtual machine my_ubuntu
[ 25%] Typing "reboot" with interval 30ms in virtual machine my_ubuntu
[ 25%] Pressing key ENTER in virtual machine my_ubuntu
[ 25%] Waiting "login:" for 2m with interval 1s in virtual machine my_ubuntu
[ 25%] Typing "my-ubuntu-login" with interval 30ms in virtual machine my_ubuntu
[ 25%] Pressing key ENTER in virtual machine my_ubuntu
[ 25%] Waiting "Password:" for 1m with interval 1s in virtual machine my_ubuntu
[ 25%] Typing "1111" with interval 30ms in virtual machine my_ubuntu
[ 25%] Pressing key ENTER in virtual machine my_ubuntu
[ 25%] Waiting "Welcome to Ubuntu" for 1m with interval 1s in virtual machine my_ubuntu
[ 25%] Typing "sudo su" with interval 30ms in virtual machine my_ubuntu
[ 25%] Pressing key ENTER in virtual machine my_ubuntu
[ 25%] Waiting "password for my-ubuntu-login" for 1m with interval 1s in virtual machine my_ubuntu
[ 25%] Typing "1111" with interval 30ms in virtual machine my_ubuntu
[ 25%] Pressing key ENTER in virtual machine my_ubuntu
[ 25%] Waiting "root@my-ubuntu" for 1m with interval 1s in virtual machine my_ubuntu
[ 25%] Typing "clear && modprobe hv_sock && echo Result is $?" with interval 30ms in virtual machine my_ubuntu
[ 25%] Pressing key ENTER in virtual machine my_ubuntu
[ 25%] Waiting "Result is 0" for 1m with interval 1s in virtual machine my_ubuntu
[ 25%] Typing "clear && lsmod | grep hv" with interval 30ms in virtual machine my_ubuntu
[ 25%] Pressing key ENTER in virtual machine my_ubuntu
[ 25%] Waiting "hv_sock" for 1m with interval 1s in virtual machine my_ubuntu
[ 25%] Taking snapshot ubuntu_prepare for virtual machine my_ubuntu
[ 50%] Test ubuntu_prepare PASSED in 0h:5m:36s
[ 50%] Preparing the environment for test ubuntu_install_guest_additions
[ 50%] Running test ubuntu_install_guest_additions
[ 50%] Plugging dvd C:/iso/testo-guest-additions-hyperv.iso into virtual machine my_ubuntu
[ 50%] Typing "mount /dev/cdrom /media" with interval 30ms in virtual machine my_ubuntu
[ 50%] Pressing key ENTER in virtual machine my_ubuntu
[ 50%] Waiting "mounting read-only" for 1m with interval 1s in virtual machine my_ubuntu
[ 50%] Typing "clear && dpkg -i /media/*.deb && echo Result is $?" with interval 30ms in virtual machine my_ubuntu
[ 50%] Pressing key ENTER in virtual machine my_ubuntu
[ 50%] Waiting "Result is 0" for 1m with interval 1s in virtual machine my_ubuntu
[ 50%] Typing "clear && umount /media && echo Result is $?" with interval 30ms in virtual machine my_ubuntu
[ 50%] Pressing key ENTER in virtual machine my_ubuntu
[ 50%] Waiting "Result is 0" for 1m with interval 1s in virtual machine my_ubuntu
[ 50%] Sleeping in virtual machine my_ubuntu for 2s
[ 50%] Unplugging dvd from virtual machine my_ubuntu
[ 50%] Taking snapshot ubuntu_install_guest_additions for virtual machine my_ubuntu
[ 75%] Test ubuntu_install_guest_additions PASSED in 0h:0m:15s
[ 75%] Preparing the environment for test ubuntu_guest_additions_demo
[ 75%] Running test ubuntu_guest_additions_demo
[ 75%] Executing bash command in virtual machine my_ubuntu with timeout 10m
+ echo Hello world
Hello world
+ echo from bash
from bash
[ 75%] Executing python3 command in virtual machine my_ubuntu with timeout 10m
Hello from python3!
[ 75%] Taking snapshot ubuntu_guest_additions_demo for virtual machine my_ubuntu
[100%] Test ubuntu_guest_additions_demo PASSED in 0h:0m:2s
PROCESSED TOTAL 4 TESTS IN 0h:13m:9s
UP-TO-DATE: 0
RUN SUCCESSFULLY: 4
FAILED: 0
C:\Users\Testo>

Итоги

С помощью параметров можно делать тестовые сценарии гораздо более читаемыми и гибкими.

Во-первых, можно "именовать" часто встречаемые константы чтобы в них было проще ориентироваться и применять в нужных участках сценариев.

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

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