behavior-driven development с rspec и cucumber

Post on 06-May-2015

919 Views

Category:

Technology

5 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

http://skanev.com/

27.06.2009, TechCamp.eu

Tuesday, April 27, 2010

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

Tuesday, April 27, 2010

Unit Tests

Test-Driven Development

Behavior-Driven Development

Tuesday, April 27, 2010

1. Unit test-ове

2. Test-Driven

3. Behavior-Driven

4. RSpec

5. Cucumber

Tuesday, April 27, 2010

1. Unit test-ове

2. Test-Driven

3. Behavior-Driven

4. RSpec

5. Cucumber

Tuesday, April 27, 2010

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

Repetitive...

Tuesday, April 27, 2010

...boring...

Tuesday, April 27, 2010

...error-prone

Tuesday, April 27, 2010

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

Tuesday, April 27, 2010

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

Tuesday, April 27, 2010

Unit Test

Tuesday, April 27, 2010

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

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

Tuesday, April 27, 2010

С един бутон

Да Не

Tuesday, April 27, 2010

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

Finished in 8.334414 seconds

207 examples, 0 failures

Tuesday, April 27, 2010

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

I can has value?

Tuesday, April 27, 2010

Време

Tuesday, April 27, 2010

Regression testing

Tuesday, April 27, 2010

Tuesday, April 27, 2010

Tuesday, April 27, 2010

Tuesday, April 27, 2010

Tuesday, April 27, 2010

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

Tuesday, April 27, 2010

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

Tuesday, April 27, 2010

Tuesday, April 27, 2010

1. Unit test-ове

2. Test-Driven

3. Behavior-Driven

4. RSpec

5. Cucumber

Tuesday, April 27, 2010

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

Tuesday, April 27, 2010

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

Tuesday, April 27, 2010

test-first

Tuesday, April 27, 2010

red/green/refactor

Tuesday, April 27, 2010

red/green/refactor

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

Tuesday, April 27, 2010

red/green/refactor

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

Tuesday, April 27, 2010

red/green/refactor

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

Tuesday, April 27, 2010

Tuesday, April 27, 2010

малки стъпки

Tuesday, April 27, 2010

Test-Driven Design

Tuesday, April 27, 2010

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

Tuesday, April 27, 2010

Low coupling

Tuesday, April 27, 2010

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

Tuesday, April 27, 2010

scope creep

Tuesday, April 27, 2010

up-front design

Tuesday, April 27, 2010

1. Unit test-ове

2. Test-Driven

3. Behavior-Driven

4. RSpec

5. Cucumber

Tuesday, April 27, 2010

Test-Driven Development is not about testing

Tuesday, April 27, 2010

TDD ≠ QA

Tuesday, April 27, 2010

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

да има.

Tuesday, April 27, 2010

Behavior-Driven Development

Tuesday, April 27, 2010

BDD ≈ TDD++

Tuesday, April 27, 2010

"Getting the words right"

Tuesday, April 27, 2010

Test-Driven ⇒ Behavior-Driven

Tuesday, April 27, 2010

Assertion ⇒ Expectation

Tuesday, April 27, 2010

Test Method ⇒Code Example

Tuesday, April 27, 2010

Test Case ⇒ Example Group

Tuesday, April 27, 2010

Domain-Driven Design

Tuesday, April 27, 2010

Eric Evans

Domain Driven Design

Tuesday, April 27, 2010

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

Tuesday, April 27, 2010

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

Tuesday, April 27, 2010

BDD = TDD + DDD(TLA FTW)

Tuesday, April 27, 2010

Tuesday, April 27, 2010

BDD = TDD + DDD

Tuesday, April 27, 2010

BDD = TDD + DDD

BDD = (T + D)DD

Tuesday, April 27, 2010

BDD = TDD + DDD

BDD = (T + D)DD

B = T + D

Tuesday, April 27, 2010

BDD = TDD + DDD

BDD = (T + D)DD

B = T + D

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

Tuesday, April 27, 2010

1. Unit test-ове

2. Test-Driven

3. Behavior-Driven

4. RSpec

5. Cucumber

Tuesday, April 27, 2010

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

Tuesday, April 27, 2010

xUnit assert_equal 42, answer

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

Tuesday, April 27, 2010

xUnit assert_equal 42, answer

RSpec answer.should equal(42)

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

Tuesday, April 27, 2010

xUnit assert_equal 42, answer

RSpec answer.should equal(42)

English Answer should equal 42

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

Tuesday, April 27, 2010

Tuesday, April 27, 2010

assert_equal 42, result

Tuesday, April 27, 2010

assert_equal 42, result result.should == 42

Tuesday, April 27, 2010

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

Tuesday, April 27, 2010

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

Tuesday, April 27, 2010

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

Tuesday, April 27, 2010

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

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

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

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

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

Tuesday, April 27, 2010

assert_raise(InvalidRecord) do user.save!end

Tuesday, April 27, 2010

assert_raise(InvalidRecord) do user.save!end

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

Tuesday, April 27, 2010

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

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

class Stack < Test::Unit::TestCase def set_up() @stack = Stack.new end def test_empty assert @stack.empty? @stack.push 42 assert !@stack.empty? 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

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

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

Tuesday, April 27, 2010

1. Unit test-ове

2. Test-Driven

3. Behavior-Driven

4. RSpec

5. Cucumber

Tuesday, April 27, 2010

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

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

Tuesday, April 27, 2010

top related