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

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

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

В этой части вы познакомитесь с процессом установки и использования гостевых дополнений на примере ОС Ubuntu Server 16.04

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

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

Вступление

В прошлой части мы научились автоматизировать установку Ubuntu Server 16.04 и познакомились с основными действиями в языке Testo-lang, которые позволяют имитировать действия человека. Такой подход хорош с двух точек зрения:

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

Однако имитация действий человека обладает и одним недостатком: неудобное выполнение консольных команд и других вспомогательных действий. Вы и сами могли в этом убедиться в прошлом гайде: для того, чтобы выполнить bash-команду ping 8.8.8.8 -c5, имитируя действия человека, нам пришлось написать следующий скрипт:

type "ping 8.8.8.8 -c5 && echo Result is &?"; press Enter
wait "Result is 0" timeout 10s

При этом, конечно, было бы удобно выполнить какое-то одно действие вроде

exec bash "ping 8.8.8.8 -c5"

И положиться на код возврата этой команды.

Платформа Testo помогает решить эту проблему и предоставляет гостевые дополнения для виртуальных машин с разными ОС, в том числе Linux-дистрибутивах Ubuntu и CentOS, а также Windows 7 и Windows 10. Наличие установленных гостевых дополнений на виртуальной машине открывает возможность использовать новые действия: exec - выполнение скриптов на разнах языках, copyto - копирование файлов внутрь виртуальной машины с хоста и copyfrom - копирование файлов из виртуальной машины на хост.

Гостевые дополнения рекомендуется устанавливать на виртуальные машины в двух случаях:

  1. Если виртуальная машина является вспомогательной и её целостность Вас не слишком волнует.
  2. Если наличие гостевых дополнений никак не влияет на поведение тестируемого ПО.

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

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

Для работы гостевых дополнений требуется некоторая поддержка со стороны гостевых виртуальных машин. С случае с гипервизором Hyper-V (с которым взаимодействует Testo в Windows) это выражается в том, что гостевая система должна поддерживать работу с сокетами Hyper-V - специальным механизмом гипервизора, который позволяет обмениваться данными между гостевой системой и хостом.

Гостевые виртуальные машины с ОС Windows на борту уже имеют поддержку этих сокетов по-умолчанию. Но с ОС на основе Linux не всё так однозначно: часть дистрибутивов имеют эту поддержку по-умолчанию (как, например, CentOS), а в части дистрибутивов эту поддержку нужно включать отдельно. В некоторых Linux-дистрибутивах для включения этой поддержки нужно и вовсе собирать нужный модуль ядра из исходных кодов.

Мы используем в тестовых сценариях Ubuntu Server 16. Поддержка Hyper-V сокетов реализована в модуле ядра hv_sock, но по-умолчанию он отсутствует. После установки ОС можно убедиться, что этот модуль в ядре отсутствует, и загрузить его мы не можем:

hv_sock_missing

Дело в том, что модуль hv_sock не включен в стандартное ядро Linux, идущее в комплекте с Ubuntu Server 16. Зато этот модуль включен в ядро linux-azure, которое можно установить через пакетный менеджер apt.

После того, как мы загрузим модуль ядра hv_sock, нам останется лишь подключить iso-образ с гостевыми дополнениями testo-guest-additions.iso и выполнить установку .deb-пакета, который расположен в этом iso-образе.

Итого, получается такой план:

  1. Установить пакет linux-azure.
  2. Перезагрузить машину.
  3. Загрузить модуль hv_sock в ядро.
  4. Подключить iso-образ с дополнениями в виртуальный DVD-привод виртуальной машины.
  5. Смонтировать подключенный dvd-привод в файловую систему ОС (при необходимости, если этого не происходит автоматически).
  6. Выполнить установку гостевых дополнений в системе (способ зависит от целевой ОС).

Шаги 1-3 могут отличаться в зависимости от ОС виртуальной машины. Как уже упоминалось, в каких-то ОС поддержка Hyper-V сокетов уже включена по-умолчанию. В других же включение этой поддержки может существенно отличаться. В случае возникновения вопросов о поддержке Hyper-V сокетов в вашей ОС напишите нам на почту support@testo-lang.ru

Обратите внимание, что в приведенным выше сценарии требуется доступ в Интернет из виртуальной машины.

Подготавливаем Ubuntu Server

Для начала разберемся с установкой пакета linux-azure. Мы разобьем этот процесс на простые конкретные шаги:

  1. Войдем в режим супер-пользователя (sudo su).
  2. Перезагрузим DHCP-настройки на интерфейса eth0 (который обеспечивает доступ в Интернет). Здесь требуется небольшое пояснение. Как мы узнали из предыдущего гайда, Testo запускает только те тесты, в которых произошли какие-то изменения. Т.к. тест ubuntu_installation не менялся с момента окончания прошлого гайда, то и прогоняться он не будет. Вместо этого состояние машины my_ubuntu будет восстановлено из снепшота, который был создан в момент окончания теста ubuntu_installation. Но проблема в том, что иногда при восстановлении снепшота сетевые настройки интерфейса "зависают" и для их реабилитации нужно перезагрузить интерфейс. Данная проблема актуальна для Hyper-V.
  3. Выполним команду apt update и убедимся, что пакетный менеджер готов к использованию.
  4. Выполним команду apt install -y linux-azure.
  5. Перезагрузим машину (reboot).
  6. Выполним логин и снова войдем в режим супер-вользователя.
  7. Выполним загрузку модуля ядра hv_sock и убедимся, что этот модуль действительно загрузился.

Всё это будет происходить в рамках теста ubuntu_prepare, который будет наследоваться от теста ubuntu_installation. Тест check_internet из предыдущего гайда нам не нужен, его можно удалить.

test ubuntu_prepare: ubuntu_installation {
    my_ubuntu {
        type "sudo su"; press Enter
        wait "password for my-ubuntu-login"; type "1111"; press Enter
        wait "root@my-ubuntu"

        abort "stop here"

        type "dhclient -r eth0 && dhclient eth0 && echo Result is $?"; press Enter

        type "clear && apt update && echo Result is $?"; press Enter
        wait "Result is 0"

        type "clear && apt install -y linux-azure && echo Result is $?"; press Enter
        wait "Result is 0" timeout 15m      

        type "reboot"; press Enter

        wait "login:" timeout 2m; type "my-ubuntu-login"; press Enter
        wait "Password:"; type "1111"; press Enter
        wait "Welcome to Ubuntu"

        type "sudo su"; press Enter;
        wait "password for my-ubuntu-login"; type "1111"; press Enter
        wait "root@my-ubuntu"

        type "clear && modprobe hv_sock && echo Result is $?"; press Enter;
        wait "Result is 0"

        type "clear && lsmod | grep hv"; press Enter
        wait "hv_sock"
    }
}

В этом тесте есть несколько интересных моментов, на которые стоит обратить внимание:

  1. Для выполнения баш-команд используется связка clear, command, echo Result is $?, wait "Result is $?". Эта связка переводится на человеческий язык так: очистить экран, выполнить команду, вывести сообщение о коде возврата команды, и проверить, что код возврата действительно 0 (то есть всё хорошо). Очищать экран нужно для того чтобы избавиться от информации о предыдущих командах, которая может вмешаться в проверку результата новой команды.
  2. Для проверки того, что модуль загружен успешно, мы выводим на экран все модули, в названии которых есть символы hv. Если среди этих модулей есть hv_sock, то он будет выведен на экран, где его сможет "подхватить" действие wait "hv_sock".

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

Давайте попробуем выполнить такой тест:

C:\Users\Testo> testo run guest_additions.testo --stop_on_fail --test_spec ubuntu_prepare
UP-TO-DATE TESTS:
ubuntu_installation
TESTS TO RUN:
ubuntu_prepare
[ 50%] Preparing the environment for test ubuntu_prepare
[ 50%] Restoring snapshot ubuntu_installation for virtual machine my_ubuntu
[ 50%] Running test ubuntu_prepare
[ 50%] Typing "sudo su" with interval 30ms in virtual machine my_ubuntu
[ 50%] Pressing key ENTER in virtual machine my_ubuntu
[ 50%] Waiting "password for my-ubuntu-login" for 1m with interval 1s in virtual machine my_ubuntu
[ 50%] Typing "1111" with interval 30ms in virtual machine my_ubuntu
[ 50%] Pressing key ENTER in virtual machine my_ubuntu
[ 50%] Waiting "root@my-ubuntu" for 1m with interval 1s in virtual machine my_ubuntu
[ 50%] Typing "dhclient -r eth0 && dhclient eth0 && echo Result is $?" with interval 30ms in virtual machine my_ubuntu
[ 50%] Pressing key ENTER in virtual machine my_ubuntu
[ 50%] Typing "clear && apt update && 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 && apt install -y linux-azure && 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 15m with interval 1s in virtual machine my_ubuntu
[ 50%] Typing "reboot" with interval 30ms in virtual machine my_ubuntu
[ 50%] Pressing key ENTER in virtual machine my_ubuntu
[ 50%] Waiting "login:" for 2m with interval 1s in virtual machine my_ubuntu
[ 50%] Typing "my-ubuntu-login" with interval 30ms in virtual machine my_ubuntu
[ 50%] Pressing key ENTER in virtual machine my_ubuntu
[ 50%] Waiting "Password:" for 1m with interval 1s in virtual machine my_ubuntu
[ 50%] Typing "1111" with interval 30ms in virtual machine my_ubuntu
[ 50%] Pressing key ENTER in virtual machine my_ubuntu
[ 50%] Waiting "Welcome to Ubuntu" for 1m with interval 1s in virtual machine my_ubuntu
[ 50%] Typing "sudo su" with interval 30ms in virtual machine my_ubuntu
[ 50%] Pressing key ENTER in virtual machine my_ubuntu
[ 50%] Waiting "password for my-ubuntu-login" for 1m with interval 1s in virtual machine my_ubuntu
[ 50%] Typing "1111" with interval 30ms in virtual machine my_ubuntu
[ 50%] Pressing key ENTER in virtual machine my_ubuntu
[ 50%] Waiting "root@my-ubuntu" for 1m with interval 1s in virtual machine my_ubuntu
[ 50%] Typing "clear && modprobe hv_sock && 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 && lsmod | grep hv" with interval 30ms in virtual machine my_ubuntu
[ 50%] Pressing key ENTER in virtual machine my_ubuntu
[ 50%] Waiting "hv_sock" for 1m with interval 1s in virtual machine my_ubuntu
[ 50%] Taking snapshot ubuntu_prepare for virtual machine my_ubuntu
[100%] Test ubuntu_prepare PASSED in 0h:5m:44s
PROCESSED TOTAL 2 TESTS IN 0h:5m:44s
UP-TO-DATE: 1
RUN SUCCESSFULLY: 1
FAILED: 0
C:\Users\Testo>

Как видим, все прошло успешно. Тест зафиксировался, и был создан соотсветствующий снепшот: второй раз просто так этот тест прогоняться не будет.

Устанавливаем дополнения

Пора переходить к установке самих дополнений. Для этого создадим ещё один тест ubuntu_install_guest_additions, который будет зависеть от ubuntu_prepare, который мы только что сделали. У нас уже вырисовывается целое дерево тестов.

В прошлой части мы познакомились с действием unplug dvd, которое извлекает текущий подключенный iso-образ из виртуального DVD-привода. Конечно, есть действие plug dvd и для обратного действия, для подключения iso-образа. Это действие, в отличие от unplug dvd, принимает аргумент - путь к iso-образу, который необходимо подключить.

test ubuntu_install_guest_additions: ubuntu_prepare {
    my_ubuntu {
        plug dvd "C:\\iso\\testo-guest-additions-hyperv.iso"
        abort "stop here"
    }
}

Убедитесь, что вы скачали именно гостевые дополнения для гипервизора Hyper-V. Не перепутайте их с гостевыми дополнениями для QEMU!

Попробуйте запустить такой сценарий (не забудьте аргумент --stop_on_fail), дождитесь точки останова и с помощью диспетчера Hyper-V зайдите в свойства виртуальной машины. В разделе, посвященном CDROM, вы сможете найти информацию о подключенном iso-образе:

CDROM plugged

Теперь нам необходимо смонтировать подключенный dvd-привод в файловую систему Ubuntu и установить deb-пакет из ISO-образа:

test ubuntu_install_guest_additions: ubuntu_prepare {
    my_ubuntu {
        plug dvd "C:\\iso\\testo-guest-additions-hyperv.iso"

        type "mount /dev/cdrom /media"; press Enter
        wait "mounting read-only"
        type "clear && dpkg -i /media/*.deb && echo Result is $?"; press Enter;
        wait "Result is 0"
        type "clear && umount /media && echo Result is $?"; press Enter;
        wait "Result is 0"
        sleep 2s
        unplug dvd
    }
}

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

C:\Users\Testo> testo run guest_additions.testo --stop_on_fail --test_spec ubuntu_install_guest_additions
UP-TO-DATE TESTS:
ubuntu_installation
ubuntu_prepare
TESTS TO RUN:
ubuntu_install_guest_additions
[ 67%] Preparing the environment for test ubuntu_install_guest_additions
[ 67%] Restoring snapshot ubuntu_prepare for virtual machine my_ubuntu
[ 67%] Running test ubuntu_install_guest_additions
[ 67%] Plugging dvd C:/iso/testo-guest-additions-hyperv.iso into virtual machine my_ubuntu
[ 67%] Typing "mount /dev/cdrom /media" with interval 30ms in virtual machine my_ubuntu
[ 67%] Pressing key ENTER in virtual machine my_ubuntu
[ 67%] Waiting "mounting read-only" for 1m with interval 1s in virtual machine my_ubuntu
[ 67%] Typing "clear && dpkg -i /media/*.deb && echo Result is $?" with interval 30ms in virtual machine my_ubuntu
[ 67%] Pressing key ENTER in virtual machine my_ubuntu
[ 67%] Waiting "Result is 0" for 1m with interval 1s in virtual machine my_ubuntu
[ 67%] Typing "clear && umount /media && echo Result is $?" with interval 30ms in virtual machine my_ubuntu
[ 67%] Pressing key ENTER in virtual machine my_ubuntu
[ 67%] Waiting "Result is 0" for 1m with interval 1s in virtual machine my_ubuntu
[ 67%] Sleeping in virtual machine my_ubuntu for 2s
[ 67%] Unplugging dvd from virtual machine my_ubuntu
[ 67%] Taking snapshot ubuntu_install_guest_additions for virtual machine my_ubuntu
[100%] Test ubuntu_install_guest_additions PASSED in 0h:0m:19s
PROCESSED TOTAL 3 TESTS IN 0h:0m:19s
UP-TO-DATE: 2
RUN SUCCESSFULLY: 1
FAILED: 0
C:\Users\Testo>

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

Пробуем гостевые дополнения в деле

Для тестирования гостевых дополнений сделаем новый производный тест, который теперь будет зависеть от ubuntu_install_guest_additions. После установки гостевых дополнений у нас появляется в арсенале несколько новых действий. В этой части мы сосредоточимся на действии exec. Попробуем выполнить баш-скрипт, который выводит на экран "Hello world!" (Можно обойтись без точки останова abort)

test ubuntu_guest_additions_demo: ubuntu_install_guest_additions {
    my_ubuntu {
        exec bash "echo Hello world"
    }
}

Результат будет таким

C:\Users\Testo> testo run guest_additions.testo --stop_on_fail --test_spec ubuntu_guest_additions_demo
UP-TO-DATE TESTS:
ubuntu_installation
ubuntu_prepare
ubuntu_install_guest_additions
TESTS TO RUN:
ubuntu_guest_additions_demo
[ 75%] Preparing the environment for test ubuntu_guest_additions_demo
[ 75%] Restoring snapshot ubuntu_install_guest_additions for virtual machine my_ubuntu
[ 75%] Running test ubuntu_guest_additions_demo
[ 75%] Executing bash command in virtual machine my_ubuntu with timeout 10m
+ echo Hello world
Hello world
[ 75%] Taking snapshot ubuntu_guest_additions_demo for virtual machine my_ubuntu
[100%] Test ubuntu_guest_additions_demo PASSED in 0h:0m:4s
PROCESSED TOTAL 4 TESTS IN 0h:0m:4s
UP-TO-DATE: 3
RUN SUCCESSFULLY: 1
FAILED: 0
C:\Users\Testo>

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

test ubuntu_guest_additions_demo: ubuntu_install_guest_additions {
    my_ubuntu {
        exec bash """
            echo Hello world
            echo from bash
        """
        #Двойные кавычки внутри скриптов необходимо экранировать
        exec python2 "print('Hello from python2!')"
        exec python3 "print('Hello from python3!')"
    }
}
C:\Users\Testo> testo run guest_additions.testo --stop_on_fail --test_spec ubuntu_guest_additions_demo
Because of the cache loss, Testo is scheduled to run the following tests:
- ubuntu_guest_additions_demo
Do you confirm running them? [y/N]: y
UP-TO-DATE TESTS:
ubuntu_installation
ubuntu_prepare
ubuntu_install_guest_additions
TESTS TO RUN:
ubuntu_guest_additions_demo
[ 75%] Preparing the environment for test ubuntu_guest_additions_demo
[ 75%] Restoring snapshot ubuntu_install_guest_additions for virtual machine my_ubuntu
[ 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:5s
PROCESSED TOTAL 4 TESTS IN 0h:0m:5s
UP-TO-DATE: 3
RUN SUCCESSFULLY: 1
FAILED: 0
C:\Users\Testo>

С остальными возможностями гостевых дополнений мы познакомимся в следующих уроках.

Итоги

Гостевые дополнения позволяют существенно упростить работу с командами внутри виртуальной машины. Их можно (и нужно) устанавливать всегда, когда эти самые дополнения не мешают проведению тестов.

В результате этого урока у нас получилось следующее дерево тестов

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