Использование продуктов Acronis в автоматизации тестирования

Всем привет! В этой статье я расскажу вам о том, как можно использовать наши продукты для подготовки окружения для тестирования ваших программ. В большинстве сценариев тестирования ПО для достижения повторяемости результатов необходимо, чтобы окружение, на котором оно проводится, было идентичным. Подготовку этого окружения перед тестом будем называть деплойментом («deployment»).789e14a7b43d878c3ae87d1547b9033b.pngВесь комплекс автоматизированного тестирования выглядит следующим образом: стартовой точкой является сервер с установленным на нём «Jenkins»; через него мы задаём параметры автоматического прогона теста: — на каком сервере или машине мы будем запускать наш тест; — как сконфигурировать на нём рейд контроллер; как, в какой последовательности и с какими параметрами разбить диски; — какую операционную систему поставить— какие продукты необходимо установить на этот сервер для прогона тестового сценария.

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

В качестве того, что будет грузить PXE, мы выбрали нашу Acronis Bootable Media, т. к. с её помощью можно выполнить всё, что нам нужно. Acronis Bootable Media — это урезанная версия Linux«a (BusyBox) с исполняемыми файлами нашего продукта, упакованная в ramdisk. Рамдиск нашей медии можно получить, установив из дистрибутива Acronis Backup компонент Agent For Windows. Рамдиск будет находиться в папке с установленным продуктом:

C:\Program Files (x86)\Common Files\Acronis\BackupAndRecoveryAgent\

и будет называться agent_ramdisk.dat для 32х битной медии и agent_ramdisk64.dat — для 64х битной.

imageВнешний вид загруженной из рамдиска медии

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

Вот пример shell«овского скрипта, который запаковывает нужные нам файлы в ramdisk:

# Распаковка ramdisk. extract_ramdisk () { rm -rf .ramdisk mkdir .ramdisk pushd .ramdisk gzip -dc < $1 | cpio -i -d --no-absolute-filenames popd } # Подкладывание нужных файлов в Acronis Media. copy_extra_files() { mkdir -p .ramdisk/tmp/root/.ssh cp -f files/id_rsa .ramdisk/tmp/root/.ssh cp -f files/autostart.sh .ramdisk/bin/autostart_dbg cp -f files/libstorelibir-2.so.14.07-0 .ramdisk/bin cp -f files/storcli64 .ramdisk/bin } # Запаковка ramdisk’a. pack_ramdisk() { mkdir -p out pushd .ramdisk /cygdrive/c/cygwin/bin/find . | cpio -H newc -o > …/out/agent_ramdisk_echo.dat.initrd popd gzip -c9 out/agent_ramdisk_echo.dat.initrd > out/ramdisk.dat rm -f out/agent_ramdisk_echo.dat.initrd rm -rf .ramdisk } # Вызов методов. echo Extracting ramdisk… extract_ramdisk $1 echo Copying extra files… copy_extra_files echo Packing ramdisk… pack_ramdisk После того, как мы запаковали утилиту в ramdisk, её можно использовать в загруженной Acronis медии. Для загрузки через кастомный ramdisk из-под PXE, нужно создать корректный конфигурационный файл для загружающей машины. В качестве PXE-сервера мы используем ту же самую машину, которой Jenkins передаёт управление. На ней же у нас стоит DHCP сервер. Все тестовые машины держим в своей собственной виртуальной сети, чтобы не мешать другим работникам компании.Процесс деплоймента начинается с подготовки конфигурационного файла для PXE: который генерируется по имени машины. Поскольку этот же сервер также выполняет функцию DHCP, имени нам достаточно, чтобы узнать её mac-адрес, создать правильный файл конфигурации и положить его в /var/lib/tftpboot. Пример файла конфигурации загрузки приведен ниже. После этого мы перезагружаем машину через IPMI (если у машины он есть).

После того как машина загрузится из ramdisk, в медии начнёт выполняться скрипт autostart.sh. Сначала мы прописываем в нем, как через storcli сконфигурировать диски, а затем задаём параметры восстановления того или иного образа операционной системы на машину через наш продукт. Эти образы сделаны нашим же продуктом Acronis

Backup представляют собой *.tib файлы и лежат на шаре в этой же сети.

Вот пример скрипта autostart.sh:

configureRaidDisk () { conf_id=$(cat /proc/cmdline | grep -o 'raid_configuration_number=[^ ]*' | sed 's/\(^raid_configuration_number=\)\(.*\)/\2/') echo Raid configuration: $conf_id # Default value not to reconfigure raid controller disk state. if [ »$conf_id» == »0» ]; then return elif [ »$conf_id» == »1» ]; then (/bin/storcli64 /c1/vall delete force && echo Delete all virtual drives.) || exit 1 (/bin/storcli64 /c1 add vd type=raid0 drives=252:3 wt nora direct strip=64 && echo Create system partition.) || exit 1 (/bin/storcli64 /c1 add vd type=raid0 drives=252:0,252:1,252:2 wt nora direct strip=64 && echo Create first virtual drive.) || exit 1 (/bin/storcli64 /c1 add vd type=raid0 drives=252:4,252:5,252:6 wt nora direct strip=64 && echo Create second virtual drive.) || exit 1 (/bin/storcli64 /c1 add vd type=raid0 drives=252:7 wt nora direct strip=64 && echo Create third virtual drive.) || exit 1 (/bin/storcli64 /c1/v0 set bootdrive=on && echo Set system disk as bootable.) || exit 1 fi }

execCmd () { tmp=$(cat /proc/cmdline | grep -oe acrocmd.*\)) cmd=${tmp%%\)} echo Recovering OS image… ($cmd >> /dev/null && echo Done.) || exit 1 }

configureRaidDisk startProduct execCmd reboot now Параметры для этого скрипта мы передаём через /proc/cmdline, который берём конфигурационного файла из PXE. Мы просматриваем, какую конфигурацию рейда нам взять, и зовём уже непосредственно storcli с нужными нам параметрами. Сейчас у нас всё настроено под определённые железки, в дальнейшем есть желание сделать эти операции более умными.После конфигурации рейда мы запускаем операцию восстановления операционной системы. Для этого опять вычленяем из переданного нам в /proc/cmdline команду для восстановления и выполняем её.

Вот пример конфигурационного файла, сгенерированного для загрузки машины через PXE:

timeout=1 default=media

image=kernel64.dat label=media initrd=ramdisk64.dat append=«ramdisk_size=100000 quiet vga=791 recover=(acrocmd recover disk --loc=smb://10.250.114.44/raid/images --credentials=image, qweqweqwe --arc=win7_64srv --disk=1 --target_disk=1) bootfile=root@10.250.114.101:/tmp/uefi/0AFA7218.conf#end raid_configuration_number=1» Из него мы и задаем, какой архив восстанавливать — как раз то, что в параметре append попадёт затем в proc/cmdline внутри медии.Рамдиск должен лежать в /var/lib/tftpboot/ на PXE-сервере. В нашем случае он называется ramdisk64.dat. После того, как наша медия отработала, и система восстановлена, мы можем столкнуться с проблемой: после настройки рейда с помощью storcli, тома на виртуальных дисках рейда не создаются. Поэтому в скрипте самого высокого уровня, который подготавливает конфигурацию для загрузки PXE, перезагружает машину и ждет загрузки восстановленной системы, мы добавили выполнение следующего скрипта:

echo list disk > list.txt for /f «usebackq tokens=1,2» %%a in (`diskpart /s list.txt ^| findstr /r /c: «Disk [1–99]»`) do ( echo sel %%a %%b>script.txt echo clean>>script.txt echo create part primary>>script.txt echo format FS=NTFS quick>>script.txt echo assign>>script.txt echo rescan>>script.txt diskpart /s script.txt ) del list.txt, del script.txt Он создаёт NTFS-тома на каждом найденном диске (кроме первого). Так как diskpart не может принимать на вход параметры, а может только использовать скрипт, мы генерируем файл с командой для листинга дисков на лету и после форматируем файловую систему, используя диски из листинга.После восстановления ОС можно приступать к установке продуктов. Запуск скриптов и прочих действий на тестовой машине производится с управляющего сервера через SSH-соединение. Для этого на тестовой машине стоит SSH-сервер, который уже установлен в образе, так что после восстановления машины, мы просто подключаемся к ней по SSH. Установку продукта реализуем копированием на машину нужных нам msi-файлов нашего продукта, которые просто ставим через msiexec. Теперь можно приступать к самому тестированию.

Тесты представляют собой «обертки» на Питоне, выполняющие те или иные операции через командную строку утилиты Acrocmd. Acrocmd позволяет нам выполнять все те же операции, что и через GUI основного продукта.

Запуском этих файлов (реализованных на Python«e) на тестируемой машине занимается специальная система, установленная на другой управляющий сервер. Управляющий сервер по SSH-соединению заливает все скрипты на машину и запускает их, собирает их вывод и объединяет результаты всех тестов в один итоговый отчет. В дальнейшем по нему можно построить красивый отчёт о прогоне тестового сценария. Для этого мы используем несложный веб-сервер, написанный на Python«e, который преобразует результаты в красивые html-странички.

image

Вот пример отчета, который мы получается в конечном итоге. Сравнение скорости бекапа в трех различных версиях продукта. Ось абсцисс — это номер итерации в прогоне, а ось ординат — это скорость бекапа.

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

А как вы автоматизируете тестирование и подготовку окружения для него?

© Habrahabr.ru