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

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

Часть 7. Связываем две машины по сети

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

В этой части вы:

  1. Познакомитесь с управлением несколькими виртуальными машинами в одном тесте.
  2. Познакомитесь с действием plug/unplug nic.
  3. Узнаете еще несколько атрибутов сетевых адаптеров в объявлении виртуальных машин.
  4. Завершите ознакомление с виртуальными сетями.

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

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

Вступление

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

В конце этого урока мы сможем воспроизвести такой стенд.

С чего начать

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

  1. Переименовать машину my_ubuntu в server;
  2. Переименовать параметры hostname, login, password в server_hostname, server_login и default_password соответственно и подправить все места, где к ним происходит обращение;
  3. Переименовать тесты ubuntu_installation и guest_additions_installation в server_install_ubuntu и server_install_guest_additions соответственно;
  4. Удалить тест guest_additions_demo.

В итоге должен получиться такой скрипт:

network internet {
	mode: "nat"
}

machine server {
	cpus: 1
	ram: 512Mb
	disk main: {
		size: 5Gb
	}
	iso: "${ISO_DIR}/ubuntu_server.iso"

	nic nat: {
		attached_to: "internet"
	}
}

param server_hostname "server"
param server_login "server-login"
param default_password "1111"

test server_install_ubuntu {
	server {
		start
		wait "English"
		press Enter
		# The actions can be separated with a newline
		# or a semicolon
		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 Enter
		wait "Hostname:" timeout 5m; press Backspace*36; type "${server_hostname}"; press Enter
		wait "Full name for the new user"; type "${server_login}"; press Enter
		wait "Username for your account"; press Enter
		wait "Choose a password for the new user"; type "${default_password}"; press Enter
		wait "Re-enter password to verify"; type "${default_password}"; press Enter
		wait "Use weak password?"; press Left, Enter
		wait "Encrypt your home directory?"; press Enter

		#wait "Select your timezone" timeout 2m; press Enter
		wait "Is this time zone correct?" timeout 2m; press Enter
		wait "Partitioning method"; press Enter
		wait "Select disk to partition"; press Enter
		wait "Write the changes to disks and configure LVM?"; press Left, Enter
		wait "Amount of volume group to use for guided partitioning"; press Enter
		wait "Write the changes to disks?"; press Left, Enter
		wait "HTTP proxy information" timeout 3m; press Enter
		wait "How do you want to manage upgrades" timeout 6m; press Enter
		wait "Choose software to install"; press Enter
		wait "Install the GRUB boot loader to the master boot record?" timeout 10m; press Enter
		wait "Installation complete" timeout 1m;

		unplug dvd; press Enter
		wait "server_login:" timeout 2m; type "${server_login}"; press Enter
		wait "Password:"; type "${default_password}"; press Enter
		wait "Welcome to Ubuntu"
	}
}

param guest_additions_pkg "testo-guest-additions*"
test server_install_guest_additions: server_install_ubuntu {
	server {
		plug dvd "${ISO_DIR}/testo-guest-additions.iso"

		type "sudo su"; press Enter;
		# Take a note that you may reference params in any part of the string
		wait "password for ${server_login}"; type "${default_password}"; press Enter
		wait "root@${server_hostname}"

		type "mount /dev/cdrom /media"; press Enter
		wait "mounting read-only"; type "dpkg -i /media/${guest_additions_pkg}"; press Enter;
		wait "Setting up testo-guest-additions"
		type "umount /media"; press Enter;
		# Give a little time for the umount to do its job
		sleep 2s
		unplug dvd
	}
}

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

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

user$ sudo testo clean
Testo is about to erase the following entities:
Virtual networks:
- internet
Virtual machines:
- my_ubuntu

Do you confirm erasing these entities? [y/N]: y
Deleted network internet
Deleted virtual machine my_ubuntu
user$

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

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

user$ sudo testo run hello_world.testo --stop_on_fail --param ISO_DIR /opt/iso
TESTS TO RUN:
server_install_ubuntu
server_install_guest_additions
[ 0%] Preparing the environment for test server_install_ubuntu
[ 0%] Restoring snapshot initial for virtual machine server
[ 0%] Running test server_install_ubuntu
[ 0%] Starting virtual machine server
[ 0%] Waiting English for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Install Ubuntu Server for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Choose the language for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Select your location for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Detect keyboard layout? for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Country of origin for the keyboard for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Keyboard layout for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Hostname: for 5m with interval 1s in virtual machine server
[ 0%] Pressing key BACKSPACE 36 times on virtual machine server
[ 0%] Typing "server" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Full name for the new user for 1m with interval 1s in virtual machine server
[ 0%] Typing "server-login" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Username for your account for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Choose a password for the new user for 1m with interval 1s in virtual machine server
[ 0%] Typing "1111" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Re-enter password to verify for 1m with interval 1s in virtual machine server
[ 0%] Typing "1111" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Use weak password? for 1m with interval 1s in virtual machine server
[ 0%] Pressing key LEFT on virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Encrypt your home directory? for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Is this time zone correct? for 2m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Partitioning method for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Select disk to partition for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Write the changes to disks and configure LVM? for 1m with interval 1s in virtual machine server
[ 0%] Pressing key LEFT on virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Amount of volume group to use for guided partitioning for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Write the changes to disks? for 1m with interval 1s in virtual machine server
[ 0%] Pressing key LEFT on virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting HTTP proxy information for 3m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting How do you want to manage upgrades for 6m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Choose software to install for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Install the GRUB boot loader to the master boot record? for 10m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Installation complete for 1m with interval 1s in virtual machine server
[ 0%] Unplugging dvd from virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting server login: for 2m with interval 1s in virtual machine server
[ 0%] Typing "server-login" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Password: for 1m with interval 1s in virtual machine server
[ 0%] Typing "1111" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Welcome to Ubuntu for 1m with interval 1s in virtual machine server
[ 0%] Taking snapshot server_install_ubuntu for virtual machine server
[ 50%] Test server_install_ubuntu PASSED in 0h:5m:35s
[ 50%] Preparing the environment for test server_install_guest_additions
[ 50%] Running test server_install_guest_additions
[ 50%] Plugging dvd /opt/iso/testo-guest-additions.iso into virtual machine server
[ 50%] Typing "sudo su" with interval 30ms in virtual machine server
[ 50%] Pressing key ENTER on virtual machine server
[ 50%] Waiting password for server-login for 1m with interval 1s in virtual machine server
[ 50%] Typing "1111" with interval 30ms in virtual machine server
[ 50%] Pressing key ENTER on virtual machine server
[ 50%] Waiting root@server for 1m with interval 1s in virtual machine server
[ 50%] Typing "mount /dev/cdrom /media" with interval 30ms in virtual machine server
[ 50%] Pressing key ENTER on virtual machine server
[ 50%] Waiting mounting read-only for 1m with interval 1s in virtual machine server
[ 50%] Typing "dpkg -i /media/testo-guest-additions*" with interval 30ms in virtual machine server
[ 50%] Pressing key ENTER on virtual machine server
[ 50%] Waiting Setting up testo-guest-additions for 1m with interval 1s in virtual machine server
[ 50%] Typing "umount /media" with interval 30ms in virtual machine server
[ 50%] Pressing key ENTER on virtual machine server
[ 50%] Sleeping in virtual machine server for 2s
[ 50%] Unplugging dvd from virtual machine server
[ 50%] Taking snapshot server_install_guest_additions for virtual machine server
[100%] Test server_install_guest_additions PASSED in 0h:0m:15s
PROCESSED TOTAL 2 TESTS IN 0h:5m:51s
UP-TO-DATE: 0
RUN SUCCESSFULLY: 2
FAILED: 0
user$

Создаём вторую машину

Пришло время создать вторую виртуальную машину. Как вы уже догадались, называться она будет client и будет, по большей части, копией машины server

machine client {
    cpus: 1
    ram: 512Mb
    disk main: {
        size: 5Gb
    }
    iso: "${ISO_DIR}/ubuntu_server.iso"

    nic nat: {
        attached_to: "internet"
    }
}

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

network LAN {
    mode: "internal"
}

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

Осталось нам лишь добавить в виртуальные машины сетевые адаптеры, которые будут подлючаться к новой сети LAN:

machine client {
    cpus: 1
    ram: 512Mb
    disk main: {
        size: 5Gb
    }
    iso: "${ISO_DIR}/ubuntu_server.iso"

    nic nat: {
        attached_to: "internet"
    }

    nic server_side: {
        attached_to: "LAN"
        mac: "52:54:00:00:00:AA"
    }
}

machine server {
    cpus: 1
    ram: 512Mb
    disk main: {
        size: 5Gb
    }
    iso: "${ISO_DIR}/ubuntu_server.iso"

    nic nat: {
        attached_to: "internet"
    }

    nic client_side: {
        attached_to: "LAN"
        mac: "52:54:00:00:00:BB"
    }
}

Обратите внимание, что для "внутренних" сетевых адаптеров мы указали еще атрибут mac. Указание точного MAC-адреса позволит нам чуть позже переименовать сетевые интерфейсы так, чтобы в них можно было легко ориентироваться внутри тестовых сценариев.

Что ж, добавим два новых теста уже для машины client: client_install_ubuntu и client_install_guest_additions. Не забудем также добавить несколько новых параметров.

param client_hostname "client"
param client_login "client-login"

test client_install_ubuntu {
    client {
        start
        wait "English"
        press Enter
        #Действия могут разделяться символом новой строки
        #или точкой с запятой
        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 Enter
        wait "Hostname:" timeout 5m; press Backspace*36; type "${client_hostname}"; press Enter
        wait "Full name for the new user"; type "${client_login}"; press Enter
        wait "Username for your account"; press Enter
        wait "Choose a password for the new user"; type "${default_password}"; press Enter
        wait "Re-enter password to verify"; type "${default_password}"; press Enter
        wait "Use weak password?"; press Left, Enter
        wait "Encrypt your home directory?"; press Enter

        #wait "Select your timezone" timeout 2m; press Enter
        wait "Is this time zone correct?" timeout 2m; press Enter
        wait "Partitioning method"; press Enter
        wait "Select disk to partition"; press Enter
        wait "Write the changes to disks and configure LVM?"; press Left, Enter
        wait "Amount of volume group to use for guided partitioning"; press Enter
        wait "Write the changes to disks?"; press Left, Enter
        wait "HTTP proxy information" timeout 3m; press Enter
        wait "How do you want to manage upgrades" timeout 6m; press Enter
        wait "Choose software to install"; press Enter
        wait "Install the GRUB boot loader to the master boot record?" timeout 10m; press Enter
        wait "Installation complete" timeout 1m;

        unplug dvd; press Enter
        wait "${client_hostname} login:" timeout 2m; type "${client_login}"; press Enter
        wait "Password:"; type "${default_password}"; press Enter
        wait "Welcome to Ubuntu"
    }
}

test client_install_guest_additions: client_install_ubuntu {
    client {
        plug dvd "${ISO_DIR}/testo-guest-additions.iso"

        type "sudo su"; press Enter;
        #Обратите внимание, обращаться к параметрам можно в любом участке строки
        wait "password for ${client_login}"; type "${default_password}"; press Enter
        wait "root@${client_hostname}"

        type "mount /dev/cdrom /media"; press Enter
        wait "mounting read-only"; type "dpkg -i /media/${guest_additions_pkg}"; press Enter;
        wait "Setting up testo-guest-additions"
        type "umount /media"; press Enter;
        #Дадим немного времени для команды umount
        sleep 2s
        unplug dvd
    }
}

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

Теперь попробуем запустить все наши тестовые сценарии.

user$ sudo testo run hello_world.testo --stop_on_fail --param ISO_DIR /opt/iso
Because of the cache loss, Testo is scheduled to run the following tests:
- server_install_ubuntu
- server_install_guest_additions
Do you confirm running them? [y/N]: y
TESTS TO RUN:
server_install_ubuntu
server_install_guest_additions
client_install_ubuntu
client_install_guest_additions
[ 0%] Preparing the environment for test server_install_ubuntu
[ 0%] Creating virtual machine server
[ 0%] Taking snapshot initial for virtual machine server
[ 0%] Running test server_install_ubuntu
[ 0%] Starting virtual machine server
[ 0%] Waiting English for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Install Ubuntu Server for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Choose the language for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Select your location for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Detect keyboard layout? for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Country of origin for the keyboard for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Keyboard layout for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER on virtual machine server
[ 0%] Waiting Hostname: for 5m with interval 1s in virtual machine server
/home/alex/testo/hello_world.testo:61:3: Error while performing action wait Hostname: timeout 5m on virtual machine server:
-Timeout
[ 25%] Test server_install_ubuntu FAILED in 0h:5m:12s
user$

Но у нас сломалась установка Ubuntu. Почему? Потому что мы добавили второй сетевой адаптер в виртуальную машину и теперь у нас появился новый экран, которого мы не ожидали ранее.

Primary NIC

В качестве главного интерфейса нам нужно выбрать первый (то есть нажать Enter). Давайте подправим наш установочный сценарий.

wait "Keyboard layout"; press Enter
#wait "No network interfaces detected" timeout 5m; press Enter
wait "Primary network interface"; press Enter
wait "Hostname:" timeout 5m; press Backspace*36; type "${server_hostname}"; press Enter

После этого можно еще раз запустить тесты и они должны отработать успешно.

Вытаскиваем ненужный адаптер

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

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

В платформе Testo есть две возможности по управлению сетевыми адаптерами:

  1. Включать/выключать "сетевой провод" из сетевого адаптера (plug/unplug link)
  2. Включать/выключать сетевой адаптер целиком (plug/unplug nic)

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

Давайте посмотрим на примере машины server. Создадим новый тест server_unplug_nat.

test server_unplug_nat: server_install_guest_additions {
    server {
        shutdown
        unplug nic nat
        start

        wait "${server_hostname} login:" timeout 2m; type "${server_login}"; press Enter
        wait "Password:"; type "${default_password}"; press Enter
        wait "Welcome to Ubuntu"
    }
}

Этот тест мы начинаем с того, что останавливаем виртуальную машину. Вообще, есть два способа остановить виртуальную машину извне: действие stop (аналог "выдергивания шнура питания" из виртуальной машины) и действие shutdown (аналог нажатия на кнопку питания на системном блоке). Действие shutdown несколько предпочтительнее.

После выключения питания мы вытаскиваем (прямо на уровне PCI-устройства) сетевой адаптер nat и запускаем машину обратно. Заканчивается тест после успешного входа в систему.

user$ sudo testo run hello_world.testo --stop_on_fail --param ISO_DIR /opt/iso --test_spec server_unplug_nat
UP-TO-DATE TESTS:
server_install_ubuntu
server_install_guest_additions
TESTS TO RUN:
server_unplug_nat
[ 67%] Preparing the environment for test server_unplug_nat
[ 67%] Restoring snapshot server_install_guest_additions for virtual machine server
[ 67%] Running test server_unplug_nat
[ 67%] Shutting down virtual machine server with timeout 1m
[ 67%] Unplugging nic nat from virtual machine server
[ 67%] Starting virtual machine server
[ 67%] Waiting server login: for 2m with interval 1s in virtual machine server
[ 67%] Typing "server-login" with interval 30ms in virtual machine server
[ 67%] Pressing key ENTER on virtual machine server
[ 67%] Waiting Password: for 1m with interval 1s in virtual machine server
[ 67%] Typing "1111" with interval 30ms in virtual machine server
[ 67%] Pressing key ENTER on virtual machine server
[ 67%] Waiting Welcome to Ubuntu for 1m with interval 1s in virtual machine server
[ 67%] Taking snapshot server_unplug_nat for virtual machine server
[100%] Test server_unplug_nat PASSED in 0h:0m:28s
PROCESSED TOTAL 3 TESTS IN 0h:0m:28s
UP-TO-DATE: 2
RUN SUCCESSFULLY: 1
FAILED: 0
user$

После выполнения теста можно зайти в свойства виртуальной машины и убедиться, что в неё остался лишь один сетевой адаптер.

Также давайте продублируем этот тест для машины client

test client_unplug_nat: client_install_guest_additions {
    client {
        shutdown
        unplug nic nat
        start

        wait "${client_hostname} login:" timeout 2m; type "${client_login}"; press Enter
        wait "Password:"; type "${default_password}"; press Enter
        wait "Welcome to Ubuntu"
    }
}
user$ sudo testo run hello_world.testo --stop_on_fail --param ISO_DIR /opt/iso --test_spec client_unplug_nat
UP-TO-DATE TESTS:
client_install_ubuntu
client_install_guest_additions
TESTS TO RUN:
client_unplug_nat
[ 67%] Preparing the environment for test client_unplug_nat
[ 67%] Restoring snapshot client_install_guest_additions for virtual machine client
[ 67%] Running test client_unplug_nat
[ 67%] Shutting down virtual machine client with timeout 1m
[ 67%] Unplugging nic nat from virtual machine client
[ 67%] Starting virtual machine client
[ 67%] Waiting client login: for 2m with interval 1s in virtual machine client
[ 67%] Typing "client-login" with interval 30ms in virtual machine client
[ 67%] Pressing key ENTER on virtual machine client
[ 67%] Waiting Password: for 1m with interval 1s in virtual machine client
[ 67%] Typing "1111" with interval 30ms in virtual machine client
[ 67%] Pressing key ENTER on virtual machine client
[ 67%] Waiting Welcome to Ubuntu for 1m with interval 1s in virtual machine client
[ 67%] Taking snapshot client_unplug_nat for virtual machine client
[100%] Test client_unplug_nat PASSED in 0h:0m:28s
PROCESSED TOTAL 3 TESTS IN 0h:0m:28s
UP-TO-DATE: 2
RUN SUCCESSFULLY: 1
FAILED: 0
user$

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

Переименовываем сетевые интерфейсы

По умолчанию сетевым адаптерам внутри ОС назначаются довольно неинформативные названия (например, ens3 и ens4) при том, что для нас в тестовых сценариях было бы гораздо удобнее, если бы интерфейсы назывались так же, как мы их назвали в объявлении виртуальной машины: client_side и server_side. Для этого можно переименовать сетевые адаптеры, используя в качестве основы MAC-адрес, который нам заранее известен.

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

#!/bin/bash

set -e

mac=$1

oldname=`ifconfig -a | grep ${mac,,} | awk '{print $1}'`
newname=$2

echo SUBSYSTEM==\"net\", ACTION==\"add\", ATTR{address}==\"$mac\", NAME=\"$newname\", DRIVERS==\"?*\" >> /lib/udev/rules.d/70-test-tools.rules

rm -f /etc/network/interfaces
echo source /etc/network/interfaces.d/* >> /etc/network/interfaces
echo auto lo >> /etc/network/interfaces
echo iface lo inet loopback >> /etc/network/interfaces

ip link set $oldname down
ip link set $oldname name $newname
ip link set $newname up

echo "Renaming success"

Давайте сохраним этот скрипт в файл rename_net.sh и сохраним его в ту же папку, что и файл с тестовым сценарием hello_world.testo.

После этого напишем новый тест для сервера server_prepare:

test server_prepare: server_unplug_nat {
    server {
        copyto "./rename_net.sh" "/opt/rename_net.sh"
        exec bash """
            chmod +x /opt/rename_net.sh
            /opt/rename_net.sh 52:54:00:00:00:bb client_side
            ip ad
        """
    }
}
user$ sudo testo run hello_world.testo --stop_on_fail --param ISO_DIR /opt/iso --test_spec server_prepare
UP-TO-DATE TESTS:
server_install_ubuntu
server_install_guest_additions
server_unplug_nat
TESTS TO RUN:
server_prepare
[ 75%] Preparing the environment for test server_prepare
[ 75%] Restoring snapshot server_unplug_nat for virtual machine server
[ 75%] Running test server_prepare
[ 75%] Copying ./rename_net.sh to virtual machine server to destination /opt/rename_net.sh with timeout 10m
[ 75%] Executing bash command in virtual machine server with timeout 10m
+ chmod +x /opt/rename_net.sh
+ /opt/rename_net.sh 52:54:00:00:00:bb client_side
Renaming success
+ ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: client_side: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:00:00:bb brd ff:ff:ff:ff:ff:ff
inet6 fe80::5054:ff:fe00:bb/64 scope link tentative
valid_lft forever preferred_lft forever
[ 75%] Taking snapshot server_prepare for virtual machine server
[100%] Test server_prepare PASSED in 0h:0m:2s
PROCESSED TOTAL 4 TESTS IN 0h:0m:2s
UP-TO-DATE: 3
RUN SUCCESSFULLY: 1
FAILED: 0
user$

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

Осталось лишь добавить сетевые настройки в этот сетевой интерфейс.

test server_prepare: server_unplug_nat {
    server {
        copyto "./rename_net.sh" "/opt/rename_net.sh"
        exec bash """
            chmod +x /opt/rename_net.sh
            /opt/rename_net.sh 52:54:00:00:00:bb client_side
            ip a a 192.168.1.1/24 dev client_side
            ip l s client_side up
            ip ad
        """
    }
}

И повторяем такие же действия для машины client:

user$ sudo testo run hello_world.testo --stop_on_fail --param ISO_DIR /opt/iso
Because of the cache loss, Testo is scheduled to run the following tests:
- server_prepare
Do you confirm running them? [y/N]: y
UP-TO-DATE TESTS:
server_install_ubuntu
server_install_guest_additions
server_unplug_nat
client_install_ubuntu
client_install_guest_additions
client_unplug_nat
TESTS TO RUN:
server_prepare
client_prepare
[ 75%] Preparing the environment for test server_prepare
[ 75%] Restoring snapshot server_unplug_nat for virtual machine server
[ 75%] Running test server_prepare
[ 75%] Copying ./rename_net.sh to virtual machine server to destination /opt/rename_net.sh with timeout 10m
[ 75%] Executing bash command in virtual machine server with timeout 10m
+ chmod +x /opt/rename_net.sh
+ /opt/rename_net.sh 52:54:00:00:00:bb client_side
Renaming success
+ ip a a 192.168.1.1/24 dev client_side
+ ip l s client_side up
+ ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: client_side: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:00:00:bb brd ff:ff:ff:ff:ff:ff
inet 192.168.1.1/24 scope global client_side
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe00:bb/64 scope link tentative
valid_lft forever preferred_lft forever
[ 75%] Taking snapshot server_prepare for virtual machine server
[ 88%] Test server_prepare PASSED in 0h:0m:4s
[ 88%] Preparing the environment for test client_prepare
[ 88%] Restoring snapshot client_unplug_nat for virtual machine client
[ 88%] Running test client_prepare
[ 88%] Copying ./rename_net.sh to virtual machine client to destination /opt/rename_net.sh with timeout 10m
[ 88%] Executing bash command in virtual machine client with timeout 10m
+ chmod +x /opt/rename_net.sh
+ /opt/rename_net.sh 52:54:00:00:00:aa server_side
Renaming success
+ ip a a 192.168.1.2/24 dev server_side
+ ip l s server_side up
+ ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: server_side: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:00:00:aa brd ff:ff:ff:ff:ff:ff
inet 192.168.1.2/24 scope global server_side
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe00:aa/64 scope link tentative
valid_lft forever preferred_lft forever
[ 88%] Taking snapshot client_prepare for virtual machine client
[100%] Test client_prepare PASSED in 0h:0m:4s
PROCESSED TOTAL 8 TESTS IN 0h:0m:8s
UP-TO-DATE: 6
RUN SUCCESSFULLY: 2
FAILED: 0
user$

Пингуем!

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

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

test test_ping: client_prepare, server_prepare {
    client exec bash "ping 192.168.1.2 -c5"
    server exec bash "ping 192.168.1.1 -c5"
}

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

user$ sudo testo run hello_world.testo --stop_on_fail --param ISO_DIR /opt/iso --test_spec test_ping
UP-TO-DATE TESTS:
client_install_ubuntu
client_install_guest_additions
client_unplug_nat
client_prepare
server_install_ubuntu
server_install_guest_additions
server_unplug_nat
server_prepare
TESTS TO RUN:
test_ping
[ 89%] Preparing the environment for test test_ping
[ 89%] Restoring snapshot client_prepare for virtual machine client
[ 89%] Restoring snapshot server_prepare for virtual machine server
[ 89%] Running test test_ping
[ 89%] Executing bash command in virtual machine client with timeout 10m
+ ping 192.168.1.2 -c5
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.056 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.036 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.046 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.046 ms
64 bytes from 192.168.1.2: icmp_seq=5 ttl=64 time=0.043 ms

--- 192.168.1.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3998ms
rtt min/avg/max/mdev = 0.036/0.045/0.056/0.008 ms
[ 89%] Executing bash command in virtual machine server with timeout 10m
+ ping 192.168.1.1 -c5
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.057 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.038 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.042 ms
64 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=0.043 ms
64 bytes from 192.168.1.1: icmp_seq=5 ttl=64 time=0.042 ms

--- 192.168.1.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3998ms
rtt min/avg/max/mdev = 0.038/0.044/0.057/0.008 ms
[ 89%] Taking snapshot test_ping for virtual machine client
[ 89%] Taking snapshot test_ping for virtual machine server
[100%] Test test_ping PASSED in 0h:0m:16s
PROCESSED TOTAL 9 TESTS IN 0h:0m:16s
UP-TO-DATE: 8
RUN SUCCESSFULLY: 1
FAILED: 0
user$

Как мы видим, команда ping отлично отработала, а это означает, что мы смогли полноценно настроить соединение между виртуальными машинами!

Итоги

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

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

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

Дерево тестов на текущий момент выглядит так:

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