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

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

Oбъявление виртуальной машины

Для объявления виртуальных машин используется директива machine. Формат директивы выглядит следующим образом:

machine <name> {
    <attr1> [attr1_name]: <value1>
    <attr2> [attr2_name]: <value2>
    <attr3> [attr3_name]: <value3>
    ...
}

Объявление виртуальной машины само по себе не ведет к ее созданию в гипервизоре. Реальное создание виртуальной машины произойдет при запуске теста, в котором участвует эта машина.

Объявлять виртуальные машины можно и внутри макросов. Подробнее про это можно прочитать здесь.

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

Для виртуальной машины необходимо указать ее имя <name> в формате идентификатора или в формате строки. В случае, если указывается строка, значение выражения внутри строки должно быть приводимым к идентификатору. Внутри строки можно использовать обращение к параметрам. Имя виртуальной машины должно быть уникальным среди всех виртуальных сущностей (т.е. виртуальных машин, виртуальных флешек и виртуальных сетей).

Атрибут состоит из названия, имени (только для некоторых атрибутов) и обязательного значения. В настоящее время только три атрибута обязаны иметь имя - это атрибуты nic, disk и video. В качестве имени используется идентификатор, а в качестве значения могут выступать:

  • положительное целое число
  • спецификатор количества памяти
  • строка
  • логическая константа
  • группа вложенных атрибутов

Для виртуальной машины существует набор обязательных атрибутов, которые необходимо указать:

  • cpus - Тип: положительное целое число или строка. Количество ядер виртуального процессора. В случае, если указывается строка, значение выражения внутри строки должно быть приводимым к положительному целому числу. Внутри строки можно использовать обращение к параметрам.

  • ram - Тип: спецификатор количества памяти или строка. Количество оперативной памяти для виртуальной машины. В случае, если указывается строка, значение выражения внутри строки должно быть приводимым к спецификатору количества памяти. Внутри строки можно использовать обращение к параметрам.

  • как минимум одна секция disk. Тип: группа вложенных атрибутов. Требуется наличие имени. Описывает настройки жесткого диска.

    Необязательные атрибуты:

  • iso - Тип: строка. Путь к файлу с iso-образом, который будет загружен в виртуальный DVD-привод при создании виртуальной машины. Впоследствии образ можно изъять из DVD-привода с помощью действия unplug dvd. Внутри строки можно использовать обращение к параметрам.

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

  • Ровно одна секция video - Тип: группа вложенных атрибутов. Требуется наличие имени. Настройки видеоадаптера. Недоступно для Hyper-V.

  • loader - Тип: строка. Путь к файлу с образом загрузчика виртуальной машины. Внутри строки можно использовать обращение к параметрам. Недоступно для Hyper-V.

  • qemu_enable_usb3 - Тип: логическая константа. Активация контроллера USB 3 для виртуальной машины. При значении false задействуется контроллер USB 2. Значение по-умолчанию: true. Недоступно для Hyper-V.

Настройка жёстких дисков

Для настройки жестких дисков используется атрибут disk. Для каждого диска требуется свой экземпляр атрибута disk. Все экземпляры атрибута disk должны иметь уникальное имя в пределах конфигурации ВМ. В качестве значения должна выступать группа вложенных атрибутов. Набор атрибутов зависит от того, в каком режиме вы хотите настроить жёсткий диск.

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

Создание нового жёсткого диска

В этом режиме для виртуальной машины будет создан новый пустой жёсткий диск. Для активации этого режима нужно указать вложенный атрибут size, который будет означать размер создаваемого жесткого диска. Атрибут size должен быть спецификатором количества памяти или строкой. В случае, если указывается строка, значение выражения внутри строки должно быть приводимым к спецификатору количества памяти. Внутри строки можно использовать обращение к параметрам.

Импортирование существующего жёсткого диска

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

На текущий момент поддерживаются только импорт образов жёстких дисков в формате qcow2 при работе с гипервизором QEMU и в формате vhdx при работе с гипервизором Hyper-V.

С оригинальным образом диска ничего не произойдет - при создании виртуальной машины будет создана копия этого образа.

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

Атрибуты size и source являются взаимоисключающими - при использовании одного из них второй автоматически становится недоступен.

ВАЖНО! Пожалуйста, не пытайтесь установить гостевые дополнения testo-guest-additions в ручном режиме в виртуальной машине-шаблоне! Это может привести к непредсказуемым последствиям! Устанавливайте гостевые дополнения ТОЛЬКО в рамках тестовых сценариев!

Настройка сетевых адаптеров

Для указания сетевых адаптеров можно использовать атрибут nic. Для каждого сетевого адатера требуется свой экземпляр атрибута nic. Сетевой адаптер можно подключить либо к виртуальной сети (вложенный атрибут attached_to), либо к физическому интерфейсу хоста в режиме моста (вложенный атрибут attached_to_dev). Все экземпляры атрибута nic должны иметь уникальное имя в пределах конфигурации ВМ. В качестве значения должна выступать группа вложенных атрибутов:

Обязательные вложенные атрибуты для nic:

ОДИН из следующих атрибутов:

  • attached_to - Тип: строка. Имя сети, к которой подключается адаптер. Сеть должна быть предварительно объявлена с помощью директивы network. Нельзя применять вместе с атрибутом attached_to_dev.
  • attached_to_dev - Тип: строка. Имя сетевого интерфейса на хосте, к которому необходимо "подключить" виртуальный адаптер. Подключение происходит в режиме моста и позволяет получать доступ к сети Хоста из виртуальной машины. Нельзя применять вместе с атрибутом attached_to. Недоступно для Hyper-V.

Необязательные вложенные атрибуты для nic:

  • adapter_type - Тип: строка. Модель адаптера. От модели адаптера зависит то, какой драйвер будет использоваться при работе с этим адаптером. Значение атрибута может принимать одно из следующих значений: ne2k_pci, i82551, i82557b, i82559er, rtl8139, e1000, pcnet, virtio, sungem. Если не указать этот атрибут, то адаптер будет создан с моделью по-умолчанию, которая для гипервизора QEMU принимает значение rtl8139. Внутри строки можно использовать обращение к параметрам. Недоступно для Hyper-V.
  • mac - Тип: строка. MAC-адрес адаптера. Значение атрибута должно быть строкой в формате 00:11:22:33:44:55. Если не указать этот атрибут, то МАС-адрес будет сгенерирован гипервизором случайным образом. Внутри строки можно использовать обращение к параметрам.

Настройки видеоадаптера

Недоступно для Hyper-V.

Виртуальная машина всегда создаётся ровно с одним видеоадаптером. По-умолчанию модель этого видеоадаптера выбирается на основе возможностей гипервизора на данном компьютере. Чаще всего по умолчанию выбирается модель vmvga. Если же Вас не устраивает модель видеоадаптера по-умолчанию, то вы можете явно указать её.

Для этого в объявление виртуальной машины необходимо добавить атрибут video, который обязательно должен иметь имя.

В настоящий момент в объявлении виртуальных машин можно указывать ровно один атрибут video.

Атрибут video указывать необязательно - в этом случае будет создан видеоадаптер по-умолчанию.

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

  • adapter_type - Тип - строка. Модель видеоадаптера. Возможные значения: vmvga, qxl, cirrus, virtio. Внутри строки можно использовать обращение к параметрам.

Настройки загрузчика виртуальной машины

Недоступно для Hyper-V.

По умолчанию виртуальные машины используют SeaBIOS для загрузки. Если Вы хотите использовать другой загрузчик (например, UEFI), то Вам необходимо указать путь к образу с этим загрузчиком в атрибуте loader.

Например, Вы можете включить UEFI в виртуальной машине следующим образом: скачайте OVMF и укажите путь к файлу OVMF_CODE.fd в атрибуте loader (см. пример ниже).

Настройки общих папок (shared folder)

Недоступно для Hyper-V.

Для работы потребуется установить Testo guest additions на виртуальную машину.

Общие папки - ещё один механизм Testo для обмена данными между хостом и виртуальными машинами (наряду с флешками и гостевыми дополнениями). Для их использования нужно проделать два шага:

1. Секция shared_folder

В объявлении виртуальной машины требуется создать одну или несколько секций shared_folder:

shared_folder my_folder: {
    host_path: "/opt/shared_folder"
    readoly: false
}

Обратите внимание, что эта секция является именованной (имена общих папок должны быть уникальными в пределах одной машины). Внутри секции доступны следующие атрибуты:

Обязательные вложенные атрибуты для shared_folder:

  • host_path - Тип: строка. Путь к общей папке на стороне хоста. Папка должна существовать. Внутри строки можно использовать обращение к параметрам.

Необязательные вложенные атрибуты для shared_folder:

  • readonly - Тип: логическая константа. Указывает, должен ли быть включен режим readonly для общей папки. Если этот режим включен, виртуальная машина не сможет записывать данные в папку в ходе выполнения тестов. Значение по-умолчанию: false.

2. Монтирование папки в машине

Для активации общей папки внутри тестовых сценариев необходимо внутри виртуальной машины вызвать команду testo-guest-additions-cli mount:

testo-guest-additions-cli mount <folder_name> <path_to_folder_on_guest> [--permanent]

Где

  • folder_name - имя общей папки в том виде, в котором она указана в конфигурации виртуальной машины (т.е. my_folder в примере выше);
  • path_to_folder_on_guest - путь к общей папке внутри виртуальной машины;
  • permanent - опция, включающая автоматическое примонтирование общей папки внутри виртуальной машины после перезагрузок.

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

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

Нужно позаботиться о том, чтобы у процесса qemu не было проблем с доступом на чтение и запись в общие папки на стороне хоста. Один из способов это сделать - поменять пользователя от имени которого запускается QEMU - для этого добавьте строку user = "your_user" в файл /etc/libvirt/qemu.conf, где your_user - пользователь, которому принадлежит общая папка. Также потребуется перезагрузить машину.

Пример

Нижеприведенная конфигурация является корректной только при использовании QEMU. Для других гипервизоров часть атрибутов не поддерживается.

Ниже представлен итоговый пример конфигурации виртуальной машины. Основные свойства такой виртуальной машины:

  1. При создании такой виртуальной машины в виртуальный DVD-привод будет загружен iso-файл с установочным образом Ubuntu Server 16.04
  2. Для виртуальной машины будет создано два жёстких диска: основной main, который будет импортирован из существующего образа жёсткого диска (из заранее созданной вручную виртуальной машины my_hand_made_vm), а также пустой вспомогательный диск secondary, который будет сгенерирован автоматически и будет иметь размер, указанный в параметре size_amount.
  3. Виртуальная машина будет иметь 3 сетевых адаптера: адаптер nat будет использоваться для соединения виртуальной машины с Интернетом, адаптеры WAN и LAN будут нужны для внутренних соединений с другими виртуальными машинами (через изолированные сети net1 и net2).

Нужно отметить, что значения ${ISO_DIR}, ${VM_DISK_POOL_DIR} и ${size_amount} будут вычислены исходя из значения параметров ISO_DIR, VM_DISK_POOL_DIR и ${size_amount} (предполагается, что значения этих параметров будут передаваться через аргументы командной строки --param). Если любой из этих параметров не задан, будет сгенерировано сообщение об ошибке. Для атрибута size также действует дополнительное ограничение: значение параметра size_amount должно успешно преобразовываться в количество памяти (например, "2Gb"). Если преобразование выполнено неудачно, сгенерируется ошибка.

machine example_machine {
    cpus: 1
    ram: 1024Mb
    iso: "${ISO_DIR}/ubuntu-16.04.6-server-amd64.iso"

    disk main: {
        source: "${VM_DISK_POOL_DIR}/my_hand_made_vm.qcow2"
    }

    disk secondary: {
        size: "${size_amount}"
    }

    nic nat: {
        attached_to: "nat"
        adapter_type: "e1000"
    }

    nic WAN: {
        attached_to: "net2"
        mac: "52:54:00:00:00:00"
        adapter_type: "e1000"
    }

    nic LAN: {
        attached_to: "net1"
        mac: "52:54:00:00:00:11"
        adapter_type: "e1000"
    }

    nic HostNIC: {
        attached_to: "eth0" # The Host must have a NIC named "eth0"
        adapter_type: "e1000"
    }

    video main: {
        adapter_type: "qxl"
    }

    shared_folder my_folder: {
        host_path: "/opt/shared_folder"
        readoly: false
    }

    loader: "/usr/share/OVMF/OVMF_CODE.fd"

    qemu_enable_usb3: false
}

Кешируемость виртуальных машин

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

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

  • Изменилось ли значение какого-либа атрибута в объявлении виртуальной машины?
  • Изменился ли файл, указанный в атрибуте iso?
  • Изменились ли файлы, указанный в податрибуте source атрибута disk?
  • Изменились ли конфигурации виртуальных сетей, которые указаны в атрибуте attached_to в секции вложенных атрибутов для сетевых адаптеров nic?
  • Изменился ли файл, указанный в атрибуте loader?

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

Существует два режима подсчета целостности файлов, участвующих в атрибутах iso, loader и source секции disk. Если размер файла меньше или равен 1 МБ (чего не бывает, в принципе, никогда), то контроль целостности выполняется на основе содержимого файла. Иначе в расчёт берётся только временная метка с датой последнего изменения файла. При необходимости порог смены режимов подсчёта можно менять с помощью аргумента командной строки content_cksum_maxsize.

Подготовка виртуальных машин в ручном режиме

Тестовые сценарии в языке Testo-lang предполагают документирование в виде скриптов всех действий с виртуальными машинами с момента их создания. Такой подход позволяет платформе Testo разворачивать виртуальные тестовые стенды, имея в распоряжении только текстовые файлы .testo (которые удобно хранить) и несколько дополнительных iso-файлов, чтобы с их помощью можно было установить ОС на виртуальную машину. Таким образом весь процесс развертки и настройки стенда находится у Вас перед глазами (в виде скриптов), и Вы при необходимости лего можете внести в него изменения.

Тем не менее, такой подход, разумеется, имеет и недостатки: процесс автомтаизации вообще всех действий (с самого начала), которые происходят с виртуальной машиной, может быть утомительным и иногда ненужным. Поэтому в Testo-lang существует возможность для альтернативного подхода.

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

  1. Создайте собственноручно виртуальную машину. Вы можете выбрать наиболее удобную Вам конфигурацию, но по возможности постарайтесь приблизить эту конфигурацию к конфигурации будущей виртуальной машины для прогона тестов;
  2. Приведите собственную виртуальную машину в желаемое состояние (установите ОС, сторонние программы, выставьте желаемые настройки);
  3. Выключите виртуальную машину;
  4. В тестовом сценарии создайте виртуальную машину и импортируйте образ диска от вашей собственноручно настроенной виртуальной машины (укажите путь к этому образу в source).

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

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

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

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