Test-Driven Development
                                   &
                               Refactoring


        Стефан К...
за	
  мен




Sunday, April 25, 2010
програмист
Sunday, April 25, 2010
Sunday, April 25, 2010
Sunday, April 25, 2010
Sunday, April 25, 2010
първи	
  unit	
  test
                         първи	
  работен	
  ден




Sunday, April 25, 2010
презентационни	
  умения




Sunday, April 25, 2010
3
Sunday, April 25, 2010
говоря	
  бързо




Sunday, April 25, 2010
210
Sunday, April 25, 2010
Sunday, April 25, 2010
Аз ползвам
                         Visual Source Safe




Sunday, April 25, 2010
Аз ползвам
                         Visual Source Safe




Sunday, April 25, 2010
test-­‐driven	
  development
                                  refactoring




Sunday, April 25, 2010
extreme	
  programming




Sunday, April 25, 2010
test-­‐driven	
  development
                         refactoring




Sunday, April 25, 2010
УебТех,	
  миналата	
  година




Sunday, April 25, 2010
Sunday, April 25, 2010
Sunday, April 25, 2010
Моя браузър е Гугъл, бабиното.




Sunday, April 25, 2010
Правя Test-Driven
                           Development.




Sunday, April 25, 2010
Пиша тестове


                         Правя Test-Driven
                           Development.




Sunday, April 25, 20...
конкретни	
  практики




Sunday, April 25, 2010
План




Sunday, April 25, 2010
План

                     1. Какво	
  е	
  test-­‐driven?




Sunday, April 25, 2010
План

                     1. Какво	
  е	
  test-­‐driven?
                     2. Малка	
  демонстрация	
  (видео!)




S...
План

                     1. Какво	
  е	
  test-­‐driven?
                     2. Малка	
  демонстрация	
  (видео!)
     ...
План

                     1. Какво	
  е	
  test-­‐driven?
                     2. Малка	
  демонстрация	
  (видео!)
     ...
@skanev	
  Мога	
  да	
  прилагам	
  test-­‐driven
                         development	
  извън	
  програмирането?
      ...
План

                     1. Какво	
  е	
  test-­‐driven?
                     2. Малка	
  демонстрация	
  (видео!)
     ...
refactor	
  |rēˈfaktər|
                         verb

                         improving	
  the	
  design	
  of	
  code
 ...
Sunday, April 25, 2010
не	
  добавяте	
  функционалност




Sunday, April 25, 2010
не	
  добавяте	
  функционалност
                        подобрявете	
  код




Sunday, April 25, 2010
не	
  добавяте	
  функционалност
                        подобрявете	
  код
                          малки	
  стъпки



S...
защо	
  пишем	
  тестове?




Sunday, April 25, 2010
Sunday, April 25, 2010
Sunday, April 25, 2010
Sunday, April 25, 2010
Sunday, April 25, 2010
накратко,	
  за	
  да	
  спестим
                          усилия	
  в	
  дългосрочен
                                    ...
automated    test-driven
                           testing   development




Sunday, April 25, 2010
Инструмент




                                      Автоматизирани
                                             тестове
S...
Подход




                                     Test-Driven
                                      Test-Driven
            ...
“Test-­‐Driven	
  Development	
  is	
  
                 not	
  about	
  testing”

                                       ...
дизайн




Sunday, April 25, 2010
TDD
                                    =
                         Test-­‐Driven	
  Design



Sunday, April 25, 2010
на	
  практика




Sunday, April 25, 2010
Sunday, April 25, 2010
1   Добавяте тест
                             ...за	
  несъществуващ	
  код




Sunday, April 25, 2010
1   Добавяте тест
                             ...за	
  несъществуващ	
  код




Sunday, April 25, 2010
1   Добавяте тест
                             ...за	
  несъществуващ	
  код




                                         ...
1   Добавяте тест
                             ...за	
  несъществуващ	
  код




                                         ...
1         Добавяте тест
                                       ...за	
  несъществуващ	
  код




                         ...
1         Добавяте тест
                                       ...за	
  несъществуващ	
  код




                         ...
1   Добавяте тест
                             ...за	
  несъществуващ	
  код




                         2   Пишете код
 ...
1   Добавяте тест
                             ...за	
  несъществуващ	
  код




                         2   Пишете код
 ...
1   Добавяте тест
                             ...за	
  несъществуващ	
  код


                             •   Тествате к...
1   Добавяте тест
                             ...за	
  несъществуващ	
  код


                             •   Тествате к...
1   Добавяте тест
                             ...за	
  несъществуващ	
  код


                             •   Тествате к...
1   Добавяте тест
                             ...за	
  несъществуващ	
  код


                             •   Тествате к...
1   Добавяте тест
                             ...за	
  несъществуващ	
  код




                         2   Пишете код
 ...
1   Добавяте тест
                             ...за	
  несъществуващ	
  код




                         2   Пишете код
 ...
1   Добавяте тест
                             ...за	
  несъществуващ	
  код




                         2   Пишете код
 ...
1   Добавяте тест
                             ...за	
  несъществуващ	
  код




                         2   Пишете код
 ...
1   Добавяте тест
                             ...за	
  несъществуващ	
  код




                         2   Пишете код
 ...
1   Добавяте тест
                             ...за	
  несъществуващ	
  код




                         2   Пишете код
 ...
1   Добавяте тест
                             ...за	
  несъществуващ	
  код




                         2   Пишете код
 ...
1   Добавяте тест
                             ...за	
  несъществуващ	
  код




                         2   Пишете код
 ...
1   Добавяте тест
                             ...за	
  несъществуващ	
  код




                         2   Пишете код
 ...
1   Добавяте тест
                             ...за	
  несъществуващ	
  код




                         2   Пишете код
 ...
TDD =   1   2   3




Sunday, April 25, 2010
Sunday, April 25, 2010
e r
                                     im
                                  la
                            s   c
       ...
describe "Message" do
         it "should support initialization" do
           message = Message.new('fry@foo.bg', 'bende...
describe "Message" do
         it "should support initialization" do
           message = Message.new('fry@foo.bg', 'bende...
class Message
          attr_reader :from, :to, :title

          def initialize(from, to, title)
            @from = from...
class Message
          attr_reader :from, :to, :title

          def initialize(from, to, title)
            @from = from...
class Message
          attr_reader :from, :to, :title

          def initialize(from, to, title)
            @from = from...
describe 'Message' do
          # ...

            it "should validate 'from'" do
              # bacon.should be_valid   ...
describe 'Message' do
          # ...

             it "should validate 'from'" do
               # bacon.should be_valid ...
class Message
          attr_reader :from, :to, :title

            def initialize(from, to, title)
              @from = ...
class Message
          attr_reader :from, :to, :title

            def initialize(from, to, title)
              @from = ...
class Message
          attr_reader :from, :to, :title

            def initialize(from, to, title)
              @from = ...
describe 'Message' do
          # ...

          it "should validate 'to'" do
            Message.new('fry@foo.bg', 'bende...
describe 'Message' do
          # ...

          it "should validate 'to'" do
            Message.new('fry@foo.bg', 'bende...
class Message
          attr_reader :from, :to, :title

            def initialize(from, to, title)
              @from = ...
class Message
          attr_reader :from, :to, :title

            def initialize(from, to, title)
              @from = ...
class Message
          attr_reader :from, :to, :title

            def initialize(from, to, title)
              @from = ...
class Message
          attr_reader :from, :to, :title

            def initialize(from, to, title)
              @from = ...
class Message
          attr_reader :from, :to, :title

            def initialize(from, to, title)
              @from = ...
class Message
          attr_reader :from, :to, :title

            def initialize(from, to, title)
              @from = ...
class Message
          attr_reader :from, :to, :title

            def initialize(from, to, title)
              @from = ...
class Message
          attr_reader :from, :to, :title

            def initialize(from, to, title)
              @from = ...
class Message
          attr_reader :from, :to, :title

            def initialize(from, to, title)
              @from = ...
Sunday, April 25, 2010
пример	
  за	
  интерфейса




Sunday, April 25, 2010
принуждава	
  ви	
  
                         да	
  измислите	
  дизайн




Sunday, April 25, 2010
дизайнът	
  е	
  основан	
  на
                          обратна	
  връзка,	
  а	
  не
                             на	
  ...
гарантира	
  ви	
  
                         че	
  имате	
  тест




Sunday, April 25, 2010
тестовете	
  се	
  забравят




Sunday, April 25, 2010
Sunday, April 25, 2010
false	
  positive




Sunday, April 25, 2010
гарантира,	
  че
                         кодът	
  е	
  тестваем




Sunday, April 25, 2010
sans	
  debugging




Sunday, April 25, 2010
Scope	
  creep




Sunday, April 25, 2010
Y.A.G.N.I.
                         Y! ain’t gonna need it




Sunday, April 25, 2010
Защо?

                     •обратна	
  връзка
                     •мързел
                     •тестваем	
  код
        ...
План

                     1. Какво	
  е	
  test-­‐driven?
                     2. Малка	
  демонстрация	
  (видео!)
     ...
EPIC FAIL


Sunday, April 25, 2010
План

                     1. Какво	
  е	
  test-­‐driven?
                     2. Малка	
  демонстрация	
  (видео!)
     ...
Терминологията	
  е	
  оплетена
Sunday, April 25, 2010
червено
                          жълто
                          зелено
                           синьо
                ...
Ритъм
Sunday, April 25, 2010
Дисциплина
Sunday, April 25, 2010
Sunday, April 25, 2010
тестовете	
  трябва	
  да	
  правят
                          приложението	
  по-­‐лесно	
  за
                           ...
л ем
                 об
               пр
           л ям тестовете	
  трябва	
  да	
  правят
         Го
               ...
тестовете	
  са	
  пример
                            как	
  се	
  работи	
  с	
  
                               кодът	
 ...
example-­‐driven	
  development




Sunday, April 25, 2010
assert	
  ➡	
  expectation
                         test	
  method	
  ➡	
  example
                         test	
  case	
...
Тестовете като документация
Sunday, April 25, 2010
“Test-­‐Driven	
  Development	
  is	
  
                 not	
  about	
  testing”

                                       ...
user	
  stories




Sunday, April 25, 2010
Cucumber
                  Feature: User accounts

                         Scenario: Changing your password
             ...
Cucumber
         Feature: User accounts

               ...

               Scenario: Confirmation fail on password chang...
behavior-­‐driven	
  development




Sunday, April 25, 2010
прилага	
  идеите	
  на	
  TDD
                          върху	
  feature-­‐ите*	
  на
                             прилож...
1




                                         red     2




                                         red     3




      ...
continuous	
  testing




Sunday, April 25, 2010
ресурси




Sunday, April 25, 2010
Sunday, April 25, 2010
Sunday, April 25, 2010
Sunday, April 25, 2010
Software	
  Craftsmanship	
  Bulgaria




Sunday, April 25, 2010
http://groups.google.com/group/software_craftsmanship




Sunday, April 25, 2010
just	
  google	
  it




Sunday, April 25, 2010
План

                     1. Какво	
  е	
  test-­‐driven?
                     2. Малка	
  демонстрация	
  (видео!)
     ...
Upcoming SlideShare
Loading in …5
×

Test-Driven Development + Refactoring

1,266 views

Published on

Презентацията от WebTech 2010

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,266
On SlideShare
0
From Embeds
0
Number of Embeds
26
Actions
Shares
0
Downloads
19
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Test-Driven Development + Refactoring

  1. 1. Test-Driven Development & Refactoring Стефан Кънев WebTech http://skanev.com/ 25 Април 2010 @skanev Велико Търново Sunday, April 25, 2010
  2. 2. за  мен Sunday, April 25, 2010
  3. 3. програмист Sunday, April 25, 2010
  4. 4. Sunday, April 25, 2010
  5. 5. Sunday, April 25, 2010
  6. 6. Sunday, April 25, 2010
  7. 7. първи  unit  test първи  работен  ден Sunday, April 25, 2010
  8. 8. презентационни  умения Sunday, April 25, 2010
  9. 9. 3 Sunday, April 25, 2010
  10. 10. говоря  бързо Sunday, April 25, 2010
  11. 11. 210 Sunday, April 25, 2010
  12. 12. Sunday, April 25, 2010
  13. 13. Аз ползвам Visual Source Safe Sunday, April 25, 2010
  14. 14. Аз ползвам Visual Source Safe Sunday, April 25, 2010
  15. 15. test-­‐driven  development refactoring Sunday, April 25, 2010
  16. 16. extreme  programming Sunday, April 25, 2010
  17. 17. test-­‐driven  development refactoring Sunday, April 25, 2010
  18. 18. УебТех,  миналата  година Sunday, April 25, 2010
  19. 19. Sunday, April 25, 2010
  20. 20. Sunday, April 25, 2010
  21. 21. Моя браузър е Гугъл, бабиното. Sunday, April 25, 2010
  22. 22. Правя Test-Driven Development. Sunday, April 25, 2010
  23. 23. Пиша тестове Правя Test-Driven Development. Sunday, April 25, 2010
  24. 24. конкретни  практики Sunday, April 25, 2010
  25. 25. План Sunday, April 25, 2010
  26. 26. План 1. Какво  е  test-­‐driven? Sunday, April 25, 2010
  27. 27. План 1. Какво  е  test-­‐driven? 2. Малка  демонстрация  (видео!) Sunday, April 25, 2010
  28. 28. План 1. Какво  е  test-­‐driven? 2. Малка  демонстрация  (видео!) 3. TDD  в  реалния  свят Sunday, April 25, 2010
  29. 29. План 1. Какво  е  test-­‐driven? 2. Малка  демонстрация  (видео!) 3. TDD  в  реалния  свят 4. Въпроси  &  дискусия Sunday, April 25, 2010
  30. 30. @skanev  Мога  да  прилагам  test-­‐driven development  извън  програмирането? Например  за  да  готвя  обяд?  #p2pvt Sunday, April 25, 2010
  31. 31. План 1. Какво  е  test-­‐driven? 2. Малка  демонстрация  (видео!) 3. TDD  в  реалния  свят 4. Въпроси  &  дискусия Sunday, April 25, 2010
  32. 32. refactor  |rēˈfaktər| verb improving  the  design  of  code without  changing  its  behavior Sunday, April 25, 2010
  33. 33. Sunday, April 25, 2010
  34. 34. не  добавяте  функционалност Sunday, April 25, 2010
  35. 35. не  добавяте  функционалност подобрявете  код Sunday, April 25, 2010
  36. 36. не  добавяте  функционалност подобрявете  код малки  стъпки Sunday, April 25, 2010
  37. 37. защо  пишем  тестове? Sunday, April 25, 2010
  38. 38. Sunday, April 25, 2010
  39. 39. Sunday, April 25, 2010
  40. 40. Sunday, April 25, 2010
  41. 41. Sunday, April 25, 2010
  42. 42. накратко,  за  да  спестим усилия  в  дългосрочен план Sunday, April 25, 2010
  43. 43. automated test-driven testing development Sunday, April 25, 2010
  44. 44. Инструмент Автоматизирани тестове Sunday, April 25, 2010
  45. 45. Подход Test-Driven Test-Driven Development Development Sunday, April 25, 2010
  46. 46. “Test-­‐Driven  Development  is   not  about  testing” —  Dan  North Sunday, April 25, 2010
  47. 47. дизайн Sunday, April 25, 2010
  48. 48. TDD = Test-­‐Driven  Design Sunday, April 25, 2010
  49. 49. на  практика Sunday, April 25, 2010
  50. 50. Sunday, April 25, 2010
  51. 51. 1 Добавяте тест ...за  несъществуващ  код Sunday, April 25, 2010
  52. 52. 1 Добавяте тест ...за  несъществуващ  код Sunday, April 25, 2010
  53. 53. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине Sunday, April 25, 2010
  54. 54. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине Sunday, April 25, 2010
  55. 55. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  56. 56. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  57. 57. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  58. 58. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  59. 59. 1 Добавяте тест ...за  несъществуващ  код • Тествате кода, който бихте искали да имате 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  60. 60. 1 Добавяте тест ...за  несъществуващ  код • Тествате кода, който бихте искали да имате • Няма да се компилира (липсващи методи/класове) 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  61. 61. 1 Добавяте тест ...за  несъществуващ  код • Тествате кода, който бихте искали да имате • Няма да се компилира (липсващи методи/класове) • Пускате го и гледате как се проваля 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  62. 62. 1 Добавяте тест ...за  несъществуващ  код • Тествате кода, който бихте искали да имате • Няма да се компилира (липсващи методи/класове) • Пускате го и гледате как се проваля • Имате червен тест проверяващ функционалността 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  63. 63. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  64. 64. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине • Добавяте достатъчно код за да мине теста 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  65. 65. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине • Добавяте достатъчно код за да мине теста • Нито ред повече 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  66. 66. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине • Добавяте достатъчно код за да мине теста • Нито ред повече • Най-простото решение, което ви хрумва 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  67. 67. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине • Добавяте достатъчно код за да мине теста • Нито ред повече • Най-простото решение, което ви хрумва • Имате работещ код и зелен тест, който го потвърждава 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  68. 68. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  69. 69. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията • Не добавяте функционалност Sunday, April 25, 2010
  70. 70. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията • Не добавяте функционалност • Подобрявате кода/дизайна Sunday, April 25, 2010
  71. 71. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията • Не добавяте функционалност • Подобрявате кода/дизайна • Премахвате повторенията Sunday, April 25, 2010
  72. 72. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията • Не добавяте функционалност • Подобрявате кода/дизайна • Премахвате повторенията • На всяка стъпка пускате теста Sunday, April 25, 2010
  73. 73. TDD = 1 2 3 Sunday, April 25, 2010
  74. 74. Sunday, April 25, 2010
  75. 75. e r im la s c D i Sunday, April 25, 2010
  76. 76. describe "Message" do it "should support initialization" do message = Message.new('fry@foo.bg', 'bender@foo.bg', 'Hi!') message.from.should == 'fry@foo.bg' message.to.should == 'bender@foo.bg' message.title.should == 'Hi!' end end 1 2 3 Кодът,  който  искате  да  имате Sunday, April 25, 2010
  77. 77. describe "Message" do it "should support initialization" do message = Message.new('fry@foo.bg', 'bender@foo.bg', 'Hi!') message.from.should == 'fry@foo.bg' message.to.should == 'bender@foo.bg' message.title.should == 'Hi!' end end F 1) NameError in 'Message should support initialization' uninitialized constant Message /work/message/spec/message_spec.rb:5: Finished in 0.009336 seconds 1 example, 1 failure 1 2 3 Кодът,  който  искате  да  имате Sunday, April 25, 2010
  78. 78. class Message attr_reader :from, :to, :title def initialize(from, to, title) @from = from @to = to @title = title end end 1 2 3 Най-­‐простата  имплементация Sunday, April 25, 2010
  79. 79. class Message attr_reader :from, :to, :title def initialize(from, to, title) @from = from @to = to @title = title end end . Finished in 0.009999 seconds 1 example, 0 failures 1 2 3 Най-­‐простата  имплементация Sunday, April 25, 2010
  80. 80. class Message attr_reader :from, :to, :title def initialize(from, to, title) @from = from @to = to @title = title end end Всичко  изглежда  ок,  няма  нужда  от  рефакториране 1 2 3 Пас Sunday, April 25, 2010
  81. 81. describe 'Message' do # ... it "should validate 'from'" do # bacon.should be_valid assert bacon.valid? Message.new('fry@foo.bg', 'bender@foo.bg', 'Hi!').should be_valid Message.new('foo.bg', 'bender@foo.bg', 'Hi!').should_not be_valid Message.new('fry@foo', 'bender@foo.bg', 'Hi!').should_not be_valid end end 1 2 3 Изразявате  новата  функционалност  в  тест Sunday, April 25, 2010
  82. 82. describe 'Message' do # ... it "should validate 'from'" do # bacon.should be_valid assert bacon.valid? Message.new('fry@foo.bg', 'bender@foo.bg', 'Hi!').should be_valid Message.new('foo.bg', 'bender@foo.bg', 'Hi!').should_not be_valid Message.new('fry@foo', 'bender@foo.bg', 'Hi!').should_not be_valid end end .F 1) NoMethodError in 'Message should validate 'from'' undefined method `valid?' for #<Message:0x100327e08> /work/message/spec/message_spec.rb:13: Finished in 0.010847 seconds 1 2 3 2 examples, 1 failure Изразявате  новата  функционалност  в  тест Sunday, April 25, 2010
  83. 83. class Message attr_reader :from, :to, :title def initialize(from, to, title) @from = from @to = to @title = title end def valid? @from =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ end end 1 2 3 Прост  регулярен  израз Sunday, April 25, 2010
  84. 84. class Message attr_reader :from, :to, :title def initialize(from, to, title) @from = from @to = to @title = title end def valid? @from =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ end end .. Finished in 0.011689 seconds 2 examples, 0 failures 1 2 3 Прост  регулярен  израз Sunday, April 25, 2010
  85. 85. class Message attr_reader :from, :to, :title def initialize(from, to, title) @from = from @to = to @title = title end def valid? @from =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ end end Все  още  всичко  е  ОК 1 2 3 Отново  пас Sunday, April 25, 2010
  86. 86. describe 'Message' do # ... it "should validate 'to'" do Message.new('fry@foo.bg', 'bender@foo.bg', 'Hi!').should be_valid Message.new('fry@foo.bg', 'bender', 'Hi!').should_not be_valid Message.new('fry@foo.bg', 'bender@foo', 'Hi!').should_not be_valid end end 1 2 3 Отново,  почвате  с  тест  преди  кода Sunday, April 25, 2010
  87. 87. describe 'Message' do # ... it "should validate 'to'" do Message.new('fry@foo.bg', 'bender@foo.bg', 'Hi!').should be_valid Message.new('fry@foo.bg', 'bender', 'Hi!').should_not be_valid Message.new('fry@foo.bg', 'bender@foo', 'Hi!').should_not be_valid end end ..F 1) 'Message should validate 'to'' FAILED expected valid? to return false, got 0 /work/message/spec/message_spec.rb:20: Finished in 0.009825 seconds 3 examples, 1 failure 1 2 3 Отново,  почвате  с  тест  преди  кода Sunday, April 25, 2010
  88. 88. class Message attr_reader :from, :to, :title def initialize(from, to, title) @from = from @to = to @title = title end def valid? @from =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ and @to =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ end end 1 2 3 Най-­‐простата  имплементация Sunday, April 25, 2010
  89. 89. class Message attr_reader :from, :to, :title def initialize(from, to, title) @from = from @to = to @title = title end def valid? @from =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ and @to =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ end end ... Finished in 0.010058 seconds 3 examples, 0 failures 1 2 3 Най-­‐простата  имплементация Sunday, April 25, 2010
  90. 90. class Message attr_reader :from, :to, :title def initialize(from, to, title) @from = from @to = to @title = title end def valid? @from =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ and @to =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ end end 1 2 3 Повторение Sunday, April 25, 2010
  91. 91. class Message attr_reader :from, :to, :title def initialize(from, to, title) @from = from @to = to @title = title end def valid? @from =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ and @to =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ end private def email_valid?(address) address =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ end end 1 2 3 Малки  стъпки Sunday, April 25, 2010
  92. 92. class Message attr_reader :from, :to, :title def initialize(from, to, title) @from = from @to = to @title = title end def valid? @from =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ and @to =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ end private def email_valid?(address) address =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ end end ... Finished in 0.010158 seconds 1 2 3 3 examples, 0 failures Малки  стъпки Sunday, April 25, 2010
  93. 93. class Message attr_reader :from, :to, :title def initialize(from, to, title) @from = from @to = to @title = title end def valid? email_valid?(@from) and @to =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ end private def email_valid?(address) address =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ end end 1 2 3 Ама  наистина  малки  стъпки Sunday, April 25, 2010
  94. 94. class Message attr_reader :from, :to, :title def initialize(from, to, title) @from = from @to = to @title = title end def valid? email_valid?(@from) and @to =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ end private def email_valid?(address) address =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ end end ... Finished in 0.010001 seconds 1 2 3 3 examples, 0 failures Ама  наистина  малки  стъпки Sunday, April 25, 2010
  95. 95. class Message attr_reader :from, :to, :title def initialize(from, to, title) @from = from @to = to @title = title end def valid? email_valid?(@from) and email_valid?(@to) end private def email_valid?(address) address =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ end end 1 2 3 Готово Sunday, April 25, 2010
  96. 96. class Message attr_reader :from, :to, :title def initialize(from, to, title) @from = from @to = to @title = title end def valid? email_valid?(@from) and email_valid?(@to) end private def email_valid?(address) address =~ /^[a-z]+@[a-z]+(.[a-z]+)+$/ end end ... Finished in 0.009903 seconds 1 2 3 3 examples, 0 failures Готово Sunday, April 25, 2010
  97. 97. Sunday, April 25, 2010
  98. 98. пример  за  интерфейса Sunday, April 25, 2010
  99. 99. принуждава  ви   да  измислите  дизайн Sunday, April 25, 2010
  100. 100. дизайнът  е  основан  на обратна  връзка,  а  не на  спекулация Sunday, April 25, 2010
  101. 101. гарантира  ви   че  имате  тест Sunday, April 25, 2010
  102. 102. тестовете  се  забравят Sunday, April 25, 2010
  103. 103. Sunday, April 25, 2010
  104. 104. false  positive Sunday, April 25, 2010
  105. 105. гарантира,  че кодът  е  тестваем Sunday, April 25, 2010
  106. 106. sans  debugging Sunday, April 25, 2010
  107. 107. Scope  creep Sunday, April 25, 2010
  108. 108. Y.A.G.N.I. Y! ain’t gonna need it Sunday, April 25, 2010
  109. 109. Защо? •обратна  връзка •мързел •тестваем  код •debugging •scope  creep Sunday, April 25, 2010
  110. 110. План 1. Какво  е  test-­‐driven? 2. Малка  демонстрация  (видео!) 3. TDD  в  реалния  свят 4. Въпроси  &  дискусия Sunday, April 25, 2010
  111. 111. EPIC FAIL Sunday, April 25, 2010
  112. 112. План 1. Какво  е  test-­‐driven? 2. Малка  демонстрация  (видео!) 3. TDD  в  реалния  свят 4. Въпроси  &  дискусия Sunday, April 25, 2010
  113. 113. Терминологията  е  оплетена Sunday, April 25, 2010
  114. 114. червено жълто зелено синьо червено синьо жълто зелено синьо Sunday, April 25, 2010
  115. 115. Ритъм Sunday, April 25, 2010
  116. 116. Дисциплина Sunday, April 25, 2010
  117. 117. Sunday, April 25, 2010
  118. 118. тестовете  трябва  да  правят приложението  по-­‐лесно  за поддръжка лошото  прилагане  на тестове  може  да  го  направи по-­‐трудно  за  поддържане Sunday, April 25, 2010
  119. 119. л ем об пр л ям тестовете  трябва  да  правят Го приложението  по-­‐лесно  за поддръжка лошото  прилагане  на тестове  може  да  го  направи по-­‐трудно  за  поддържане Sunday, April 25, 2010
  120. 120. тестовете  са  пример как  се  работи  с   кодът  ви Sunday, April 25, 2010
  121. 121. example-­‐driven  development Sunday, April 25, 2010
  122. 122. assert  ➡  expectation test  method  ➡  example test  case  ➡  example  group Sunday, April 25, 2010
  123. 123. Тестовете като документация Sunday, April 25, 2010
  124. 124. “Test-­‐Driven  Development  is   not  about  testing” —  Dan  North Sunday, April 25, 2010
  125. 125. user  stories Sunday, April 25, 2010
  126. 126. Cucumber Feature: User accounts Scenario: Changing your password Given my password is "zero cool" And I just logged in When I go to the settings page And I fill in "Password" with "secret" And I fill in "Password confirmation" with "secret" And I press "Save password" Then my password should be "secret" Sunday, April 25, 2010
  127. 127. Cucumber Feature: User accounts ... Scenario: Confirmation fail on password change Given my password is "zero cool" And I just logged in When I go to the settings page And I fill in "Password" with "secret" But I fill in "Password confirmation" with "tetris" And I press "Save password" Then I should see "Password and confirmation didn't match" And my password should be "zero cool" Sunday, April 25, 2010
  128. 128. behavior-­‐driven  development Sunday, April 25, 2010
  129. 129. прилага  идеите  на  TDD върху  feature-­‐ите*  на приложението *  чуждиците  не  са  куул Sunday, April 25, 2010
  130. 130. 1 red 2 red 3 5 RSpec 4 refactor green 7 6 refactor green Cucumber Sunday, April 25, 2010
  131. 131. continuous  testing Sunday, April 25, 2010
  132. 132. ресурси Sunday, April 25, 2010
  133. 133. Sunday, April 25, 2010
  134. 134. Sunday, April 25, 2010
  135. 135. Sunday, April 25, 2010
  136. 136. Software  Craftsmanship  Bulgaria Sunday, April 25, 2010
  137. 137. http://groups.google.com/group/software_craftsmanship Sunday, April 25, 2010
  138. 138. just  google  it Sunday, April 25, 2010
  139. 139. План 1. Какво  е  test-­‐driven? 2. Малка  демонстрация  (видео!) 3. TDD  в  реалния  свят 4. Въпроси  &  дискусия Sunday, April 25, 2010

×