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

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

Часть 2. Устанавливаем Ubuntu Server

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

В этом уроке вы познакомитесь c основными действиями для виртуальных машин: wait, type, press

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

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

Вступление

В прошлой части мы остановились на том, что смогли успешно объявить виртуальную машину my_ubuntu и смогли написать тест, в ходе которого эта виртуальная машина создается и запускается. Но возникает закономерный вопрос, что же делать с этой виртуальной машиной дальше? Как автоматизировать установку Ubuntu Server 16.04?

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

Давайте рассмотрим пример. После запуска виртуальной машины пользователь (человек) видит перед собой следующий экран

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

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

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

После чего пользователь снова нажимает Enter и дожидается следующего экрана... Процесс будет повторяться до полной установки Ubuntu Server

Если подумать, работу пользователя (человека) с компьютером можно разделить на две составляющие:

  1. Ожидание наступления какого-либо события (анализ происходящего на экране)
  2. Реакция на это событие (нажатие на кнопки на клавиатуре)

В основе языка Testo-lang как раз и лежит автоматизация и формализация такого поведения.

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

Давайте рассмотрим это на примере и вернемся к текстовому сценарию, который мы написали в предыдущем уроке

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

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

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

Для того, чтобы убедиться, что перед нами действительно нужный экран, в языке Testo-lang существует действие wait

Действие wait позволяет дождаться появления определенной надписи (или комбинации надписей) на экране. Для того, чтобы убедиться, что перед нами действительно экран выбора языка, достаточно убедиться, что на экране есть надпись "Install Ubuntu Server"

test my_first_test {
    my_ubuntu {
        start
        wait "Install Ubuntu Server"
        abort "Stop here"
    }
}

Такое действие wait вернет управление только тогда, когда на экране появится соответствующая надпись. Давайте попробуем запустить такой тест

C:\Users\Testo> testo run ubuntu_installation.testo
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
[ 0%] Waiting "Install Ubuntu Server" for 1m with interval 1s in virtual machine my_ubuntu
C:/Users/Testo/testo/ubuntu_installation.testo:15:3: Caught abort action on virtual machine my_ubuntu with message: Stop here

C:/Users/Testo/testo/ubuntu_installation.testo:2:1: note: the virtual machine my_ubuntu was declared here

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

Заметим, что действие abort все еще присутствует, выполняя роль своеобразного break point в нашем тестовом сценарии. Так процесс создания скрипта становится максимально наглядным, т.к. мы сразу же можем увидеть состояние виртуальной машины, в котором она оказывается в момент вызова abort

Действие wait отлично работает и с русскими буквами.

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

test my_first_test {
    my_ubuntu {
        start
        wait "Install Ubuntu Server"
        press Enter
        abort "Stop here"
    }
}

Вывод:

C:\Users\Testo> sudo testo run ubuntu_installation.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
[ 0%] Waiting "Install Ubuntu Server" for 1m with interval 1s in virtual machine my_ubuntu
[ 0%] Pressing key ENTER in virtual machine my_ubuntu
C:/Users/Testo/testo/ubuntu_installation.testo:16:3: Caught abort action on virtual machine my_ubuntu with message: Stop here

C:/Users/Testo/testo/ubuntu_installation.testo:2:1: note: the virtual machine my_ubuntu was declared here

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

Если открыть виртуальную машину my_ubuntu в диспетчере Hyper-V, то мы увидим, что установка Убунту, действильно, немного сдвинулась с места: теперь перед нами второй экран установки с выбором языка.

По аналогии, нам необходимо для начала убедиться, что перед нами действительно нужный экран. Это можно сделать, выполнив действие wait "Choose the language". После чего можно снова нажимать Enter

Таким образом, процесс создания тестового сценария можно подытожить как набор связок "Дождаться события, прореагировать на событие". Выглядит это примерно так:

wait timeout

Как уже упоминалось, действие wait не сработает до тех пор, пока на экрнане не появится соответствующая надпись. Но что делать, если надпись вообще никогда не появится? Такое может быть, например, если мы тестируем программу и ожидаем увидеть надпись "Успешно", а программа работает при этом неправильно и вместо "Успешно" появляется "Ошибка". В этом случае действие wait не будет работать вечно, т.к. у него есть таймаут, который по умолчанию равен одной минуте.

test my_first_test {
    my_ubuntu {
        start
        wait "Install Ubuntu Server" timeout 1m # Это эквивалентно действию wait "Install Ubuntu Server"
        press Enter
        abort "Stop here"
    }
}

Для обозначения временных интервалов в Testo-lang существуют специальные литералы (как и для количества памяти).

Давайте попробуем убедиться, что команда wait действительно не передаст управление дальше пока на экране действительно не появится нужная надпись. Попробуем вместо "Install Ubuntu Server" искать какую-нибудь тарабарщину. А чтобы не ждать одну минуту, сделаем таймаут 10 секунд

test my_first_test {
    my_ubuntu {
        start
        wait "ALALA" timeout 10s
        press Enter
        abort "Stop here"
    }
}

Вывод:

C:\Users\Testo> sudo testo run ubuntu_installation.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
[ 0%] Waiting "ALALA" for 10s with interval 1s in virtual machine my_ubuntu
C:/Users/Testo/testo/ubuntu_installation.testo:14:3: Error while performing action wait "ALALA" timeout 10s on virtual machine my_ubuntu
- Timeout

/C:/Users/Testo/testo/ubuntu_installation.testo:2:1: note: the virtual machine my_ubuntu was declared here

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

Видно, что ошибка произошла уже не в действии abort, а пораньше, в действии wait

type

Если продолжить написание тестового сценария, то на этом этапе

test my_first_test {
    my_ubuntu {
        start
        wait "Install Ubuntu Server"; press Enter;
        wait "Choose the language"; press Enter
        wait "Select your location"; press Enter
        wait "Detect keyboard layout?"; press Enter
        wait "Country of origin for the keyboard"; press Enter
        wait "Keyboard layout"; press Enter
        wait "No network interfaces detected" timeout 5m

        #Обратите внимание, при необходимости нажатия нескольких клавиш подряд
        #их можно объединить в одном действии press с помощью запятой
        press Right, Enter
        wait "Hostname:"
        abort "Stop here"
    }
}

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

Hostname

Конечно, можно было бы оставить значение по-умолчанию, но что, если мы хотим ввести другое значение?

Для этого нам необходимо выполнить два шага:

  1. Стереть существующее значение.
  2. Ввести новое значение.

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

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

Для набора нового имени достаточно написать действие type "my-ubuntu".

Это же действие type позволит разобраться с вводом логина (type "my-ubuntu-login") и пароля (type "1111").

Действие type также работает вместе с русскими надписями. Например, можно написать type "Привет, мир!". Однако на виртуальной машине в это время должна быть включена русская раскладка клавиатуры. Попытка ввести русский текст на включенной английской раскладке приведет к нежелательному результату. Раскладку клавиатуры можно поменять, например, с помощью press LeftShift + LeftAlt

Завершение установки

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

Installation Complete

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

После этого останется только дождаться завершения перезагрузки (появится экран с предложение ввести данные учётной записи) и выполнить логин

test my_first_test {
    my_ubuntu {
        ...

        wait "Installation complete" timeout 1m;
        unplug dvd; press Enter
        wait "login:" timeout 2m; type "my-ubuntu-login"; press Enter
        wait "Password:"; type "1111"; press Enter
        wait "Welcome to Ubuntu"
    }
}

Если все все действия отрабатывают успешно, можно убрать в конце точку останова abort "stop here" и, таким образом, завершить тест my_first_test.

Поздравляем! Вы написали тестовый сценарий, который в полностью автоматическом режиме устанавливает на "пустую" виртуальную машину ОС Ubuntu Server 16.04!

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

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