SlideShare una empresa de Scribd logo
1 de 139
Descargar para leer sin conexión
Test-Driven Development
                                   &
                               Refactoring


        Стефан Кънев                               WebTech
        http://skanev.com/                    25 Април 2010
        @skanev                              Велико Търново

Sunday, April 25, 2010
за	
  мен




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, 2010
конкретни	
  практики




Sunday, April 25, 2010
План




Sunday, April 25, 2010
План

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




Sunday, April 25, 2010
План

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




Sunday, April 25, 2010
План

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




Sunday, April 25, 2010
План

                     1. Какво	
  е	
  test-­‐driven?
                     2. Малка	
  демонстрация	
  (видео!)
                     3. TDD	
  в	
  реалния	
  свят
                     4. Въпроси	
  &	
  дискусия




Sunday, April 25, 2010
@skanev	
  Мога	
  да	
  прилагам	
  test-­‐driven
                         development	
  извън	
  програмирането?
                         Например	
  за	
  да	
  готвя	
  обяд?	
  #p2pvt




Sunday, April 25, 2010
План

                     1. Какво	
  е	
  test-­‐driven?
                     2. Малка	
  демонстрация	
  (видео!)
                     3. TDD	
  в	
  реалния	
  свят
                     4. Въпроси	
  &	
  дискусия




Sunday, April 25, 2010
refactor	
  |rēˈfaktər|
                         verb

                         improving	
  the	
  design	
  of	
  code
                         without	
  changing	
  its	
  behavior




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




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




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



Sunday, April 25, 2010
защо	
  пишем	
  тестове?




Sunday, April 25, 2010
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
Инструмент




                                      Автоматизирани
                                             тестове
Sunday, April 25, 2010
Подход




                                     Test-Driven
                                      Test-Driven
                                  Development
                                    Development
Sunday, April 25, 2010
“Test-­‐Driven	
  Development	
  is	
  
                 not	
  about	
  testing”

                                       —	
  Dan	
  North




Sunday, April 25, 2010
дизайн




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   Добавяте тест
                             ...за	
  несъществуващ	
  код




                                                       2     Пишете код
                                                             ...колкото	
  тестът	
  да	
  мине




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




                                                       2     Пишете код
                                                             ...колкото	
  тестът	
  да	
  мине




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




                                                                 2     Пишете код
                                                                       ...колкото	
  тестът	
  да	
  мине




                         3   Правите подобрения
                             ...докато	
  премахнете	
  повторенията




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




                                                                 2     Пишете код
                                                                       ...колкото	
  тестът	
  да	
  мине




                         3   Правите подобрения
                             ...докато	
  премахнете	
  повторенията




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




                         2   Пишете код
                             ...колкото	
  тестът	
  да	
  мине




                         3   Правите подобрения
                             ...докато	
  премахнете	
  повторенията




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




                         2   Пишете код
                             ...колкото	
  тестът	
  да	
  мине




                         3   Правите подобрения
                             ...докато	
  премахнете	
  повторенията



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


                             •   Тествате кода, който бихте искали да имате




                         2   Пишете код
                             ...колкото	
  тестът	
  да	
  мине




                         3   Правите подобрения
                             ...докато	
  премахнете	
  повторенията



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


                             •   Тествате кода, който бихте искали да имате
                             •   Няма да се компилира (липсващи методи/класове)




                         2   Пишете код
                             ...колкото	
  тестът	
  да	
  мине




                         3   Правите подобрения
                             ...докато	
  премахнете	
  повторенията



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


                             •   Тествате кода, който бихте искали да имате
                             •   Няма да се компилира (липсващи методи/класове)
                             •   Пускате го и гледате как се проваля




                         2   Пишете код
                             ...колкото	
  тестът	
  да	
  мине




                         3   Правите подобрения
                             ...докато	
  премахнете	
  повторенията



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


                             •   Тествате кода, който бихте искали да имате
                             •   Няма да се компилира (липсващи методи/класове)
                             •   Пускате го и гледате как се проваля
                             •   Имате червен тест проверяващ функционалността



                         2   Пишете код
                             ...колкото	
  тестът	
  да	
  мине




                         3   Правите подобрения
                             ...докато	
  премахнете	
  повторенията



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




                         2   Пишете код
                             ...колкото	
  тестът	
  да	
  мине




                         3   Правите подобрения
                             ...докато	
  премахнете	
  повторенията



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




                         2   Пишете код
                             ...колкото	
  тестът	
  да	
  мине


                             •   Добавяте достатъчно код за да мине теста




                         3   Правите подобрения
                             ...докато	
  премахнете	
  повторенията



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




                         2   Пишете код
                             ...колкото	
  тестът	
  да	
  мине


                             •   Добавяте достатъчно код за да мине теста
                             •   Нито ред повече




                         3   Правите подобрения
                             ...докато	
  премахнете	
  повторенията



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




                         2   Пишете код
                             ...колкото	
  тестът	
  да	
  мине


                             •   Добавяте достатъчно код за да мине теста
                             •   Нито ред повече
                             •   Най-простото решение, което ви хрумва




                         3   Правите подобрения
                             ...докато	
  премахнете	
  повторенията



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




                         2   Пишете код
                             ...колкото	
  тестът	
  да	
  мине


                             •   Добавяте достатъчно код за да мине теста
                             •   Нито ред повече
                             •   Най-простото решение, което ви хрумва
                             •   Имате работещ код и зелен тест, който го потвърждава



                         3   Правите подобрения
                             ...докато	
  премахнете	
  повторенията



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




                         2   Пишете код
                             ...колкото	
  тестът	
  да	
  мине




                         3   Правите подобрения
                             ...докато	
  премахнете	
  повторенията




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




                         2   Пишете код
                             ...колкото	
  тестът	
  да	
  мине




                         3   Правите подобрения
                             ...докато	
  премахнете	
  повторенията


                             •   Не добавяте функционалност




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




                         2   Пишете код
                             ...колкото	
  тестът	
  да	
  мине




                         3   Правите подобрения
                             ...докато	
  премахнете	
  повторенията


                             •   Не добавяте функционалност
                             •   Подобрявате кода/дизайна




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




                         2   Пишете код
                             ...колкото	
  тестът	
  да	
  мине




                         3   Правите подобрения
                             ...докато	
  премахнете	
  повторенията


                             •   Не добавяте функционалност
                             •   Подобрявате кода/дизайна
                             •   Премахвате повторенията




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




                         2   Пишете код
                             ...колкото	
  тестът	
  да	
  мине




                         3   Правите подобрения
                             ...докато	
  премахнете	
  повторенията


                             •   Не добавяте функционалност
                             •   Подобрявате кода/дизайна
                             •   Премахвате повторенията
                             •   На всяка стъпка пускате теста


Sunday, April 25, 2010
TDD =   1   2   3




Sunday, April 25, 2010
Sunday, April 25, 2010
e r
                                     im
                                  la
                            s   c
                         D i

Sunday, April 25, 2010
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Sunday, April 25, 2010
пример	
  за	
  интерфейса




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
Защо?

                     •обратна	
  връзка
                     •мързел
                     •тестваем	
  код
                     •debugging
                     •scope	
  creep

Sunday, April 25, 2010
План

                     1. Какво	
  е	
  test-­‐driven?
                     2. Малка	
  демонстрация	
  (видео!)
                     3. TDD	
  в	
  реалния	
  свят
                     4. Въпроси	
  &	
  дискусия




Sunday, April 25, 2010
EPIC FAIL


Sunday, April 25, 2010
План

                     1. Какво	
  е	
  test-­‐driven?
                     2. Малка	
  демонстрация	
  (видео!)
                     3. TDD	
  в	
  реалния	
  свят
                     4. Въпроси	
  &	
  дискусия




Sunday, April 25, 2010
Терминологията	
  е	
  оплетена
Sunday, April 25, 2010
червено
                          жълто
                          зелено
                           синьо
                         червено
                           синьо
                          жълто
                          зелено
                           синьо
Sunday, April 25, 2010
Ритъм
Sunday, April 25, 2010
Дисциплина
Sunday, April 25, 2010
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	
  ➡	
  example	
  group



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

                                       —	
  Dan	
  North




Sunday, April 25, 2010
user	
  stories




Sunday, April 25, 2010
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
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
behavior-­‐driven	
  development




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


                                          *	
  чуждиците	
  не	
  са	
  куул
Sunday, April 25, 2010
1




                                         red     2




                                         red     3




                                5
                                         RSpec         4

                              refactor               green
                          7
                                                             6

                         refactor                          green
                                     Cucumber

Sunday, April 25, 2010
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. Малка	
  демонстрация	
  (видео!)
                     3. TDD	
  в	
  реалния	
  свят
                     4. Въпроси	
  &	
  дискусия




Sunday, April 25, 2010

Más contenido relacionado

Destacado

Esperienze sulle Aree Metropolitane : Il Caso Venezia
Esperienze sulle Aree Metropolitane : Il Caso VeneziaEsperienze sulle Aree Metropolitane : Il Caso Venezia
Esperienze sulle Aree Metropolitane : Il Caso Veneziametronapoliwebtv
 
21st century learning1
21st century learning121st century learning1
21st century learning1johnfinch
 
3-1 Labeling Angles
3-1 Labeling Angles 3-1 Labeling Angles
3-1 Labeling Angles gwilson8786
 
Real estate basic start up need to know details
Real estate   basic start up need to know detailsReal estate   basic start up need to know details
Real estate basic start up need to know detailsRE/MAX Andhra Pradesh
 
Cmmaao stakeholder-analysis-pmi-pmp
Cmmaao stakeholder-analysis-pmi-pmpCmmaao stakeholder-analysis-pmi-pmp
Cmmaao stakeholder-analysis-pmi-pmpvishvasyadav45
 
Design blueprint v1b cmmaao pmi pmp
Design blueprint v1b cmmaao pmi pmpDesign blueprint v1b cmmaao pmi pmp
Design blueprint v1b cmmaao pmi pmpvishvasyadav45
 
9 7 perimeters and similarity
9 7 perimeters and similarity9 7 perimeters and similarity
9 7 perimeters and similaritygwilson8786
 
12 5 volumes of pyramids and cones
12 5 volumes of pyramids and cones12 5 volumes of pyramids and cones
12 5 volumes of pyramids and conesgwilson8786
 

Destacado (12)

Invito luce letturaurbana
Invito luce letturaurbanaInvito luce letturaurbana
Invito luce letturaurbana
 
Esperienze sulle Aree Metropolitane : Il Caso Venezia
Esperienze sulle Aree Metropolitane : Il Caso VeneziaEsperienze sulle Aree Metropolitane : Il Caso Venezia
Esperienze sulle Aree Metropolitane : Il Caso Venezia
 
21st century learning1
21st century learning121st century learning1
21st century learning1
 
3-1 Labeling Angles
3-1 Labeling Angles 3-1 Labeling Angles
3-1 Labeling Angles
 
Real estate basic start up need to know details
Real estate   basic start up need to know detailsReal estate   basic start up need to know details
Real estate basic start up need to know details
 
Cmmaao stakeholder-analysis-pmi-pmp
Cmmaao stakeholder-analysis-pmi-pmpCmmaao stakeholder-analysis-pmi-pmp
Cmmaao stakeholder-analysis-pmi-pmp
 
Cmmaao data-pmi -pmp
Cmmaao data-pmi -pmpCmmaao data-pmi -pmp
Cmmaao data-pmi -pmp
 
Design blueprint v1b cmmaao pmi pmp
Design blueprint v1b cmmaao pmi pmpDesign blueprint v1b cmmaao pmi pmp
Design blueprint v1b cmmaao pmi pmp
 
9 7 perimeters and similarity
9 7 perimeters and similarity9 7 perimeters and similarity
9 7 perimeters and similarity
 
Sap 2
Sap 2Sap 2
Sap 2
 
12 5 volumes of pyramids and cones
12 5 volumes of pyramids and cones12 5 volumes of pyramids and cones
12 5 volumes of pyramids and cones
 
Blog angles
Blog anglesBlog angles
Blog angles
 

Más de Stefan Kanev

Как блогът ми ме направи по-добър професионалист
Как блогът ми ме направи по-добър професионалистКак блогът ми ме направи по-добър професионалист
Как блогът ми ме направи по-добър професионалистStefan Kanev
 
Щастливият програмист 2.0
Щастливият програмист 2.0Щастливият програмист 2.0
Щастливият програмист 2.0Stefan Kanev
 
Пак ли този Rails?
Пак ли този Rails?Пак ли този Rails?
Пак ли този Rails?Stefan Kanev
 
The Happy Programmer
The Happy ProgrammerThe Happy Programmer
The Happy ProgrammerStefan Kanev
 
ФМИ Python: Agile & Friends
ФМИ Python: Agile & FriendsФМИ Python: Agile & Friends
ФМИ Python: Agile & FriendsStefan Kanev
 
Behavior-Driven Development с RSpec и Cucumber
Behavior-Driven Development с RSpec и CucumberBehavior-Driven Development с RSpec и Cucumber
Behavior-Driven Development с RSpec и CucumberStefan Kanev
 
Защо Ruby on Rails
Защо Ruby on RailsЗащо Ruby on Rails
Защо Ruby on RailsStefan Kanev
 
5. HTTP и приятели
5. HTTP и приятели5. HTTP и приятели
5. HTTP и приятелиStefan Kanev
 
4. Метапрограмиране
4. Метапрограмиране4. Метапрограмиране
4. МетапрограмиранеStefan Kanev
 
3. Обекти и класове
3. Обекти и класове3. Обекти и класове
3. Обекти и класовеStefan Kanev
 
2. Функционални Закачки
2. Функционални Закачки2. Функционални Закачки
2. Функционални ЗакачкиStefan Kanev
 
1. Въведение в Ruby
1. Въведение в Ruby1. Въведение в Ruby
1. Въведение в RubyStefan Kanev
 
0. За курса, Ruby и Rails
0. За курса, Ruby и Rails0. За курса, Ruby и Rails
0. За курса, Ruby и RailsStefan Kanev
 

Más de Stefan Kanev (18)

Ruby 0 2012
Ruby 0 2012Ruby 0 2012
Ruby 0 2012
 
Ruby 0
Ruby 0Ruby 0
Ruby 0
 
Debugging Habits
Debugging HabitsDebugging Habits
Debugging Habits
 
Защо MongoDB?
Защо MongoDB?Защо MongoDB?
Защо MongoDB?
 
Как блогът ми ме направи по-добър професионалист
Как блогът ми ме направи по-добър професионалистКак блогът ми ме направи по-добър професионалист
Как блогът ми ме направи по-добър професионалист
 
Щастливият програмист 2.0
Щастливият програмист 2.0Щастливият програмист 2.0
Щастливият програмист 2.0
 
Пак ли този Rails?
Пак ли този Rails?Пак ли този Rails?
Пак ли този Rails?
 
The Happy Programmer
The Happy ProgrammerThe Happy Programmer
The Happy Programmer
 
ФМИ Python: Agile & Friends
ФМИ Python: Agile & FriendsФМИ Python: Agile & Friends
ФМИ Python: Agile & Friends
 
Behavior-Driven Development с RSpec и Cucumber
Behavior-Driven Development с RSpec и CucumberBehavior-Driven Development с RSpec и Cucumber
Behavior-Driven Development с RSpec и Cucumber
 
за Ruby
за Rubyза Ruby
за Ruby
 
Защо Ruby on Rails
Защо Ruby on RailsЗащо Ruby on Rails
Защо Ruby on Rails
 
5. HTTP и приятели
5. HTTP и приятели5. HTTP и приятели
5. HTTP и приятели
 
4. Метапрограмиране
4. Метапрограмиране4. Метапрограмиране
4. Метапрограмиране
 
3. Обекти и класове
3. Обекти и класове3. Обекти и класове
3. Обекти и класове
 
2. Функционални Закачки
2. Функционални Закачки2. Функционални Закачки
2. Функционални Закачки
 
1. Въведение в Ruby
1. Въведение в Ruby1. Въведение в Ruby
1. Въведение в Ruby
 
0. За курса, Ruby и Rails
0. За курса, Ruby и Rails0. За курса, Ruby и Rails
0. За курса, Ruby и Rails
 

Test-Driven Development + Refactoring

  • 1. Test-Driven Development & Refactoring Стефан Кънев WebTech http://skanev.com/ 25 Април 2010 @skanev Велико Търново Sunday, April 25, 2010
  • 7. първи  unit  test първи  работен  ден Sunday, April 25, 2010
  • 13. Аз ползвам Visual Source Safe Sunday, April 25, 2010
  • 14. Аз ползвам Visual Source Safe Sunday, April 25, 2010
  • 15. test-­‐driven  development refactoring Sunday, April 25, 2010
  • 17. test-­‐driven  development refactoring Sunday, April 25, 2010
  • 21. Моя браузър е Гугъл, бабиното. Sunday, April 25, 2010
  • 22. Правя Test-Driven Development. Sunday, April 25, 2010
  • 23. Пиша тестове Правя Test-Driven Development. Sunday, April 25, 2010
  • 26. План 1. Какво  е  test-­‐driven? Sunday, April 25, 2010
  • 27. План 1. Какво  е  test-­‐driven? 2. Малка  демонстрация  (видео!) Sunday, April 25, 2010
  • 28. План 1. Какво  е  test-­‐driven? 2. Малка  демонстрация  (видео!) 3. TDD  в  реалния  свят Sunday, April 25, 2010
  • 29. План 1. Какво  е  test-­‐driven? 2. Малка  демонстрация  (видео!) 3. TDD  в  реалния  свят 4. Въпроси  &  дискусия Sunday, April 25, 2010
  • 30. @skanev  Мога  да  прилагам  test-­‐driven development  извън  програмирането? Например  за  да  готвя  обяд?  #p2pvt Sunday, April 25, 2010
  • 31. План 1. Какво  е  test-­‐driven? 2. Малка  демонстрация  (видео!) 3. TDD  в  реалния  свят 4. Въпроси  &  дискусия Sunday, April 25, 2010
  • 32. refactor  |rēˈfaktər| verb improving  the  design  of  code without  changing  its  behavior Sunday, April 25, 2010
  • 35. не  добавяте  функционалност подобрявете  код Sunday, April 25, 2010
  • 36. не  добавяте  функционалност подобрявете  код малки  стъпки Sunday, April 25, 2010
  • 42. накратко,  за  да  спестим усилия  в  дългосрочен план Sunday, April 25, 2010
  • 43. automated test-driven testing development Sunday, April 25, 2010
  • 44. Инструмент Автоматизирани тестове Sunday, April 25, 2010
  • 45. Подход Test-Driven Test-Driven Development Development Sunday, April 25, 2010
  • 46. “Test-­‐Driven  Development  is   not  about  testing” —  Dan  North Sunday, April 25, 2010
  • 48. TDD = Test-­‐Driven  Design Sunday, April 25, 2010
  • 51. 1 Добавяте тест ...за  несъществуващ  код Sunday, April 25, 2010
  • 52. 1 Добавяте тест ...за  несъществуващ  код Sunday, April 25, 2010
  • 53. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине Sunday, April 25, 2010
  • 54. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине Sunday, April 25, 2010
  • 55. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  • 56. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  • 57. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  • 58. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  • 59. 1 Добавяте тест ...за  несъществуващ  код • Тествате кода, който бихте искали да имате 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  • 60. 1 Добавяте тест ...за  несъществуващ  код • Тествате кода, който бихте искали да имате • Няма да се компилира (липсващи методи/класове) 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  • 61. 1 Добавяте тест ...за  несъществуващ  код • Тествате кода, който бихте искали да имате • Няма да се компилира (липсващи методи/класове) • Пускате го и гледате как се проваля 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  • 62. 1 Добавяте тест ...за  несъществуващ  код • Тествате кода, който бихте искали да имате • Няма да се компилира (липсващи методи/класове) • Пускате го и гледате как се проваля • Имате червен тест проверяващ функционалността 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  • 63. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  • 64. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине • Добавяте достатъчно код за да мине теста 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  • 65. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине • Добавяте достатъчно код за да мине теста • Нито ред повече 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  • 66. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине • Добавяте достатъчно код за да мине теста • Нито ред повече • Най-простото решение, което ви хрумва 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  • 67. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине • Добавяте достатъчно код за да мине теста • Нито ред повече • Най-простото решение, което ви хрумва • Имате работещ код и зелен тест, който го потвърждава 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  • 68. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията Sunday, April 25, 2010
  • 69. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията • Не добавяте функционалност Sunday, April 25, 2010
  • 70. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията • Не добавяте функционалност • Подобрявате кода/дизайна Sunday, April 25, 2010
  • 71. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията • Не добавяте функционалност • Подобрявате кода/дизайна • Премахвате повторенията Sunday, April 25, 2010
  • 72. 1 Добавяте тест ...за  несъществуващ  код 2 Пишете код ...колкото  тестът  да  мине 3 Правите подобрения ...докато  премахнете  повторенията • Не добавяте функционалност • Подобрявате кода/дизайна • Премахвате повторенията • На всяка стъпка пускате теста Sunday, April 25, 2010
  • 73. TDD = 1 2 3 Sunday, April 25, 2010
  • 75. e r im la s c D i Sunday, April 25, 2010
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
  • 99. принуждава  ви   да  измислите  дизайн Sunday, April 25, 2010
  • 100. дизайнът  е  основан  на обратна  връзка,  а  не на  спекулация Sunday, April 25, 2010
  • 101. гарантира  ви   че  имате  тест Sunday, April 25, 2010
  • 105. гарантира,  че кодът  е  тестваем Sunday, April 25, 2010
  • 108. Y.A.G.N.I. Y! ain’t gonna need it Sunday, April 25, 2010
  • 109. Защо? •обратна  връзка •мързел •тестваем  код •debugging •scope  creep Sunday, April 25, 2010
  • 110. План 1. Какво  е  test-­‐driven? 2. Малка  демонстрация  (видео!) 3. TDD  в  реалния  свят 4. Въпроси  &  дискусия Sunday, April 25, 2010
  • 112. План 1. Какво  е  test-­‐driven? 2. Малка  демонстрация  (видео!) 3. TDD  в  реалния  свят 4. Въпроси  &  дискусия Sunday, April 25, 2010
  • 114. червено жълто зелено синьо червено синьо жълто зелено синьо Sunday, April 25, 2010
  • 118. тестовете  трябва  да  правят приложението  по-­‐лесно  за поддръжка лошото  прилагане  на тестове  може  да  го  направи по-­‐трудно  за  поддържане Sunday, April 25, 2010
  • 119. л ем об пр л ям тестовете  трябва  да  правят Го приложението  по-­‐лесно  за поддръжка лошото  прилагане  на тестове  може  да  го  направи по-­‐трудно  за  поддържане Sunday, April 25, 2010
  • 120. тестовете  са  пример как  се  работи  с   кодът  ви Sunday, April 25, 2010
  • 122. assert  ➡  expectation test  method  ➡  example test  case  ➡  example  group Sunday, April 25, 2010
  • 124. “Test-­‐Driven  Development  is   not  about  testing” —  Dan  North Sunday, April 25, 2010
  • 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. 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
  • 129. прилага  идеите  на  TDD върху  feature-­‐ите*  на приложението *  чуждиците  не  са  куул Sunday, April 25, 2010
  • 130. 1 red 2 red 3 5 RSpec 4 refactor green 7 6 refactor green Cucumber Sunday, April 25, 2010
  • 138. just  google  it Sunday, April 25, 2010
  • 139. План 1. Какво  е  test-­‐driven? 2. Малка  демонстрация  (видео!) 3. TDD  в  реалния  свят 4. Въпроси  &  дискусия Sunday, April 25, 2010