Почему это не работает (Записки консультанта)

Post on 22-Nov-2014

819 views 1 download

Tags:

description

Automated testing days presentation

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