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

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

Часть 3. Гостевые дополнения

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

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

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

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

Вступление

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

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

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

type "command_to_execute";
press Enter
type "echo Result is $?"; press Enter
wait "Result is 0"

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

exec bash "command_to_execute"

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

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

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

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

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

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

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

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

Давайте вернемся к тому тестовому сценарию, который у нас получился в конце прошлой части, где мы автоматизировали установку Ubuntu Server 16.04.

Начнем с того, что переименуем тест my_first_test во что-то более осмысленное. Например, в ubuntu_installation:

test ubuntu_installation {
    my_ubuntu {
        start
        wait "English"
        ...
        wait "login:" timeout 2m; type "my-ubuntu-login"; press Enter
        wait "Password:"; type "1111"; press Enter
        wait "Welcome to Ubuntu"
    }
}

Пока не следует запускать новый сценарий, мы сделаем это немного позже. Давайте лучше приступим к установке гостевых дополнений на нашу машину my_ubuntu.

Для этого необходимо познакомиться с понятием иерархии тестов. Если вкратце - то все тесты выстраиваются по принципу "от простого к сложному", при этом более сложный (дочерний) тест зависит от результата работы более простого (родительского) теста. Тест может иметь несколько родителей и несколько потомков. Самые простые тесты, которые не зависят ни от кого (и не имеют родителей), называются базовыми. В нашем примере тест ubuntu_installation как раз является базовым тестом.

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

test guest_additions_installation: ubuntu_installation {
    my_ubuntu {
        abort "stop here"
    }
}

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

Для этого давайте запустим прогон тестового сценария, но при этом используем новый аргумент командной строки --test_spec. Этот аргумент позволяет указывать, какой именно тест мы хотим выполнить (вместо того, чтобы выполнять все тесты подряд). Запустив выполнение, мы увидим следующую информацию:

user$ sudo testo run ~/testo/hello_world.testo --stop_on_fail --test_spec guest_additions_installation
TESTS TO RUN:
ubuntu_installation
guest_additions_installation
[ 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
[ 50%] Test ubuntu_installation PASSED in 0h:4m:22s
[ 50%] Preparing the environment for test guest_additions_installation
[ 50%] Running test guest_additions_installation
/home/alex/testo/hello_world.testo:52:3: Caught abort action on virtual machine my_ubuntu with message: stop here
[100%] Test guest_additions_installation FAILED in 0h:0m:0s
user$

В начале вывода мы видим, что платорма Testo запланировала прогон теста ubuntu_installation, несмотря на то, что мы попросили запустить только guest_additions_installation. Это происходит потому, что мы пытаемся прогнать дочерний тест, при том что родительский тест еще не был проведен успешно. Поэтому платформа Testo автоматически попытается прогнать сначала базовый тест, а только затем перейдет к производному.

Но разве мы не устанавливали уже успешно Ubuntu? В конце прошлой части мы закончили на том, что Ubuntu Server уже была успешно установлена, тест закончился, и состояние должно было зафиксироваться.

Однако на самом деле тогда наш тест назывался my_first_test, и после переименования его в ubuntu_installation он выглядит для платформы Testo как совершенно новый тест, который никогда до этого не прогонялся.

В конце вывода мы увидим, что базовый тест был успешно выполнен, Testo приступило к прогону второго теста, но он закончился с ошибкой (из-за действия abort).

Если мы еще раз запустим Testo, то увидим уже следующее:

user$ sudo testo run ~/testo/hello_world.testo --stop_on_fail --test_spec guest_additions_installation
UP-TO-DATE TESTS:
ubuntu_installation
TESTS TO RUN:
guest_additions_installation
[ 50%] Preparing the environment for test guest_additions_installation
[ 50%] Restoring snapshot ubuntu_installation for virtual machine my_ubuntu
[ 50%] Running test guest_additions_installation
/home/alex/testo/hello_world.testo:52:3: Caught abort action on virtual machine my_ubuntu with message: stop here
[100%] Test guest_additions_installation FAILED in 0h:0m:0s
user$

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

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

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

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

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

CDROM plugged

Теперь нам необходимо смонтировать подключенный dvd-привод в файловую систему Ubuntu. Т.к. для этого требуются root-права, то можно для начала войти в sudo-режим:

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"

        abort "stop here"
    }
}

Ну а теперь переходим к установке самих дополнений. В конце не забудем отмонтировать cdrom и вытащить iso-образ из виртуального dvd-привода

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"

        type "mount /dev/cdrom /media"; press Enter
        wait "mounting read-only"; type "dpkg -i /media/*.deb"; press Enter;
        wait "Setting up testo-guest-additions"
        type "umount /media"; press Enter;

        #Дадим немного времени для команды umount
        sleep 2s
        unplug dvd
    }
}

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

В конце можно убрать abort и зафиксировать тест.

user$ sudo testo run ~/testo/hello_world.testo --stop_on_fail --test_spec guest_additions_installation
UP-TO-DATE TESTS:
ubuntu_installation
TESTS TO RUN:
guest_additions_installation
[ 50%] Preparing the environment for test guest_additions_installation
[ 50%] Restoring snapshot ubuntu_installation for virtual machine my_ubuntu
[ 50%] Running test guest_additions_installation
[ 50%] Plugging dvd /opt/iso/testo-guest-additions.iso into virtual machine my_ubuntu
[ 50%] Typing "sudo su" with interval 30ms in virtual machine my_ubuntu
[ 50%] Pressing key ENTER on 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 on virtual machine my_ubuntu
[ 50%] Waiting root@my-ubuntu for 1m with interval 1s in virtual machine my_ubuntu
[ 50%] Typing "mount /dev/cdrom /media" with interval 30ms in virtual machine my_ubuntu
[ 50%] Pressing key ENTER on virtual machine my_ubuntu
[ 50%] Waiting mounting read-only for 1m with interval 1s in virtual machine my_ubuntu
[ 50%] Typing "dpkg -i /media/*.deb" with interval 30ms in virtual machine my_ubuntu
[ 50%] Pressing key ENTER on virtual machine my_ubuntu
[ 50%] Waiting Setting up testo-guest-additions for 1m with interval 1s in virtual machine my_ubuntu
[ 50%] Typing "umount /media" with interval 30ms in virtual machine my_ubuntu
[ 50%] Pressing key ENTER on virtual machine my_ubuntu
[ 50%] Sleeping in virtual machine my_ubuntu for 2s
[ 50%] Unplugging dvd from virtual machine my_ubuntu
[ 50%] Taking snapshot guest_additions_installation for virtual machine my_ubuntu
[100%] Test guest_additions_installation PASSED in 0h:0m:17s
PROCESSED TOTAL 2 TESTS IN 0h:0m:17s
UP-TO-DATE: 1
RUN SUCCESSFULLY: 1
FAILED: 0
user$

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

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

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

test guest_additions_demo: guest_additions_installation {
    my_ubuntu {
        exec bash "echo Hello world"
    }
}

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

user$ sudo testo run ~/testo/hello_world.testo --stop_on_fail --test_spec guest_additions_demo
UP-TO-DATE TESTS:
ubuntu_installation
guest_additions_installation
TESTS TO RUN:
guest_additions_demo
[ 67%] Preparing the environment for test guest_additions_demo
[ 67%] Restoring snapshot guest_additions_installation for virtual machine my_ubuntu
[ 67%] Running test guest_additions_demo
[ 67%] Executing bash command in virtual machine my_ubuntu with timeout 10m
+ echo Hello world
Hello world
[ 67%] Taking snapshot guest_additions_demo for virtual machine my_ubuntu
[100%] Test guest_additions_demo PASSED in 0h:0m:4s
PROCESSED TOTAL 3 TESTS IN 0h:0m:4s
UP-TO-DATE: 2
RUN SUCCESSFULLY: 1
FAILED: 0
user$

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

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

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

Итоги

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

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