Behavior-Driven Development с RSpec и Cucumber

92
Behavior-Driven Development с RSpec и Cucumber Стефан Кънев http://skanev.com / 27.06.2009, TechCamp.eu Tuesday, April 27, 2010

Transcript of Behavior-Driven Development с RSpec и Cucumber

Page 1: Behavior-Driven Development с RSpec и Cucumber

Behavior-Driven Developmentс RSpec и CucumberСтефан Кънев

http://skanev.com/

27.06.2009, TechCamp.eu

Tuesday, April 27, 2010

Page 2: Behavior-Driven Development с RSpec и Cucumber

Автоматизирано тестване

Tuesday, April 27, 2010

Page 3: Behavior-Driven Development с RSpec и Cucumber

Unit Tests

Test-Driven Development

Behavior-Driven Development

Tuesday, April 27, 2010

Page 4: Behavior-Driven Development с RSpec и Cucumber

1. Unit test-ове

2. Test-Driven

3. Behavior-Driven

4. RSpec

5. Cucumber

Tuesday, April 27, 2010

Page 5: Behavior-Driven Development с RSpec и Cucumber

1. Unit test-ове

2. Test-Driven

3. Behavior-Driven

4. RSpec

5. Cucumber

Tuesday, April 27, 2010

Page 6: Behavior-Driven Development с RSpec и Cucumber

class Programmer def implement_a_change(project, change) files = self.open_related_files(project, change) while true self.attempt_change(change, files) project.run() result = self.click_around_and_test(project) project.stop() break if result.successful? end self.commit_code(files) self.hope_everything_went_ok() endend

Tuesday, April 27, 2010

Page 7: Behavior-Driven Development с RSpec и Cucumber

Repetitive...

Tuesday, April 27, 2010

Page 8: Behavior-Driven Development с RSpec и Cucumber

...boring...

Tuesday, April 27, 2010

Page 9: Behavior-Driven Development с RSpec и Cucumber

...error-prone

Tuesday, April 27, 2010

Page 10: Behavior-Driven Development с RSpec и Cucumber

Машина, която да го прави вместо нас

Tuesday, April 27, 2010

Page 11: Behavior-Driven Development с RSpec и Cucumber

Програма, която да го прави вместо нас

Tuesday, April 27, 2010

Page 12: Behavior-Driven Development с RSpec и Cucumber

Unit Test

Tuesday, April 27, 2010

Page 13: Behavior-Driven Development с RSpec и Cucumber

Пишем код, който проверява дали друг код

работи правилно.

Tuesday, April 27, 2010

Page 14: Behavior-Driven Development с RSpec и Cucumber

С един бутон

Да Не

Tuesday, April 27, 2010

Page 15: Behavior-Driven Development с RSpec и Cucumber

caladan:trane aquarius$ rake spec(in /work/trane)...............................................................................................................................................................................................................

Finished in 8.334414 seconds

207 examples, 0 failures

Tuesday, April 27, 2010

Page 16: Behavior-Driven Development с RSpec и Cucumber

caladan:trane aquarius$ rake spec(in /work/trane).....................................................................................................................................................................................................F.........

1)'User should know something' FAILEDexpected: "something", got: "nothing" (using ==)./spec/models/user_spec.rb:32:

Finished in 8.123368 seconds

207 examples, 1 failure

Tuesday, April 27, 2010

Page 17: Behavior-Driven Development с RSpec и Cucumber

I can has value?

Tuesday, April 27, 2010

Page 18: Behavior-Driven Development с RSpec и Cucumber

Време

Tuesday, April 27, 2010

Page 19: Behavior-Driven Development с RSpec и Cucumber

Regression testing

Tuesday, April 27, 2010

Page 20: Behavior-Driven Development с RSpec и Cucumber

Tuesday, April 27, 2010

Page 21: Behavior-Driven Development с RSpec и Cucumber

Tuesday, April 27, 2010

Page 22: Behavior-Driven Development с RSpec и Cucumber

Tuesday, April 27, 2010

Page 23: Behavior-Driven Development с RSpec и Cucumber

Tuesday, April 27, 2010

Page 24: Behavior-Driven Development с RSpec и Cucumber

Документация(развален английски + стари версии = fun)

Tuesday, April 27, 2010

Page 25: Behavior-Driven Development с RSpec и Cucumber

Спецификация

Tuesday, April 27, 2010

Page 26: Behavior-Driven Development с RSpec и Cucumber

Tuesday, April 27, 2010

Page 27: Behavior-Driven Development с RSpec и Cucumber

1. Unit test-ове

2. Test-Driven

3. Behavior-Driven

4. RSpec

5. Cucumber

Tuesday, April 27, 2010

Page 28: Behavior-Driven Development с RSpec и Cucumber

Unit test-овете са просто инструмент

Tuesday, April 27, 2010

Page 29: Behavior-Driven Development с RSpec и Cucumber

Test-Driven Development е подход към писането на софтуер

Tuesday, April 27, 2010

Page 30: Behavior-Driven Development с RSpec и Cucumber

test-first

Tuesday, April 27, 2010

Page 31: Behavior-Driven Development с RSpec и Cucumber

red/green/refactor

Tuesday, April 27, 2010

Page 32: Behavior-Driven Development с RSpec и Cucumber

red/green/refactor

Възможно най-простия тест, който проверява функцио-налността и не минава.

Tuesday, April 27, 2010

Page 33: Behavior-Driven Development с RSpec и Cucumber

red/green/refactor

Най-простата имплементация, която кара тестът да минава успешно.

Tuesday, April 27, 2010

Page 34: Behavior-Driven Development с RSpec и Cucumber

red/green/refactor

Отстраняване на повторения, докато кодът не стане достатъчно качествен.

Tuesday, April 27, 2010

Page 35: Behavior-Driven Development с RSpec и Cucumber

Tuesday, April 27, 2010

Page 36: Behavior-Driven Development с RSpec и Cucumber

малки стъпки

Tuesday, April 27, 2010

Page 37: Behavior-Driven Development с RSpec и Cucumber

Test-Driven Design

Tuesday, April 27, 2010

Page 38: Behavior-Driven Development с RSpec и Cucumber

Преизползваемост

Tuesday, April 27, 2010

Page 39: Behavior-Driven Development с RSpec и Cucumber

Low coupling

Tuesday, April 27, 2010

Page 40: Behavior-Driven Development с RSpec и Cucumber

Добър интерфейс

Tuesday, April 27, 2010

Page 41: Behavior-Driven Development с RSpec и Cucumber

scope creep

Tuesday, April 27, 2010

Page 42: Behavior-Driven Development с RSpec и Cucumber

up-front design

Tuesday, April 27, 2010

Page 43: Behavior-Driven Development с RSpec и Cucumber

1. Unit test-ове

2. Test-Driven

3. Behavior-Driven

4. RSpec

5. Cucumber

Tuesday, April 27, 2010

Page 44: Behavior-Driven Development с RSpec и Cucumber

Test-Driven Development is not about testing

Tuesday, April 27, 2010

Page 45: Behavior-Driven Development с RSpec и Cucumber

TDD ≠ QA

Tuesday, April 27, 2010

Page 46: Behavior-Driven Development с RSpec и Cucumber

Опитните TDD-ри използват процеса за да открият поведението, което системата трябва

да има.

Tuesday, April 27, 2010

Page 47: Behavior-Driven Development с RSpec и Cucumber

Behavior-Driven Development

Tuesday, April 27, 2010

Page 48: Behavior-Driven Development с RSpec и Cucumber

BDD ≈ TDD++

Tuesday, April 27, 2010

Page 49: Behavior-Driven Development с RSpec и Cucumber

"Getting the words right"

Tuesday, April 27, 2010

Page 50: Behavior-Driven Development с RSpec и Cucumber

Test-Driven ⇒ Behavior-Driven

Tuesday, April 27, 2010

Page 51: Behavior-Driven Development с RSpec и Cucumber

Assertion ⇒ Expectation

Tuesday, April 27, 2010

Page 52: Behavior-Driven Development с RSpec и Cucumber

Test Method ⇒Code Example

Tuesday, April 27, 2010

Page 53: Behavior-Driven Development с RSpec и Cucumber

Test Case ⇒ Example Group

Tuesday, April 27, 2010

Page 54: Behavior-Driven Development с RSpec и Cucumber

Domain-Driven Design

Tuesday, April 27, 2010

Page 55: Behavior-Driven Development с RSpec и Cucumber

Eric Evans

Domain Driven Design

Tuesday, April 27, 2010

Page 56: Behavior-Driven Development с RSpec и Cucumber

Близки до проблемната област думи

Tuesday, April 27, 2010

Page 57: Behavior-Driven Development с RSpec и Cucumber

Разбираем за бизнеса език

Tuesday, April 27, 2010

Page 58: Behavior-Driven Development с RSpec и Cucumber

BDD = TDD + DDD(TLA FTW)

Tuesday, April 27, 2010

Page 59: Behavior-Driven Development с RSpec и Cucumber

Tuesday, April 27, 2010

Page 60: Behavior-Driven Development с RSpec и Cucumber

BDD = TDD + DDD

Tuesday, April 27, 2010

Page 61: Behavior-Driven Development с RSpec и Cucumber

BDD = TDD + DDD

BDD = (T + D)DD

Tuesday, April 27, 2010

Page 62: Behavior-Driven Development с RSpec и Cucumber

BDD = TDD + DDD

BDD = (T + D)DD

B = T + D

Tuesday, April 27, 2010

Page 63: Behavior-Driven Development с RSpec и Cucumber

BDD = TDD + DDD

BDD = (T + D)DD

B = T + D

интензитет = време + доза

Tuesday, April 27, 2010

Page 64: Behavior-Driven Development с RSpec и Cucumber

1. Unit test-ове

2. Test-Driven

3. Behavior-Driven

4. RSpec

5. Cucumber

Tuesday, April 27, 2010

Page 65: Behavior-Driven Development с RSpec и Cucumber

Друг "синтаксис"

Tuesday, April 27, 2010

Page 66: Behavior-Driven Development с RSpec и Cucumber

xUnit assert_equal 42, answer

Друг "синтаксис"

Tuesday, April 27, 2010

Page 67: Behavior-Driven Development с RSpec и Cucumber

xUnit assert_equal 42, answer

RSpec answer.should equal(42)

Друг "синтаксис"

Tuesday, April 27, 2010

Page 68: Behavior-Driven Development с RSpec и Cucumber

xUnit assert_equal 42, answer

RSpec answer.should equal(42)

English Answer should equal 42

Друг "синтаксис"

Tuesday, April 27, 2010

Page 69: Behavior-Driven Development с RSpec и Cucumber

Tuesday, April 27, 2010

Page 70: Behavior-Driven Development с RSpec и Cucumber

assert_equal 42, result

Tuesday, April 27, 2010

Page 71: Behavior-Driven Development с RSpec и Cucumber

assert_equal 42, result result.should == 42

Tuesday, April 27, 2010

Page 72: Behavior-Driven Development с RSpec и Cucumber

assert_equal 42, result result.should == 42assert result.nil?

Tuesday, April 27, 2010

Page 73: Behavior-Driven Development с RSpec и Cucumber

assert_equal 42, result result.should == 42assert result.nil? result.should be_nil

Tuesday, April 27, 2010

Page 74: Behavior-Driven Development с RSpec и Cucumber

assert_equal 42, result result.should == 42assert result.nil? result.should be_nilassert result.kind_of?(User)

Tuesday, April 27, 2010

Page 75: Behavior-Driven Development с RSpec и Cucumber

assert_equal 42, result result.should == 42assert result.nil? result.should be_nilassert result.kind_of?(User) result.should be_kind_of(User)

Tuesday, April 27, 2010

Page 76: Behavior-Driven Development с RSpec и Cucumber

assert_equal 42, result result.should == 42assert result.nil? result.should be_nilassert result.kind_of?(User) result.should be_kind_of(User)assert [], blog.posts

Tuesday, April 27, 2010

Page 77: Behavior-Driven Development с RSpec и Cucumber

assert_equal 42, result result.should == 42assert result.nil? result.should be_nilassert result.kind_of?(User) result.should be_kind_of(User)assert [], blog.posts blog.should have(:no).posts

Tuesday, April 27, 2010

Page 78: Behavior-Driven Development с RSpec и Cucumber

assert_equal 42, result result.should == 42assert result.nil? result.should be_nilassert result.kind_of?(User) result.should be_kind_of(User)assert [], blog.posts blog.should have(:no).postsassert 5, blog.posts.size

Tuesday, April 27, 2010

Page 79: Behavior-Driven Development с RSpec и Cucumber

assert_equal 42, result result.should == 42assert result.nil? result.should be_nilassert result.kind_of?(User) result.should be_kind_of(User)assert [], blog.posts blog.should have(:no).postsassert 5, blog.posts.size blog.should have(5).posts

Tuesday, April 27, 2010

Page 80: Behavior-Driven Development с RSpec и Cucumber

Tuesday, April 27, 2010

Page 81: Behavior-Driven Development с RSpec и Cucumber

assert_raise(InvalidRecord) do user.save!end

Tuesday, April 27, 2010

Page 82: Behavior-Driven Development с RSpec и Cucumber

assert_raise(InvalidRecord) do user.save!end

lambda { user.save! }.should raise_error(InvalidRecord)

Tuesday, April 27, 2010

Page 83: Behavior-Driven Development с RSpec и Cucumber

assert_raise(InvalidRecord) do user.save!end

lambda { user.save! }.should raise_error(InvalidRecord)

assert_difference "User.count", 1 do user.create!end

Tuesday, April 27, 2010

Page 84: Behavior-Driven Development с RSpec и Cucumber

assert_raise(InvalidRecord) do user.save!end

lambda { user.save! }.should raise_error(InvalidRecord)

assert_difference "User.count", 1 do user.create!end

lambda { user.save! }.should change { User.count }.by(1)

Tuesday, April 27, 2010

Page 85: Behavior-Driven Development с RSpec и Cucumber

class Stack < Test::Unit::TestCase def set_up() @stack = Stack.new end def test_empty assert @stack.empty? @stack.push 42 assert [email protected]? end def test_pop @stack.push 42 @stack.push 5 assert_equal 5, @stack.pop assert_equal 42, @stack.pop asser_raise(StackEmptyError) { @stack.pop } endend

Tuesday, April 27, 2010

Page 86: Behavior-Driven Development с RSpec и Cucumber

describe Stack do before(:each) do @stack = Stack.new end it "should be able to tell whether it is empty" do @stack.should be_empty @stack.push 42 @stack.should_not be_empty? end it "should pop the items in reverse order" do @stack.push 42 @stack.push 5 @stack.pop.should == 5 @stack.pop.should == 42 lambda { @stack.pop }.should raise_error(StackEmptyError) endend

Tuesday, April 27, 2010

Page 87: Behavior-Driven Development с RSpec и Cucumber

describe Stack do context "(empty stack)" do it "should be empty" it "#pop should raise an exception" end context "(non-empty stack)" do it "should not be empty" it "#pop should return the top element" it "#pop should remove the top element" endend

Tuesday, April 27, 2010

Page 88: Behavior-Driven Development с RSpec и Cucumber

Tuesday, April 27, 2010

Page 89: Behavior-Driven Development с RSpec и Cucumber

1. Unit test-ове

2. Test-Driven

3. Behavior-Driven

4. RSpec

5. Cucumber

Tuesday, April 27, 2010

Page 90: Behavior-Driven Development с RSpec и Cucumber

Feature: Manage posts In order to be able to spread wisdom the blogger wants to be able to write about anything he wants Scenario: Writing a new post Given that there are no posts And I am logged in When I go to the new post page And I fill "Title" with "F1rst p0st" And I fill "Content" with "This is my first post" And I press "Publish" Then I should be on the front page And I should see "This is my first post" And there should be a new post called "F1rst p0st"

Tuesday, April 27, 2010

Page 91: Behavior-Driven Development с RSpec и Cucumber

Given /^I am logged in$/ doend

When /^I go to (.*?)$/ do |page|end

When /^I fill "([^\"]*)" with "([^\"]*)"$/ do |field, content|end

When /^I press "([^\"]*)"$/ do |button_name|end

Then /^I should be on (.*?)$/ do |page|end

Then /^I should see "([^\"]*)"$/ do |text1|end

Then /^there should be a new post called "([^\"]*)"$/ do |name|end

Tuesday, April 27, 2010

Page 92: Behavior-Driven Development с RSpec и Cucumber

Tuesday, April 27, 2010