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

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

Объявление тестов

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

[[
    <attr1>: <value1>
    <attr2>: <value1>
    <attr3>: <value1>
]]
test <test_name>[: test_parent1, test_parent2, ...]
{
    command1
    command2
    ...
}

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

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

Название теста может быть выражено либо в виде идентификатора, либо в виде строки. В случае, если указывается строка, значение выражения внутри строки должно быть приводимым к идентификатору. Внутри строки можно использовать обращение к параметрам.

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

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

  • no_snapshots - Тип: логическая константа. В случае значения true, для участвующих виртуальных машин и флеш-накопителей не будут создаваться снепшоты гипервизора. Это может пригодиться для экономии места на диске. Значение по-умолчанию - false;
  • description - Тип: строка. Произвольное описание теста, которое затем будет сохранено в отчете о проведенных тестах в json-формате при указании аргумента командной строки json_report.

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

Формат команд

Логической единицей теста является команда. Формат команды выглядит следующим образом:

<vm_name | flash_drive_name> <action>

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

<vm_name | flash_drive_name> {
    action1
    action2
    action3; action4; action5
    action6;
    {
        action7; action8
    }
}

Для Hyper-V в командах могут участвовать только виртуальные машины. Команды с виртуальными флешками не поддерживаются.

Внутри блока действия необходимо разделять либо переносом строки, либо точкой с запятой.

Список действий, доступных для виртуальных машин, отличается от списка действий, доступных для флеш-накопителей.

В качестве команды также может служить вызов макроса, содержащего команды.

Параметризация имени виртуальной сущности

В качестве имени виртуальной сущности в командах может выступать как идентификатор (client, my_flash), так и строка ("client", "my_flash"). Оба варианта полностью эквивалентны и имеют право на применение.

Однако, применение строк имеет одно важное полезное свойство: внутри таких строк можно использовать обращение к параметрам. Это может быть особенно полезно при составлении макросов с командами, где с помощью такого приёма можно передавать имена виртуальных сущностей в качестве аргументов макроса.

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

Примеры

# Правильно, если client - это виртуальная машина
client type "hello world"

# Эквивалентно предыдущему
"client" type "Hello world"

# Правильно в любом случае,
# т.к. действие print доступно и для флешек и для машин
my_flash_drive print "Hello world"

# Эквивалентно предыдущему
"my_flash_drive" print "Hello world"

# Сработает только в том случае, если
# значение параметра равно имени одной из
# объявленных виртуальных машин
"${entity_name}" type "Hello world"

Порядок работы тестов

Выполнение теста можно разделить на четыре этапа:

  • Проверка кеша.
  • Подготовка среды выполнения.
  • Выполнение команд.
  • Фиксация среды выполнения.

Проверка кеша

Механизм кеширования играет важную роль в платформе Testo. Основная цель этого механизма заключается в экономии времени при пропуске прогона тех тестов, которые этого прогона не требуют.

При первом успешном прогоне любого теста, для этого теста создаётся кеш.

При планировании запуска ранее выполненного теста сначала проверяется актуальность его кеша. Если с момента последнего запуска в тесте не изменились существенные детали, то тест считается закешированным, и его фактического выполнения не происходит. Если же кеш считается недействительным, то сам тест и все его потомки помечаются флагом "необходимо выполнить". Ниже приведен список вопросов, которые платформа Testo считает существенными при определении закешированности теста:

  • Есть ли недействительный кеш хотя бы у одного родителя теста?
  • Изменился ли заголовок теста?
  • Изменились ли команды в теле теста?
  • Изменилось ли значение параметров, участвующих в тесте?
  • Изменилась ли существенно конфигурация виртуальных машин, участвующих в тесте?
  • Изменилась ли существенно конфигурация флеш-накопителей, участвующих в тесте?
  • Изменились ли контрольные суммы файлов, участвующих в действиях copyto?
  • Изменились ли контрольные суммы файлов, участвующих в действиях wait img, click img, check img?
  • Изменились ли контрольные суммы iso-образов, участвующих в действии plug dvd?

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

Помимо встроенных в Testo механизмов определения закешированности тестов, пользователь может вручную сбросить кеш у определенных тестов, используя аргумент командной строки invalidate <wildcard match>. При этом, сбрасывая кеш теста, пользователь автоматически сбрасывает кеш всех его потомков.

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

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

Подготовка среды выполнения

Если тест был помечен флагом "необходимо выполнить", то все виртуальные машины будут приведены в состояние, необходимое для проведения теста:

  • Будут созданы новые виртуальные машины, которые не использовались ранее в родительских тестах. При этом они останутся в выключенном состоянии, для их запуска необходимо указать действие start.
  • Если родительские тесты не были помечены атрибутом [no_snapshots], то Testo сможет восстановить снепшоты виртуальных машин и флеш-носителей и вернуть их в то состояние, в котором они находились на момент окончания родительских тестов.
  • Если родительские тесты имеют атрибут [no_snapshots], то у них отсутствуют снепшоты, которые можно было бы восстановить. В этом случае Testo проведет поиск вверх по иерархии "опорного теста", который не помечен как [no_snapshots], и восстановит состояние виртуальных машин и флеш-носителей в то состояние, в котором они были на момент окончания опорного теста. Затем последовательно будут выполнены все промежуточные родительские тесты, что вернёт виртуальные машины и флеш-накопители в нужное состояние.

Выполнение команд

Выполнение команд заключается в последовательном применении действий к виртуальным машинам или флешкам, указанным в начале команды.

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

Фиксация среды выполнения

После успешного выполнения теста платформа Testo зафиксирует состояния виртуальных машин на момент окончания тестов. Если тест не был помечен атрибутом [no_snapshots: true], то будут созданы снепшоты всех виртуальных машин и флеш-носителей. Помимо этого, будет обновлен кеш теста.