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

в 11:48, , рубрики: acronis, qa, Блог компании Acronis, Inc, тестирование по

Всем привет! В этой статье я расскажу вам о том, как можно использовать наши продукты для подготовки окружения для тестирования ваших программ. В большинстве сценариев тестирования ПО для достижения повторяемости результатов необходимо, чтобы окружение, на котором оно проводится, было идентичным. Подготовку этого окружения перед тестом будем называть деплойментом (“deployment”).
Использование продуктов Acronis в автоматизации тестирования

Весь комплекс автоматизированного тестирования выглядит следующим образом: стартовой точкой является сервер с установленным на нём «Jenkins»; через него мы задаём параметры автоматического прогона теста:

— на каком сервере или машине мы будем запускать наш тест;
— как сконфигурировать на нём рейд контроллер; как, в какой последовательности и с какими параметрами разбить диски;
— какую операционную систему поставить
— какие продукты необходимо установить на этот сервер для прогона тестового сценария.

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

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

C:Program Files (x86)Common FilesAcronisBackupAndRecoveryAgent

и будет называться 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

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

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

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

Автор: sefremov

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js