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

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

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

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

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

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

  1. Платформа Testo установлена.
  2. Установлен менеджер виртуальных машин virt-manager.
  3. Имеется установочный образ Ubuntu server 16.04 с расположением /opt/iso/ubuntu_server.iso. Местоположение и название установочного файла может быть другим, в этом случае нужно будет соответствующим образом поправить параметр ISO_DIR, передаваемый через командную строку во время запуска тестов.
  4. Имеется образ с гостевыми дополнениями Testo в одной папке с установочным образом Ubuntu.
  5. (Рекомендовано) Настроена подсветка синтаксиса Testo-lang в Sublime Text 3.
  6. (Рекомендовано) Проделаны шаги из третьей части.

Вступление

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

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

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

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

...

test ubuntu_installation {
	my_ubuntu {
		start
		...
		wait "Hostname:" timeout 30s; 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
		...
		unplug dvd; press Enter
		wait "login:" timeout 2m; type "my-ubuntu-login"; press Enter
		wait "Password:"; type "1111"; press Enter
		wait "Welcome to Ubuntu"
	}
}

test guest_additions_installation: ubuntu_installation {
	my_ubuntu {
		plug dvd "/opt/iso/testo-guest-additions.iso"

		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 {
    ...

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

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

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

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

test ubuntu_installation {
    my_ubuntu {
        start
        ...
        wait "Hostname:" timeout 30s; 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
        ...
        unplug dvd; press Enter
        wait "login:" timeout 2m; type "${login}"; press Enter
        wait "Password:"; type "${password}"; press Enter
        wait "Welcome to Ubuntu"
    }
}

test guest_additions_installation: ubuntu_installation {
    my_ubuntu {
        plug dvd "/opt/iso/testo-guest-additions.iso"

        type "sudo su"; press Enter;
        #Обратите внимание, обращаться к параметрам можно в любом участке строки
        wait "password for ${login}"; type "${password}"; press Enter
        wait "root@${hostname}"
        ...
    }
}

...

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

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

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

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

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

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

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

user$ sudo testo run ~/testo/hello_world.testo --stop_on_fail --test_spec guest_additions_installation
/home/alex/testo/hello_world.testo.testo:8:7: Error while resolving "${ISO_DIR}/ubuntu_server.iso"
-param "ISO_DIR" not defined
user$

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

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

user$ sudo testo run ~/testo/hello_world.testo --stop_on_fail --test_spec guest_additions_installation --param ISO_DIR /opt/iso

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

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

user$ sudo testo run ~/testo/hello_world.testo --stop_on_fail --test_spec guest_additions_demo --param ISO_DIR /opt/iso
UP-TO-DATE TESTS:
ubuntu_installation
guest_additions_installation
guest_additions_demo
PROCESSED TOTAL 3 TESTS IN 0h:0m:0s
UP-TO-DATE: 3
RUN SUCCESSFULLY: 0
FAILED: 0
user$

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

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

user$ sudo testo run ~/testo/hello_world.testo --stop_on_fail --test_spec guest_additions_demo --param ISO_DIR /opt/iso --invalidate \*
TESTS TO RUN:
ubuntu_installation
guest_additions_installation
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 English for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER on virtual machine my_ubuntu
[ 0%] Waiting Install Ubuntu Server for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER on virtual machine my_ubuntu
[ 0%] Waiting Choose the language for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER on virtual machine my_ubuntu
[ 0%] Waiting Select your location for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER on virtual machine my_ubuntu
[ 0%] Waiting Detect keyboard layout? for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER on 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 on virtual machine my_ubuntu
[ 0%] Waiting Keyboard layout for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER on virtual machine my_ubuntu
[ 0%] Waiting No network interfaces detected for 5m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER on virtual machine my_ubuntu
[ 0%] Waiting Hostname: for 30s with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key BACKSPACE 36 times on virtual machine my_ubuntu
[ 0%] Typing "my-ubuntu" with interval 30ms in virtual machine my_ubuntu
[ 0%] Pressing key ENTER on 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 on virtual machine my_ubuntu
[ 0%] Waiting Username for your account for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER on 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 on 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 on virtual machine my_ubuntu
[ 0%] Waiting Use weak password? for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key LEFT on virtual machine my_ubuntu
[ 0%] Pressing key ENTER on virtual machine my_ubuntu
[ 0%] Waiting Encrypt your home directory? for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER on virtual machine my_ubuntu
[ 0%] Waiting Select your timezone for 2m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER on virtual machine my_ubuntu
[ 0%] Waiting Partitioning method for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER on virtual machine my_ubuntu
[ 0%] Waiting Select disk to partition for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER on 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 on virtual machine my_ubuntu
[ 0%] Pressing key ENTER on 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 on 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 on virtual machine my_ubuntu
[ 0%] Pressing key ENTER on virtual machine my_ubuntu
[ 0%] Waiting HTTP proxy information for 3m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER on 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 on virtual machine my_ubuntu
[ 0%] Waiting Choose software to install for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER on virtual machine my_ubuntu
[ 0%] Waiting Install the GRUB boot loader to the master boot record? for 10m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER on virtual machine my_ubuntu
[ 0%] Waiting Installation complete for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Unplugging dvd from virtual machine my_ubuntu
[ 0%] Pressing key ENTER on 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 on 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 on 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
[ 33%] Test ubuntu_installation PASSED in 0h:4m:24s
[ 33%] Preparing the environment for test guest_additions_installation
[ 33%] Running test guest_additions_installation
[ 33%] Plugging dvd /opt/iso/testo-guest-additions.iso into virtual machine my_ubuntu
[ 33%] Typing "sudo su" with interval 30ms in virtual machine my_ubuntu
[ 33%] Pressing key ENTER on virtual machine my_ubuntu
[ 33%] Waiting password for my-ubuntu-login for 1m with interval 1s in virtual machine my_ubuntu
[ 33%] Typing "1111" with interval 30ms in virtual machine my_ubuntu
[ 33%] Pressing key ENTER on virtual machine my_ubuntu
[ 33%] Waiting root@my-ubuntu for 1m with interval 1s in virtual machine my_ubuntu
[ 33%] Typing "mount /dev/cdrom /media" with interval 30ms in virtual machine my_ubuntu
[ 33%] Pressing key ENTER on virtual machine my_ubuntu
[ 33%] Waiting mounting read-only for 1m with interval 1s in virtual machine my_ubuntu
[ 33%] Typing "dpkg -i /media/*.deb" with interval 30ms in virtual machine my_ubuntu
[ 33%] Pressing key ENTER on virtual machine my_ubuntu
[ 33%] Waiting Setting up testo-guest-additions for 1m with interval 1s in virtual machine my_ubuntu
[ 33%] Typing "umount /media" with interval 30ms in virtual machine my_ubuntu
[ 33%] Pressing key ENTER on virtual machine my_ubuntu
[ 33%] Sleeping in virtual machine my_ubuntu for 2s
[ 33%] Unplugging dvd from virtual machine my_ubuntu
[ 33%] Taking snapshot guest_additions_installation for virtual machine my_ubuntu
[ 67%] Test guest_additions_installation PASSED in 0h:0m:14s
[ 67%] Preparing the environment for test guest_additions_demo
[ 67%] Running test guest_additions_demo
[ 67%] Executing bash command in virtual machine my_ubuntu with timeout 10m
+ echo Hello world
Hello world
+ echo from bash
from bash
[ 67%] Executing python3 command in virtual machine my_ubuntu with timeout 10m
Hello from python3!
[ 67%] Taking snapshot guest_additions_demo for virtual machine my_ubuntu
[100%] Test guest_additions_demo PASSED in 0h:0m:3s
PROCESSED TOTAL 3 TESTS IN 0h:4m:42s
UP-TO-DATE: 0
RUN SUCCESSFULLY: 3
FAILED: 0
user$

Итоги

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

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

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

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