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

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

Часть 1. Самый первый тест

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

В этом первом уроке вы познакомитесь:

  1. С основами объявления и создания виртуальных машин в тестовых сценариях
  2. С атрибутом командной строки stop_on_fail
  3. С режимом очистки созданных сущностей (testo clean)

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

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

Вступление

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

Следуя этой идеологии, в платформе Testo в качестве Тестируемой Системы (System Under Test - SUT) используется не сама программа, а целый виртуальный стенд, который может включать в себя виртуальные машины, виртуальные флешки и виртуальные сети.

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

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

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

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

Давайте рассмотрим все эти принципы на примере.

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

С чего необходимо начинать разработку тестовых сценарирев в платформе Testo?

Все тестовые сценарии хранятся в обычных текстовых файликах с расширением .testo. Тестовые сценарии разделяются на две больших составляющие:

  1. Объявление виртуальной инфраструктуры.
  2. Описание действий, которые необходимо применить к этой виртуальной инфраструктуре.

Итак, начинать разработку тестовых сценариев необходимо с объявления виртуальной инфраструктуры. Для этого используются специальные директивы: machine (виртуальная машина), flash (виртуальная флешка) и network - виртуальная сеть. В этой части мы рассмотрим только объявление виртуальной машины.

Давайте создадим пустой файлик ~\testo\hello_world.testo и объявим в этом файлике первую собственную виртуальную машину:

machine my_ubuntu {
    cpus: 1
    ram: 512Mb
    disk main: {
        size: 5Gb
    }
    iso: "C:\\iso\\ubuntu_server.iso"
}

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

У виртуальной машины есть ряд атрибутов. Некоторые атрибуты являются обязательными, другие - опциональными. Обязательных атрибутов всего 3: cpus, ram и disk. Атрибут iso является необязательным, но для наших тестовых сценариев он нам понадобится. Рассмотрим атрибуты подробнее.

  • cpus: количество ядер в процессоре виртуальной машины
  • ram: количество оперативной памяти виртуальной машины
  • iso: путь к iso-образу, который будет смонтирован в виртуальный CDROM виртуальной машины при её создании.
  • disk main: Настройки жёсткого диска виртуальной машины. Жёсткий диск можно сконфигурировать в двух режимах: автоматическое создание нового диска и импорт существующего жёсткого диска. Пока что мы рассмотрим режим создания нового диска. Для активации этого режима необходимо указать желаемый размер создаваемого диска. Обратите внимание, что этот атрибут должен иметь имя - в нашем случае мы назвали жёсткий диск main. При необходимости мы могли бы создать несколько жёстких дисков.

В качестве первой виртуальной машины мы будем использовать Ubuntu Server 16.04 с одним ядром, 512 Мегабайтами RAM и одним диском размером 5 Гигабайт. В качестве атрибута iso мы указываем путь к установочному iso-образу Ubuntu Server, который необходимо было скачать ранее.

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

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

Попробуем запустить

Итак, мы закончили объявление виртуальной инфраструктуры нашего первого тестового проекта. Давайте попробуем запустить такой тестовый сценарий.

Для запуска Testo нужно открыть командный терминал (cmd) от имени администратора

Если всё было сделано правильно, то вы должны увидеть примерно следующий вывод интерпретатора:

C:\Users\Testo> testo run hello_world.testo
PROCESSED TOTAL 0 TESTS IN 0h:0m:0s
UP-TO-DATE: 0
RUN SUCCESSFULLY: 0
FAILED: 0
C:\Users\Testo>

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

Если открыть диспетчер Hyper-V и посмотреть на список существующих виртуальных машин, то мы не увидим в этом списке объявленную ubuntu_server. Так происходит, потому что объявление виртуальной машины не означает её создания. Объявление виртуальной машины лишь сообщает платформе Testo, что вы хотите использовать такую-то машину с таким-то атрибутами в своих тестах, и что называться в тестах она будет таким-то образом.

Пишем первый тест

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

Для объявления теста используется директива test. Каждый тест обязательно должен иметь уникальное имя. Давайте допишем в файл ~\testo\hello_world.testo объявление нашего первого теста

machine my_ubuntu {
    cpus: 1
    ram: 512Mb
    disk main: {
        size: 5Gb
    }
    iso: "C:\\iso\\ubuntu_server.iso"
}

test my_first_test {
    my_ubuntu start
}

Сам тест состоит из набора команд. Команда состоит из двух частей:

  1. Имя виртуальной машины или виртуальной флешки;
  2. Действие (или группа действий), которое нужно применить к этой виртуальной машине или флешке.

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

В нашем примере в тесте my_first_test фигурирует всего одна команда. В этой команде к виртуальной машине my_ubuntu применяется действие start, которое включает виртуальную машину. Давайте запустим этот тест и посмотрим, что у нас получилось.

C:\Users\Testo> testo run hello_world.testo
TESTS TO RUN:
my_first_test
[ 0%] Preparing the environment for test my_first_test
[ 0%] Creating virtual machine my_ubuntu
[ 0%] Taking snapshot initial for virtual machine my_ubuntu
[ 0%] Running test my_first_test
[ 0%] Starting virtual machine my_ubuntu
[ 0%] Taking snapshot my_first_test for virtual machine my_ubuntu
[100%] Test my_first_test PASSED in 0h:0m:4s
PROCESSED TOTAL 1 TESTS IN 0h:0m:4s
UP-TO-DATE: 0
RUN SUCCESSFULLY: 1
FAILED: 0
C:\Users\Testo>

Мы видим, что тест my_first_test попал в очередь TESTS TO RUN, а значит платформа Testo готова этот тест выполнить. Затем начинается непосредственное выполнение теста.

Выполнение тестов разбивается на четыре этапа:

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

Первый этап мы пока пропустим, т.к. никакого кеша у нас сейчас нет, поэтому сразу переходим на этап 2.

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

В нашем случае, Testo видит, что в тесте происходит обращение к виртуальной машине my_ubuntu. Т.к. этой виртуальной машины пока не существует, платформа Testo создает её, используя тот список атрибутов, который мы указали в объявлении. Сразу после создания виртуальной машины Testo запоминает состояние этой машины, делая изначальный снепшот initial. После этого среда для выполнения теста подготовлена и можно приступать к самим командам (этап 3).

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

На этом список команд завершается и начинается этап фиксации среды выполения (этап 4). При успешном окончании теста для виртуальных машин, участвовавших в тесте, создаётся снепшот с именем выполненного теста, что мы и видим в выводе интерпретатора. После этого тест считается завершенным. Т.к. больше тестов у нас не предусмотрено, интерпретатор testo завершает свою работу.

Если открыть список виртуальных машин в диспетчере Hyper-V, то можно убедиться, что там появилась новая машина ubuntu_server.

my_ubuntu создана

Однако, эта машина находится в выключенном состоянии. Почему так происходит, ведь мы в тесте явно указали. что хотим включить машину ubuntu_server?

На самом деле витрульная машина действительно была включена во время выполнения теста, и была зафиксирована в этом состоянии с помощью снепшота my_first_test (в этом можно убедиться, открыв меню снепшотов виртуальной машины)

Список снепшотов my_ubuntu

Но по окончанию теста my_first_test платформа Testo определила, что виртуальная машина my_ubuntu дальше использоваться не будет, и выключила её для экономии ресурсов. Поэтому мы наблюдаем виртуальную машину в выключенном состоянии.

Параметр --stop_on_fail

Но что, если мы хотим увидеть свою виртуальную машину в том состоянии, в котором она была на момент окончания теста? Что, если мы бы хотели увидеть виртуальную машину во включенном состоянии?

Для этого нужно будет сделать два шага.

Во-первых, давайте добавим в тест новое действие abort

test my_first_test {
    my_ubuntu {
        start
        abort "Stop here"
    }
}

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

C:\Users\Testo> testo run hello_world.testo
Because of the cache loss, Testo is scheduled to run the following tests:
- my_first_test
Do you confirm running them and all their children? [y/N]: y
TESTS TO RUN:
my_first_test
[ 0%] Preparing the environment for test my_first_test
[ 0%] Restoring snapshot initial for virtual machine my_ubuntu
[ 0%] Running test my_first_test
[ 0%] Starting virtual machine my_ubuntu
C:/Users/Testo/testo/hello_world.testo - hello world.testo:14:3: Caught abort action on virtual machine my_ubuntu with message: Stop here

C:/Users/Testo/testo/hello_world.testo - hello world.testo:2:1: note: the virtual machine my_ubuntu was declared here

[100%] Test my_first_test FAILED in 0h:0m:1s
PROCESSED TOTAL 1 TESTS IN 0h:0m:1s
UP-TO-DATE: 0
RUN SUCCESSFULLY: 0
FAILED: 1
-my_first_test
At least one of the tests failed
C:\Users\Testo>

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

Мы видим, что тест теперь считается FAILED, причем мы видим конкретное место в тестовом сценарии, которое привело к ошибке. Сейчас это ожидаемая ошибка, т.к. мы сами указали, что она должна была случиться.

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

Однако, существует способ остановить выполнение тестовых сценариев при возникновении любой ошибки. Для этого при запуске интерпретатора необходимо передать параметр командной строки --stop_on_fail.

C:\Users\Testo> sudo testo run ~/testo/hello_world.testo --stop_on_fail
TESTS TO RUN:
my_first_test
[ 0%] Preparing the environment for test my_first_test
[ 0%] Restoring snapshot initial for virtual machine my_ubuntu
[ 0%] Running test my_first_test
[ 0%] Starting virtual machine my_ubuntu
C:/Users/Testo/testo/hello_world.testo - hello world.testo:14:3: Caught abort action on virtual machine my_ubuntu with message: Stop here

C:/Users/Testo/testo/hello_world.testo - hello world.testo:2:1: note: the virtual machine my_ubuntu was declared here

[100%] Test my_first_test FAILED in 0h:0m:0s
C:\Users\Testo>

Теперь если зайти в диспетчер Hyper-V, мы увидим машину my_server в таком состоянии

Убунту запущена

Именно таким способом (abort + stop_on_fail) в платформе Testo реализована система "точек останова", которые позволяют вам остановить выполнение тестов и посмотреть на свои виртуалки в любой момент времени.

Команда testo clean

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

C:\Users\Testo> sudo testo clean
Testo is about to erase the following entities:
Virtual machines:
- my_ubuntu

Do you confirm erasing these entities? [y/N]: y
Deleted virtual machine my_ubuntu
C:\Users\Testo>

Мы видим, что наша машина my_ubuntu успешно удалена.

Команда testo clean не удаляет сущности, вручную созданные пользователем. Очищается только автоматически созданная инфраструктура

Готовый тестовый скрипт

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