agile instrumentation

41
Инструментарий Разработчика Кардаш Николай red green refac tor Agile

Upload: mikalaikardash

Post on 01-Jul-2015

392 views

Category:

Technology


0 download

DESCRIPTION

in Russian

TRANSCRIPT

Page 1: Agile Instrumentation

Инструментарий РазработчикаКардаш Николай

redred greengreen

refactorrefactor

Agile

Page 2: Agile Instrumentation

Что будем обсуждать

• Agile-Автоматизация• Хорошие тесты• Инструменты для тестирования

Page 3: Agile Instrumentation

Что НЕ будем обсуждать

• Какой именно фреймворк для юнит тестирования круче?

• Какой tool круче?

Page 4: Agile Instrumentation

Начнем?

Page 5: Agile Instrumentation

Обычные средства автоматизации

• SilkTest• WinRunner• …

• Почему не подходят?

Page 6: Agile Instrumentation

Обычные средства автоматизации

Процесс

Page 7: Agile Instrumentation

Обычные средства автоматизации[+] 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

Page 8: Agile Instrumentation

Обычные средства автоматизации

• Еще проблемы?– Знания по программированию– Лицензия– Не интересно

Page 9: Agile Instrumentation

Agile-Инструментарий

Page 10: Agile Instrumentation

Agile-Инструментарий

• Немедленный старт

Page 11: Agile Instrumentation

Agile-Инструментарий

• Тесты и реализация отдельно

Page 12: Agile Instrumentation

Agile-Инструментарий

• Поощрять Best Practices

Page 13: Agile Instrumentation

Agile-Инструментарий

• Профессиональный рост

Page 14: Agile Instrumentation

Что можно тестировать?

Интерфейс пользователя Бизнес логика Данные

Page 15: Agile Instrumentation

Как начать писать тесты?

• Необходимо ответить на три вопроса:– Как тестируем?– Что тестируем?– Что ожидаем?

Page 16: Agile Instrumentation

Бизнес логика приложения

Page 17: Agile Instrumentation

Бизнес логика приложения

• Это программный код

Page 18: Agile Instrumentation

От чего зависит тест?

Базы данных

КомпонентыСервисы

Файлы

Код

Page 19: Agile Instrumentation

Какие бывают тесты?

• Модульный тест (unit)

• Системный тест (system)– Приемочные– Интеграционные– И т.д.

Page 20: Agile Instrumentation

Как написать хороший тест?

1.Придумайте ему хорошее имяpublic void Я_очень_хороший_тест_потому_что_в_имени_много_букаф{ //…}

public void Класс_должен_уметь_сравнивать_пустые_значения_с_ _непустыми_причем_пустые_должны_быть_всегда_ниже(){ //…}

public void ИмяФункции_выдать_ArgumentNullException_если _передан_null(){ //…}

Page 21: Agile Instrumentation

Как написать хороший тест?

2.Стандартная структура! (1) Arrange

(2) Act

(3) Assert

Page 22: Agile Instrumentation

Как написать хороший тест?

3.Тест – это код.Избегайте дублирования

Проводите рефакторинг

Проводите ревью тестов

Page 23: Agile Instrumentation

Как написать хороший тест?

4.Независимость

TESTTEST TESTTEST TEST TEST

TEST TESTTEST TEST TEST

Page 24: Agile Instrumentation

Как написать хороший тест?

5.Время выполнения теста

Page 25: Agile Instrumentation

Тест фреймворки

• Семейство xUnit фреймворков– nUnit– mbUnit– xUnit– jUnit– jsUnit– … ну очень много.

Page 26: Agile Instrumentation

Mock Object Frameworks

Базы данных

КомпонентыСервисы

Файлы

Код

Page 27: Agile Instrumentation

Mock Object Frameworks

• Изолируют зависимости

Базы данных

КомпонентыСервисы

Файлы

Код

Page 28: Agile Instrumentation

Demo

Page 29: Agile Instrumentation

Данные

Page 30: Agile Instrumentation

База данных

• SQL – это программный код тоже!

• Тест состоит из:1 2 3 4

Page 31: Agile Instrumentation

Demo

Page 32: Agile Instrumentation

Интерфейс пользователя

Page 33: Agile Instrumentation

Интерфейс пользователя

• Хорошая, понятная архитектура – Шаблоны проектирования (MVC, MVP,

Application Controller, Mediator, etc.)

• Архитектура в стиле «as designed»

Page 34: Agile Instrumentation

Интерфейст пользователя

• Model View Controller (MVC)– Какие данные отображаются?

View

Controller

Model

Page 35: Agile Instrumentation

Интерфейст пользователя

• Архитектура в стиле «as designed»– Пишем приёмочные тесты

1. Устанавливаем приложение2. Подготавливаем тестовые данные3. Запускаем

Page 36: Agile Instrumentation

Demo

Page 37: Agile Instrumentation

Командная работа

Page 38: Agile Instrumentation

Командная работа

• Fitnesse

Page 39: Agile Instrumentation

Demo

Page 40: Agile Instrumentation

И так...

• Тестировать можно все!• Важно – определить, какие средства

удобны для вашей команды.

Page 41: Agile Instrumentation

Вопросы?