Post on 22-Nov-2014
description
transcript
Почему это не работает?
или
Записки консультанта
Февраль 2012Алексей Резчиков
@twincengray #atdays2
Обо мне
Консультант по Testing Automation, Continuous Integration и Continuous Delivery
Java разработчик и тимлид уже более 6-ти лет
В разное время работал project, resource, development и competency manager
Последователь XP/Agile/Lean
Евангелист Spring Framework в рамках SpringByExample.com.ua
@twincengray #atdays3
Куда мы идем?
@twincengray #atdays4
Реалии индустрии
@twincengray #atdays5
Сказки
Сказка ложь, да в ней намек… (с)
Народная мудрость
@twincengray #atdays6
Сказка №1
Site builder
Разрабатывается много лет, много унаследованного кода и архитектуры
Большая текучка кадров
@twincengray #atdays7
Проблема и решение
Проблема:Качество и своевременность поставки
Предлагаемое решение:Внедрение автоматизации тестирования
@twincengray #atdays8
А на самом деле…
На самом деле проблема оказалась в отсутствии структурированных требований и невозможности регрессионного тестирования
@twincengray #atdays9
Сказка №2Распределенное клиент-серверное приложение
Сервер и клиент тоже веб-приложения
Отраслевые особенности
Работающий процесс Continuous Deployment
@twincengray #atdays10
Проблема и решениеПроблема:
Нет возможности поставлять продукт быстро из-за большого объема ручного тестирования
Предложенное решение:
Внедрение автоматизированного тестирования и CI
@twincengray #atdays11
А на самом деле…
Отсутствие низкоуровневых тестов не позволяет, даже при наличии UI тестов оперативно найти и устранить неисправность
«Хорошо, но плохо»
Так видит автоматизацию команда
@twincengray #atdays
12
«Хорошо, но плохо»
А так видит автоматизацию заказчик
@twincengray #atdays
13
@twincengray #atdays14
5 почему (почему не работает)
Why?
Why?
Why?
Why?
Why?
@twincengray #atdays15
Соответствие цели внедрения средствам (внедряемым практикам
Правильное понимание/постановка цели внедрения
Правильное определение проблемы, которую будет решать внедрение той или иной практики
Осознание наличия проблемы
Правильная постановка и понимание целей проекта (продукта)
@twincengray #atdays16
Мы поговорим про
Соответствие цели внедрения средствам (внедряемым практикам)
Правильное понимание/постановка цели внедрения
Правильное определение проблемы, которую будет решать внедрение той или иной практики
@twincengray #atdays17
Понятия/практики (buzzwords)
ATDD – Acceptance Test Driven Development
BDD – Behavior Driven Development
CI – Continuous Integration
CD – Continuous Delivery
Bzzzz
zzzz
18
«Топографический кретинизм»
@twincengray #atdays
@twincengray #atdays19
«Синдром серебряной пули»
@twincengray #atdays20
Полумеры
- А, сто рублей, не спасут отца русской демократии?
@twincengray #atdays21
Детские болезни
@twincengray #atdays22
ATDD: Непонимание что такое критерии
приемки
@twincengray #atdays23
ATDD: Когда нужно BDD и наоборот
@twincengray #atdays24
ATDD: Критерии приемки пишутся не всей командой
@twincengray #atdays25
BDD: Cоставление GWT
26
D|DefaultListableBeanFactory |Returning cached instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'D|DefaultListableBeanFactory |Returning cached instance of singleton bean 'org.springframework.context.annotation.internalRequiredAnnotationProcessor'D|DefaultListableBeanFactory |Returning cached instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'D|DefaultListableBeanFactory |Returning cached instance of singleton bean 'org.springframework.context.annotation.internalPersistenceAnnotationProcessor'D|DefaultListableBeanFactory |Creating shared instance of singleton bean 'sendMailTextConfig'D|DefaultListableBeanFactory |Creating instance of bean 'sendMailTextConfig'D|InjectionMetadata |Found injected element on class [com.technorati.portal.service.SendMailTextConfig$$EnhancerByCGLIB$$33a64e76]: AutowiredFieldElement for private org.springframework.core.env.Environment com.technorati.portal.service.SendMailTextConfig.environmentD|DefaultListableBeanFactory |Eagerly caching bean 'sendMailTextConfig' to allow for resolving potential circular referencesD|InjectionMetadata |Processing injected method of bean 'sendMailTextConfig': AutowiredFieldElement for private org.springframework.core.env.Environment com.technorati.portal.service.SendMailTextConfig.environmentD|DefaultListableBeanFactory |Returning cached instance of singleton bean 'environment'D|AutowiredAnnotationBeanPostProcessor |Autowiring by type from bean name 'sendMailTextConfig' to bean named 'environment'D|DefaultListableBeanFactory |Finished creating instance of bean 'sendMailTextConfig'D|DefaultListableBeanFactory |Returning cached instance of singleton bean 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor'D|DefaultListableBeanFactory |Creating shared instance of singleton bean 'sendMailService'D|DefaultListableBeanFactory |Creating instance of bean 'sendMailService'D|DefaultListableBeanFactory |Returning cached instance of singleton bean 'sendMailTextConfig'D|DefaultListableBeanFactory |Creating shared instance of singleton bean 'freemarkerConfiguration'D|DefaultListableBeanFactory |Creating instance of bean 'freemarkerConfiguration'D|DefaultListableBeanFactory |Returning cached instance of singleton bean 'sendMailTextConfig'D|DefaultListableBeanFactory |Eagerly caching bean 'freemarkerConfiguration' to allow for resolving potential circular referencesD|DefaultListableBeanFactory |Finished creating instance of bean 'freemarkerConfiguration'D|DefaultListableBeanFactory |Creating shared instance of singleton bean 'templatesMap'D|DefaultListableBeanFactory |Creating instance of bean 'templatesMap'D|DefaultListableBeanFactory |Returning cached instance of singleton bean 'sendMailTextConfig'D|DefaultListableBeanFactory |Eagerly caching bean 'templatesMap' to allow for resolving potential circular referencesD|DefaultListableBeanFactory |Finished creating instance of bean 'templatesMap'D|DefaultListableBeanFactory |Creating shared instance of singleton bean 'mailSender'D|DefaultListableBeanFactory |Creating instance of bean 'mailSender'D|DefaultListableBeanFactory |Returning cached instance of singleton bean 'sendMailTextConfig'D|DefaultListableBeanFactory |Eagerly caching bean 'mailSender' to allow for resolving potential circular referencesD|DefaultListableBeanFactory |Finished creating instance of bean 'mailSender'D|InjectionMetadata |Found injected element on class [com.technorati.portal.service.SendMailService]: ResourceElement for private java.util.Map com.technorati.portal.service.SendMailService.templatesMapD|InjectionMetadata |Found injected element on class [com.technorati.portal.service.SendMailService]: AutowiredFieldElement for private org.springframework.mail.MailSender com.technorati.portal.service.SendMailService.mailSenderD|InjectionMetadata |Found injected element on class [com.technorati.portal.service.SendMailService]: AutowiredFieldElement for private freemarker.template.Configuration com.technorati.portal.service.SendMailService.freemarkerConfigurationD|InjectionMetadata |Found injected element on class [com.technorati.portal.service.SendMailService]: AutowiredFieldElement for private java.lang.String com.technorati.portal.service.SendMailService.emailFromD|DefaultListableBeanFactory |Eagerly caching bean 'sendMailService' to allow for resolving potential circular referencesD|InjectionMetadata |Processing injected method of bean 'sendMailService': ResourceElement for private java.util.Map com.technorati.portal.service.SendMailService.templatesMapD|DefaultListableBeanFactory |Returning cached instance of singleton bean 'templatesMap'D|InjectionMetadata |Processing injected method of bean 'sendMailService': AutowiredFieldElement for private org.springframework.mail.MailSender com.technorati.portal.service.SendMailService.mailSenderD|DefaultListableBeanFactory |Returning cached instance of singleton bean 'mailSender'D|AutowiredAnnotationBeanPostProcessor |Autowiring by type from bean name 'sendMailService' to bean named 'mailSender'D|InjectionMetadata |Processing injected method of bean 'sendMailService': AutowiredFieldElement for private freemarker.template.Configuration com.technorati.portal.service.SendMailService.freemarkerConfigurationD|DefaultListableBeanFactory |Returning cached instance of singleton bean 'freemarkerConfiguration'D|AutowiredAnnotationBeanPostProcessor |Autowiring by type from bean name 'sendMailService' to bean named 'freemarkerConfiguration'D|InjectionMetadata |Processing injected method of bean 'sendMailService': AutowiredFieldElement for private java.lang.String com.technorati.portal.service.SendMailService.emailFromD|DefaultListableBeanFactory |Finished creating instance of bean 'sendMailService'
BDD: «Где упал мой тест?»
@twincengray #atdays
@twincengray #atdays27
BDD: Инструментальные
проблемы
28
CI
@twincengray #atdays
@twincengray #atdays
CI: «Демократия»
29
@twincengray #atdays30
CD: Delivery is not a deployment
@twincengray #atdays31
CD
@twincengray #atdays32
CD: А где ваш Configuration Management?
@twincengray #atdays33
Технические риски
@twincengray #atdays34
Недостаток опыта по технологии
@twincengray #atdays35
Недостаток опыта в тестировании
@twincengray #atdays36
Избегание CI
@twincengray #atdays37
Тестирование на слишком высоком уровне
End-to-end/GUI
Integration
Unit
@twincengray #atdays38
Отсутствие или неполная регрессия
@twincengray #atdays39
Итоги
Начинать с начала
«Серебряной пули» нет
Individuals and interactions…
It’s all about the money
@twincengray #atdays40
Вопросы?@twincengray@ua_spring
oleksiy.rezchykov@gmail.com
SpringByExample.com.ua
mcgray.com.ua