agile instrumentation
Post on 01-Jul-2015
392 Views
Preview:
DESCRIPTION
TRANSCRIPT
Инструментарий РазработчикаКардаш Николай
redred greengreen
refactorrefactor
Agile
Что будем обсуждать
• Agile-Автоматизация• Хорошие тесты• Инструменты для тестирования
Что НЕ будем обсуждать
• Какой именно фреймворк для юнит тестирования круче?
• Какой tool круче?
Начнем?
Обычные средства автоматизации
• SilkTest• WinRunner• …
• Почему не подходят?
Обычные средства автоматизации
Процесс
Обычные средства автоматизации[+] appstate ActTestStart() basedon none //none
[-] if(!ActivTestAdministration.exists())[ ] ActivTestAdministration.Invoke()
[-] else[ ] ActivTestAdministration.SetActive()
[ ] [+] appstate AfterSuperLogin() basedon ActTestStart
[ ] ActivTestAdministration.SetActive()[ ] LogIn.Invoke()[ ] ConnectionType = LogIn.Connection.ConnectionTable.RadioWebService.GetContents()[GetConnecType][ ] Login(System, Administrator, Server, ConnectionType)[ ] ActivTestAdministration.SetActive()
[ ] [ ] ////-----------------------//TesCases//---------------------------------------[ ] //-------------------------------------------------------------------------[-] //Testcases for WinAdminShell
[+] testcase TLoginFirst()appstate AfterSuperLogin[-] do
[ ] ActivTestAdministration.Help.Contents.Pick()[ ] ActivTestAdministrationShell.Close()[ ] ActivTestAdministration.Exit()
[-] except[ ] Print("Failed")[ ] ActivTestAdministration.Exit()
[ ] [ ] [+] testcase TLogout() appstate none
[-] do[ ] Logout()
[-] except[ ] Print("Failed")
[ ] [ ]
[+] testcase TCreateHierarhy()appstate SystemAdministratorStart[-] do
[ ] SuperUser = SystemAdministration.VerticalSplitter.SWFSplitter.HierarchyPanel.OrganisationalHierarchy.GetContents()[1]
[ ] RecoveryInfo.HierarchyLevel = SuperUser[ ] CreateHNode(IDHierarchy[1], NameHierarchy[1])[ ] RecoveryInfo.HierarchyLevel = SuperUser+"/"+NameHierarchy[1][ ] CreateHNode(IDHierarchy[2], NameHierarchy[2])[ ] RecoveryInfo.HierarchyLevel = SuperUser+"/"+NameHierarchy[1]+"/"+NameHierarchy[2][ ] CreateHNode(IDHierarchy[3], NameHierarchy[3])[ ] RecoveryInfo.HierarchyLevel =
SuperUser+"/"+NameHierarchy[1]+"/"+NameHierarchy[2]+"/"+NameHierarchy[3][ ] CreateHNode(IDHierarchy[4], NameHierarchy[4])[ ] RecoveryInfo.HierarchyLevel =
SuperUser+"/"+NameHierarchy[1]+"/"+NameHierarchy[2]+"/"+NameHierarchy[3]+"/"+NameHierarchy[4][ ] CreateHNode(IDHierarchy[5], NameHierarchy[5])[ ] RecoveryInfo.HierarchyLevel =
SuperUser+"/"+NameHierarchy[1]+"/"+NameHierarchy[2]+"/"+NameHierarchy[3]+"/"+NameHierarchy[4]+"/"+NameHierarchy[5][ ] [ ] EditTestCentreLab()[ ]
[ ] EditTestCentreLab()[ ] [ ] CreateHNode(IDHierarchy[6], NameHierarchy[6])[ ] RecoveryInfo.HierarchyLevel =
SuperUser+"/"+NameHierarchy[1]+"/"+NameHierarchy[2]+"/"+NameHierarchy[3]+"/"+NameHierarchy[4]+"/"+NameHierarchy[5]+"/"+NameHierarchy[6]
[ ] SystemAdministration.VerticalSplitter.SWFSplitter.HierarchyPanel.OrganisationalHierarchy.Select (SuperUser+"/"+NameHierarchy[1]+"/"+NameHierarchy[2]+"/"+NameHierarchy[3]+"/"+NameHierarchy[4])
[ ] CreateHNode(IDHierarchy[7], NameHierarchy[7])[ ] RecoveryInfo.HierarchyLevel =
SuperUser+"/"+NameHierarchy[1]+"/"+NameHierarchy[2]+"/"+NameHierarchy[3]+"/"+NameHierarchy[4]+"/"+NameHierarchy[7][ ]
SystemAdministration.VerticalSplitter.SWFSplitter.HierarchyPanel.OrganisationalHierarchy.Select (SuperUser+"/"+NameHierarchy[1]+"/"+NameHierarchy[2]+"/"+NameHierarchy[3]+"/"+NameHierarchy[4])
[ ] CreateHNode(IDHierarchy[8], NameHierarchy[8])[ ] RecoveryInfo.HierarchyLevel =
SuperUser+"/"+NameHierarchy[1]+"/"+NameHierarchy[2]+"/"+NameHierarchy[3]+"/"+NameHierarchy[4]+"/"+NameHierarchy[8][ ] [ ] ActivTestAdministration.Exit()
[-] except[ ] Print("Failed")[ ] ActivTestAdministration.Exit()
[ ]
[+] testcase TManageUserAttributes()appstate UserAttributesStart[-] do
[ ] UserAttributes()[ ] ActivTestAdministration.Exit()
[-] except[ ] Print("Failed")[ ] ActivTestAdministration.Exit()
[ ] [+] testcase TCreateUKAdmin()appstate SystemAdministratorStart
[-] do[ ] CreateAdministrator(SuperUser+"/"+NameHierarchy[1], ukadmin, ukadmin,
NameHierarchy[1], "Admin", ukadmin, 1, NonePermission)[ ] ActivTestAdministration.Exit()
[-] except[ ] Print("Failed")[ ] ActivTestAdministration.Exit()
[ ] [ ][+] testcase TPackageInstallation()appstate ActTestStart
[-] do[ ] ActivTestAdministration.SetActive()[ ] LogIn.Invoke()[ ] ConnectionType =
LogIn.Connection.ConnectionTable.RadioWebService.GetContents()[GetConnecType][ ] Login(ukadmin, ukadmin, Server, ConnectionType)//Change login information[ ] //--------------------------------------------------------[ ] Agent.SetOption (OPT_WINDOW_TIMEOUT, 1500)
[ ] ActivTestAdministration.SetActive()[ ] PackageInstallation(Packages)//Change path to the packages[ ] Agent.SetOption (OPT_WINDOW_TIMEOUT, 15)[ ] ActivTestAdministration.Exit()
[-] except[ ] Print("Failed")[ ] ActivTestAdministration.Exit()[ ]
[ ] [ ] [+] testcase TPacAssignment()appstate ActTestStart
[-] do[ ] ActivTestAdministration.SetActive()[ ] LogIn.Invoke()[ ] ConnectionType =
LogIn.Connection.ConnectionTable.RadioWebService.GetContents()[GetConnecType][ ] Login(ukadmin, ukadmin, Server, ConnectionType)//Change login information[ ] ActivTestAdministration.Edit.SystemAdministration.Pick ()[ ]
SystemAdministration.VerticalSplitter.SWFSplitter.HierarchyPanel.OrganisationalHierarchy.TypeKeys ("<#Times>")[ ] int tmp[-] for (tmp = 2; tmp < (ListCount(NameHierarchy)-1); ++tmp)
[ ] RecoveryInfo.HierarchyLevelNum = tmp[-] do
[ ] SystemAdministration.SetActive ()[ ]
SystemAdministration.Tools.PackageAssignment.Pick ()[-] if(PackageAssignment.Exists())
[ ] PackageAssignment()
[-] else
Обычные средства автоматизации
• Еще проблемы?– Знания по программированию– Лицензия– Не интересно
Agile-Инструментарий
Agile-Инструментарий
• Немедленный старт
Agile-Инструментарий
• Тесты и реализация отдельно
Agile-Инструментарий
• Поощрять Best Practices
Agile-Инструментарий
• Профессиональный рост
Что можно тестировать?
Интерфейс пользователя Бизнес логика Данные
Как начать писать тесты?
• Необходимо ответить на три вопроса:– Как тестируем?– Что тестируем?– Что ожидаем?
Бизнес логика приложения
Бизнес логика приложения
• Это программный код
От чего зависит тест?
Базы данных
КомпонентыСервисы
Файлы
Код
Какие бывают тесты?
• Модульный тест (unit)
• Системный тест (system)– Приемочные– Интеграционные– И т.д.
Как написать хороший тест?
1.Придумайте ему хорошее имяpublic void Я_очень_хороший_тест_потому_что_в_имени_много_букаф{ //…}
public void Класс_должен_уметь_сравнивать_пустые_значения_с_ _непустыми_причем_пустые_должны_быть_всегда_ниже(){ //…}
public void ИмяФункции_выдать_ArgumentNullException_если _передан_null(){ //…}
Как написать хороший тест?
2.Стандартная структура! (1) Arrange
(2) Act
(3) Assert
Как написать хороший тест?
3.Тест – это код.Избегайте дублирования
Проводите рефакторинг
Проводите ревью тестов
Как написать хороший тест?
4.Независимость
TESTTEST TESTTEST TEST TEST
TEST TESTTEST TEST TEST
Как написать хороший тест?
5.Время выполнения теста
Тест фреймворки
• Семейство xUnit фреймворков– nUnit– mbUnit– xUnit– jUnit– jsUnit– … ну очень много.
Mock Object Frameworks
Базы данных
КомпонентыСервисы
Файлы
Код
Mock Object Frameworks
• Изолируют зависимости
Базы данных
КомпонентыСервисы
Файлы
Код
Demo
Данные
База данных
• SQL – это программный код тоже!
• Тест состоит из:1 2 3 4
Demo
Интерфейс пользователя
Интерфейс пользователя
• Хорошая, понятная архитектура – Шаблоны проектирования (MVC, MVP,
Application Controller, Mediator, etc.)
• Архитектура в стиле «as designed»
Интерфейст пользователя
• Model View Controller (MVC)– Какие данные отображаются?
View
Controller
Model
Интерфейст пользователя
• Архитектура в стиле «as designed»– Пишем приёмочные тесты
1. Устанавливаем приложение2. Подготавливаем тестовые данные3. Запускаем
Demo
Командная работа
Командная работа
• Fitnesse
Demo
И так...
• Тестировать можно все!• Важно – определить, какие средства
удобны для вашей команды.
Вопросы?
top related