Инструментарий Разработчика Кардаш Николай red green refactor 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]+"/"+NameHierarc hy[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 (" ") [ ] 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-Инструментарий
Немедленный старт Тесты и реализация отдельно Best Practices Нормальные языки программирования Профессиональный рост
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. Независимость TEST
Как написать хороший тест? 5. Время выполнения теста
Тест фреймворки Семейство xUnit фреймворков – nUnit – mbUnit – xUnit – jUnit – jsUnit – … ну очень много.
Mock Object Frameworks Базы данных Компоненты Сервисы Файлы Код
Mock Object Frameworks Изолируют зависимости Базы данных Компоненты Сервисы Файлы Код
Demo
Данные
База данных SQL – это программный код тоже! Тест состоит из: 1234
Demo
Интерфейс пользователя
Хорошая, понятная архитектура – Шаблоны проектирования (MVC, MVP, Application Controller, Mediator, etc.) Архитектура в стиле «as designed»
Интерфейст пользователя Model View Controller (MVC) – Какие данные отображаются? View Controller Model
Интерфейст пользователя Архитектура в стиле «as designed» – Пишем приёмочные тесты 1.Устанавливаем приложение 2.Подготавливаем тестовые данные 3.Запускаем
Demo
Командная работа
Fitnesse
Demo
И так... Тестировать можно все! Важно – определить, какие средства удобны для вашей команды.
Вопросы?