К основному контенту

Тестируем с помощью Fitnesse+PowerSlim. Часть 5. Пример

Часть 1. Введение 
Часть 2. База 
Часть 3. Advanced
Часть 4. Демо FitNesse + Jenkins
Часть 5. Пример трансформации PowerShell скрипта в тест
Плагин для sublime, который подсвечивает синтаксис теста на Fitnesse+PowerSlim

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

Итак, "мы прочитали твои посты, позапускали примеры, дальше то что? С чего начать?"

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

В Hyper-V PowerShell API есть такие cmdlet'ы: New-VM, Get-VM, Remove-VM. Давайте попробуем проверить, что мы можем ими пользоваться. Ситуация выглядит немного синтетической, но представьте, что есть продукт, который стоит внутри Hyper-V и расширяет модель авторизации этой платформы виртуализации. Такой продукт даже в природе существует  (vGate for Hyper-V) :)

Если опустить за рамки примера установку и настройку vGate, то хочется проверить, что пользователь может создать виртуальную машину и удалить ее.

Для этого можно использовать например такой PowerShell скрипт (проверки условны, но имеют право на жизнь):


New-VM -Name newVM -ComputerName 192.168.2.21 -MemoryStartupBytes 32MB -NoVHD
$vm = Get-VM -Name newVm -ComputerName 192.168.2.21 #получили созданную VM
$vm.State -eq "Off" #проверили что она выключена
Remove-VM -VM $vm -Force #удалили
$vmX = Get-VM -Name newVm -ComputerName 192.168.2.21 #опять пробуем получить
$vmX -eq $null #проверяем что не смогли

Собственно проверок (assert'ов) то здесь и нет, поэтому давайте их сделаем на FitNesse+powerslim.

Как видно, каждая строчка PowerShell скрипта превратилась в отдельную команду скрипта FitNesse. Так удобнее для удобства чтения и проверок, хотя никто не запрещает выносить несколько PowerShell команд в одну строку с разделением через ';' (а, например, при использовании PowerShell функций этот способ просто необходим)
Там где нужно просто выполнить PowerShell команду - мы используем eval, там где нужно проверить и сравнить, используем комбинацию check и eval.

Каждая строчка скрипта FitNesse отправляется на указанный в команде script powerslim-сервер, запущенный на удаленной машине (у нас 192.168.1.31), и там, с помощью команды Invoke-Expression выполняется. (Для тех кто любит поковыряться в кишочках: посмотрите скрипт splim.ps1, там используется Invoke-Expression alias: iex). 

Вот так вот мы получили первый тест, примитивный, но работающий.

Теперь про полезные хитрости (возможно, это не всегда очевидно). 
Результат возвращаемый в переменных PowerShell (в нашем случае $vm, $vmX) будет "жить" все время пока запущен powerslim-сервер, который выполнял команду. Другими словами, мы можем разделить выполнение команд eval и check в разные script'ы и все будет работать как и раньше. Более того, между этими командами можно выполнять команды на других powerslim-серверах, если нам это нужно по сценарию проверок (в пример ниже - 192.168.2.10):


Тут видно, что мы используем переменную $vm в другом вызове script на 192.168.1.31, так как знаем, что она там еще "живет".

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

А вот как выглядит результат выполнения этого скрипта в консоли powerslim сервера: 

Тут видны выполняемые команды, результат их выполнения и ошибки (красным). Например, в нашем случае, мы не смогли получить виртуальную машину после ее удаления (второй Get-VM) и PowerShell cmdlet вернул нам описание ошибки. Объект $vmX при этом равен $null.

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

Обратите внимание! Время выполнения одного теста по умолчанию ограничено 10 сек. Для увеличения необходимо задать нужно значение свойству slim.timeout в файле plugins.properties лежащему рядом в запускаемым fitnesse-standalone.jar. Задается как slim.timeout = 100, где 100 новое значение тайм-аута в секундах).

Надеюсь, эта статья прояснила некоторые моменты и поможет вам в освоении FitNesse+PowerSlim.

Приведенный выше пример очень далек от "production"-тестов: например адреса серверов, имя виртуальной машины лучше задавать через макросы. Повторяющиеся действия, например Get-VM, выносить в сценарии. Но это уже другая история.

И помните, "Дорогу осилит идущий" (с) :)
Удачи!

Комментарии

Популярные сообщения из этого блога

Mock vs Stub

Когда мы начали изучать модульное тестирование, то одними из первых терминов, с которыми пришлось познакомиться, стали Mock и Stub. Ниже попробуем порассуждать в чем их сходство и различие, как и для чего они применяются. Проверять работоспособность тестируемого объекта (system uder test - SUT) можно двумя способами: оценивая состояние объекта или его поведение. В первом случае проверка правильности работы метода SUT заключается в оценке состояния самого SUT, а также взаимодействующих объектов, после вызова этого метода. Во-втором, мы проверяем набор и порядок действий (вызовов методов взаимодействующих объектов, других методов SUT), которое должен совершить метод SUT. Собственно, если коротко, то в одном случае используется Stub, а в другом Mock. Это объекты, которые создаются и используются взамен реальных объектов, с которым взаимодействует SUT в процессе своей работы. Теперь подробнее. Gerard Meszaros использует термин Test Double (дублер), как обозначение для объек

План "Б" или как прикольно провести субботний день

Всем привет. Вчера состоялась конференция " План Б ". Организаторами выступили ребята из Яндекса, за что им большое спасибо. Судя по приблизительным подсчетам в мероприятии участвовало около 200 человек. Основной темой конференции было планирование, планирование всего: проектов, разработки, тестирования, дизайнеров и даже организации музыкального фестиваля. Сначала думал написать отчет в обычном своем стиле: кто и что говорил, но почитав твиттер по #pbconf понял, что просто потеряю время :) Поэтому кому оооочень интересно узнать подробности следуйте за птичкой и вы все узнаете (тэг #pbconf попал в top-30 твиттера) Здесь приведу лишь те вещи, которые мне запали в мозг Роман Чернин о продуктовой разработке: "нет заказчика, нет требований, нет сроков -> как принимать решения? ответ: заводим себе Product Manager-а" Оля Павлова (@op): "бойтесь иллюзии точной формулировки" "заказчик - ребенок, выдаем ему игрушку как можно ча

Переключите тумблер или умные люди дурного не посоветуют

Навеяно интересными вопросами про TDD после  вчерашнего выступления . Uncle Bob : " Flipping the Bit " Подробнее постараюсь перевести чуть позже, пока только это: Как определить, что у коллеги (или у вас) ТУМБЛЕР переключен?  Если ваши ответы на вопросы ниже совпадают с приведенными - то все хорошо :) Мантра: Сможете ли вы выполнить работу быстрее используя TDD? ДА Существуют ли какие-либо задачи, которые вы можете выполнить быстрее без TDD? НЕТ Я понимаю, что TDD может помочь в долгом проекте, а что если у вас короткая задача? Будете использовать TDD? Да, потому что TDD быстрее даже в короткой перспективе Что если времени реально не хватает, и босс стоит над душой, будете ли вы использовать TDD? ДА В любом случае? ДА Есть ли случаи, когда вам не нужно использовать TDD? НЕТ Представьте себе что вы на звездном корабле Enterprise ( Star track ) и осталась всего секунда до взрыва антиматерии. Все что вам нужно, чтобы избежать этого, поменять один IF. Будете ли вы и