вторник, 25 ноября 2008 г.

Автологируемые контролы

При написании скриптов автоматизированного тестирования на 4test (и не только) одним из важных аспектов является результирующий файл, получаемый после выполнения скрипта. В данном результирующем файле довольно подробно должна быть представлена информация о последовательности всех действий, которые произвел скрипт. Поэтому в самом коде постоянно нужно следить за логированием и писать много ненужного (для самого процесса тестирования) кода.

[ ] //Пример #1
[ ] STRING sUserName = "administrator"
[ ]
[ ] wMainWnd.HtmlTextField("$user name").SetText(sUserName )
[ ] Print("В текстовое поле 'user name' был помещен текст {sUserName}.")
[ ]
[ ] wMainWnd.HtmlPushButton("$login").Click()
[ ] Print("Нажата кнопка 'login'.")

Как видно из примера, практически на каждую строчку с определенным действием приходится добавлять строку логирования этого самого действия. Хорошим решением в данном случае будет создать свой собвственный набор контролов со всеми необходимыми методами, которые будут автоматически логировать все свои действия.
Для модернизации примера приведенного выше создадим два winclass-а: MyPushButton и MyTextField с переопределенными методами Click() и SetText() соответственно.

[-] winclass MyPushButton : HtmlPushButton
[-] void Click(int iBtn optional, int iX optional, int iY optional)
[ ] Print("Нажата кнопка '{this.GetCaption()}'.")
[ ] derived::Click(iBtn, iX, iY)

[-] winclass MyTextField : HtmlTextField
[-] void SetText(STRING sValue)
[ ] Print("В текстовое поле '{this.GetCaption()}' был помещен текст {sValue}.")
[ ] derived :: SetText(sValue)

Теперь можно переписать пример.

[ ] //Пример #2
[ ] STRING sUserName = "administrator"
[ ]
[ ] wMainWnd.MyTextField("$user name").SetText(sUserName )
[ ]
[ ] wMainWnd.MyPushButton("$login").Click()

В данном случае мы вместо базовых классов HtmlTextField и HtmlPushButton используем MyTextField и MyPushButton. Мы избавились от лишнего кода и логирование будет выполненно автоматически. Результирующие файлы примера #1 и примера #2 будут одинаковы.

понедельник, 17 ноября 2008 г.

Использование API функций в SilkTest

Иногда в Silktest возникает необходимость в использовании Windows API. Например когда необходимо получить доступ к директории "Cookies" путь к которой содержит имя пользователя, под которым Вы в данный момент залогинены на компьютере. SilkTest предоставлет нам такую возможность.

Для получения доступа к функциям из внешних DLL, необходимо использовать конструкцию вида:

[-] dll dllName.dll
[ ] [ReturnType] FuncName ( [ArgList] ) [alias dllFuncName]

где:
dllName.dll - имя библиотеки dll, функции которой предполагаетс использовать.
ReturnType - возвращаемый тип. (Является необязательным параметром)
FuncName - имя импортируемой функции. Может отличаться от имени, которое указано в DLL. Если имя функции указывается другое, то необходимо указать последний параметр alias
ArgList - список принимаемых аргументов. (Является необязательным параметром)
alias dllFuncName - имя функции, как оно указано в DLL. Указывается только в том случае, если имя FuncName отличается от оригинального имени функции.

Пример:

// Импорт функции для получения имени залогиненного в данный момент пользователя.
[-] dll "advapi32.dll"
[ ] LONG DLL_GetUserName(out STRING lpBuffer, inout LONG nSize) alias "GetUserNameW"

// Использование импортированной функции.
[ ] STRING sUserName // Переменная имени полученного пользователя.
[ ] LONG nSize = 0 // Переменная длинны имени полученного пользователя.
[ ] DLL_GetUserName(sUserName, nSize)

воскресенье, 16 ноября 2008 г.

О пользе тестирования

В последнее время на рынке программного обеспечения появляется все больше и больше программных продуктов. В связи с этим конкуренция между производителями все возрастает. В конечном итоге выигрывает тот, кто в состоянии создать более функциональный (удовлетворяющий запросам пользователей), надежный (стабильно выполняющий свои функции) программный продукт с меньшими финансовыми затратами на создание. Оставим проблему функциональности для решения аналитиками и займемся рассмотрением тестирования.
В настоящее время тестирование стало неотъемлемой частью процесса создания программного обеспечения. Тестирование позволяет выпустить более надежный продукт и в ряде случаев помогает существенно снизить его себестоимость. Ведь чем позже будет обнаружена ошибка в программном коде, тем дороже будет ее исправление. Исправление ошибок в программном продукте, который уже попал к постребителям, стоит очень и очень дорого.
Тестирование подразделяется на ручное и автоматизированное, а автоматизированное в свою очередь делится на нагрузочное, регрессионное.
В этом блоге основное внимание я буду уделять автоматизированному регрессионному тестированию. Я буду приводить примеры связанные с особенностям тестирования с использованием SilkTest и языка 4Test.
Очень надеюсь что материалы этого блога будут полезны для его читателей.

Постоянные читатели