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
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
118. тестовете
трябва
да
правят
приложението
по-‐лесно
за
поддръжка
лошото
прилагане
на
тестове
може
да
го
направи
по-‐трудно
за
поддържане
Sunday, April 25, 2010
119. л ем
об
пр
л ям тестовете
трябва
да
правят
Го
приложението
по-‐лесно
за
поддръжка
лошото
прилагане
на
тестове
може
да
го
направи
по-‐трудно
за
поддържане
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