why it is not working
DESCRIPTION
Основные ошибки внедрения ATDD, BDD, CI, CD на проектах, Резчиков Алексей Каждый новый проект, к которому Алексей подключается в качестве консультанта, уже имеет свою историю внедрения автоматизации тестирования, CI и CD. Истории очень разные, каждая интересна по-своему, каждая рассказывает об ошибках. О самых распространенных из них, а также о том, как их не допустить, Алексей расскажет в своем докладе.TRANSCRIPT
Почему это не работает? или
Записки консультанта
Февраль 2012
Алексей Резчиков
Обо мне
Консультант по Testing Automation, Continuous Integration и Continuous Delivery
Java разработчик и тимлид уже более 6-ти лет
В разное время работал project, resource, development и competency manager
Последователь XP/Agile/Lean
Евангелист Spring Framework в рамках SpringByExample.com.ua
@twincengray #atdays
2
Куда мы идем?
@twincengray #atdays 3
@twincengray #atdays 4
Реалии индустрии
Сказки
Сказка ложь, да в ней намек… (с)
Народная мудрость
@twincengray #atdays 5
Сказка №1
Site builder
Разрабатывается много лет, много унаследованного кода и архитектуры
Большая текучка кадров
@twincengray #atdays 6
Проблема и решение
Проблема: Качество и своевременность поставки Предлагаемое решение: Внедрение автоматизации тестирования
@twincengray #atdays
7
А на самом деле…
На самом деле проблема оказалась в отсутствии структурированных требований и невозможности регрессионного тестирования
@twincengray #atdays 8
Сказка №2 Распределенное клиент-серверное приложение
Сервер и клиент тоже веб-приложения
Отраслевые особенности
Работающий процесс Continuous Deployment
@twincengray #atdays 9
Проблема и решение Проблема:
Нет возможности поставлять продукт быстро из-за большого объема ручного тестирования
Предложенное решение:
Внедрение автоматизированного тестирования и CI
@twincengray #atdays 10
А на самом деле…
Отсутствие низкоуровневых тестов не позволяет, даже при наличии UI тестов оперативно найти и устранить неисправность
@twincengray #atdays 11
«Хорошо, но плохо» Это про внедрение автоматизации.
Из моего опыта только единицы заказчиков могут конкретно ответить на вопрос зачем им автоматизация
Остальные не готовы за это платить
@twincengray #atdays 12
5 почему (почему не работает)
@twincengray #atdays 13
Why?
Why?
Why?
Why?
Why?
Соответствие цели внедрения средствам (практикам внедрения)
Правильное понимание/постановка цели внедрения
Правильное определение проблемы, которую будет решать внедрение той или иной практики
Осознание наличия проблемы
Правильная постановка и понимание целей проекта (продукта)
@twincengray #atdays 14
Мы поговорим про
Соответствие цели внедрения средствам (практикам внедрения)
Правильное понимание/постановка цели внедрения
Правильное определение проблемы, которую будет решать внедрение той или иной практики
@twincengray #atdays 15
Понятия/практики (buzzwords)
ATDD – Acceptance Test Driven Development
BDD – Behavior Driven Development
CI – Continuous Integration
CD – Continuous Delivery
@twincengray #atdays 16
«Топографический кретинизм»
@twincengray #atdays 17
«Синдром серебряной пули»
@twincengray #atdays 18
Полумеры
- А, сто рублей, не спасут отца русской демократии?
@twincengray #atdays 19
Детские болезни
@twincengray #atdays 20
ATDD: Непонимание что такое критерии приемки
@twincengray #atdays 21
ATDD: Когда нужно BDD и наоборот
@twincengray #atdays 22
ATDD: Критерии приемки пишутся не всей командой
@twincengray #atdays 23
BDD: Cоставление GWT
@twincengray #atdays 24
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.environment D|DefaultListableBeanFactory |Eagerly caching bean 'sendMailTextConfig' to allow for resolving potential circular references D|InjectionMetadata |Processing injected method of bean 'sendMailTextConfig': AutowiredFieldElement for private org.springframework.core.env.Environment com.technorati.portal.service.SendMailTextConfig.environment D|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 references D|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 references D|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 references D|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.templatesMap D|InjectionMetadata |Found injected element on class [com.technorati.portal.service.SendMailService]: AutowiredFieldElement for private org.springframework.mail.MailSender com.technorati.portal.service.SendMailService.mailSender D|InjectionMetadata |Found injected element on class [com.technorati.portal.service.SendMailService]: AutowiredFieldElement for private freemarker.template.Configuration com.technorati.portal.service.SendMailService.freemarkerConfiguration D|InjectionMetadata |Found injected element on class [com.technorati.portal.service.SendMailService]: AutowiredFieldElement for private java.lang.String com.technorati.portal.service.SendMailService.emailFrom D|DefaultListableBeanFactory |Eagerly caching bean 'sendMailService' to allow for resolving potential circular references D|InjectionMetadata |Processing injected method of bean 'sendMailService': ResourceElement for private java.util.Map com.technorati.portal.service.SendMailService.templatesMap D|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.mailSender D|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.freemarkerConfiguration D|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.emailFrom D|DefaultListableBeanFactory |Finished creating instance of bean 'sendMailService'
BDD: «Где упал мой тест?»
@twincengray #atdays 25
BDD: Инструментальные проблемы
@twincengray #atdays 26
CI
@twincengray #atdays 27
CI: «Демократия»
@twincengray #atdays 28
CD: Путанница Cont. deployment и CD
@twincengray #atdays 29
CD
@twincengray #atdays 30
CD: А где ваш Configuration Management?
@twincengray #atdays 31
Технические риски
@twincengray #atdays 32
Недостаток опыта по технологии
@twincengray #atdays 33
Недостаток опыта в тестировании
@twincengray #atdays 34
Избегание CI
@twincengray #atdays 35
Тестирование на слишком высоком уровне
@twincengray #atdays 36
End-to-end/GUI
Integration
Unit
Отсутствие или неполная регрессия
@twincengray #atdays 37
Итоги
Начинать с начала
«Серебряной пули» нет
Individuals and interactions…
It’s all about the money
@twincengray #atdays 38
Вопросы?
@twincengray #atdays 39
@twincengray @ua_spring
SpringByExample.com.ua
mcgray.com.ua