Test Driven Development Workshop

29
Test Driven Development

description

This presentation was used for a workshop on Test Driven Development, using the Fizz Buzz Coding Dojo Kata.

Transcript of Test Driven Development Workshop

Page 1: Test Driven Development Workshop

Test Driven Development

Page 2: Test Driven Development Workshop

Introductie

● Wat is TDD?

● Waarom TDD?

● Workshop

Page 3: Test Driven Development Workshop

Wat is TDD?Wikipedia: a software development process that relies on the repetition of a very short development cycle: first the developer writes an (initially failing) test case that defines a desired improvement or new function, then produces the minimum amount of code to pass that test, and finally refactors the new code to acceptable standards

Page 4: Test Driven Development Workshop

Wat is TDD?Wikipedia: a software development process that relies on the repetition of a very short development cycle: first the developer writes an (initially failing) test case that defines a desired improvement or new function, then produces the minimum amount of code to pass that test, and finally refactors the new code to acceptable standards

Page 5: Test Driven Development Workshop

Wat is TDD?Wikipedia: a software development process that relies on the repetition of a very short development cycle: first the developer writes an (initially failing) test case that defines a desired improvement or new function, then produces the minimum amount of code to pass that test, and finally refactors the new code to acceptable standards

Page 6: Test Driven Development Workshop

Wat is TDD?Wikipedia: a software development process that relies on the repetition of a very short development cycle: first the developer writes an (initially failing) test case that defines a desired improvement or new function, then produces the minimum amount of code to pass that test, and finally refactors the new code to acceptable standards

Page 7: Test Driven Development Workshop

Waarom TDD

NIET testen:

Page 8: Test Driven Development Workshop

Waarom TDD

Page 9: Test Driven Development Workshop

De workshop - Coding Dojo regels

Groepjes van tweeComputer wisselt met elke stapAlle code moet getest zijnEr zijn meerdere oplossingen mogelijkProbeer eens iets nieuws

Page 10: Test Driven Development Workshop

De opdracht

Toon een opeenvolgende rij van getallenAls een getal deelbaar is door 3, toon "Fizz"Als een getal deelbaar is door 5, toon "Buzz"Als een getal deelbaar is door 3 en 5, toon "FizzBuzz"

Page 11: Test Driven Development Workshop

Voorbeelduitkomst"1" "11" "Fizz" "31" "41""2" "Fizz" "22" "32" "Fizz""Fizz" "13" "23" "Fizz" "43""4" "14" "Fizz" "34" "44""Buzz" "FizzBuzz" "Buzz" "Buzz" "FizzBuzz""Fizz" "16" "26" "Fizz" "46""7" "17" "Fizz" "37" "47""8" "Fizz" "28" "38" "Fizz""Fizz" "19" "29" "Fizz" "49""Buzz" "Buzz" "FizzBuzz" "Buzz" "Buzz"

Page 12: Test Driven Development Workshop

Voorbeeldoplossing - stap 1Schrijf een (falende) test:test_fizz_buzz.rb: console:

require_relative "fizz_buzz"

require "test/unit"

class TestFizzBuzz < Test::Unit::TestCase

def test_number_3

assert_equal "Fizz", FizzBuzz.print(3)

end

end

E

Finished tests in 0.000378s, 2642.4268 tests/s, 0.0000 assertions/s.

1) Error:test_number_3(TestFizzBuzz):NoMethodError: undefined method `print for FizzBuzz:Class test_fizz_buzz.rb:6:in `test_number_3'

1 tests, 0 assertions, 0 failures, 1 errors, 0 skips

Page 13: Test Driven Development Workshop

Voorbeeldoplossing - stap 2Schrijf de minimale code om de test te laten lukken:fizz_buzz.rb: console:

class FizzBuzz def self.print(number) return "Fizz" if number == 3 endend

.

Finished tests in 0.000306s, 3266.2660 tests/s, 3266.2660 assertions/s.

1 tests, 1 assertions, 0 failures, 0 errors, 0 skips

Page 14: Test Driven Development Workshop

Voorbeeldoplossing - stap 3Wat gebeurt er als we 6 meegeven?test_fizz_buzz.rb: console:

class TestFizzBuzz < Test::Unit::TestCase

def test_number_3

assert_equal "Fizz", FizzBuzz.print(3)

end

def test_number_6

assert_equal "Fizz", FizzBuzz.print(6)

end

end

.F

Finished tests in 0.000525s, 3808.0804 tests/s, 3808.0804 assertions/s.

1) Failure:test_number_6(TestFizzBuzz) [test_fizz_buzz.rb:10]:<"Fizz"> expected but was<nil>.

2 tests, 2 assertions, 1 failures, 0 errors, 0 skips

Page 15: Test Driven Development Workshop

Voorbeeldoplossing - stap 4Herschrijf de code:fizz_buzz.rb: console:

class FizzBuzz

def self.print(number)

return "Fizz" if (number % 3 == 0)

end

end

..

Finished tests in 0.000342s, 5851.4436 tests/s, 5851.4436 assertions/s.

2 tests, 2 assertions, 0 failures, 0 errors, 0 skips

Page 16: Test Driven Development Workshop

Voorbeeldoplossing - stap 5Schrijf de test voor nummer 5:test_fizz_buzz.rb: console:

class TestFizzBuzz < Test::Unit::TestCase

def test_number_5

assert_equal "Buzz", FizzBuzz.print(5)

end

end

.F.

Finished tests in 0.000589s, 5092.4794 tests/s, 5092.4794 assertions/s.

1) Failure:test_number_5(TestFizzBuzz) [test_fizz_buzz.rb:14]:<"Buzz"> expected but was<nil>.

3 tests, 3 assertions, 1 failures, 0 errors, 0 skips

Page 17: Test Driven Development Workshop

Voorbeeldoplossing - stap 6Schrijf de code voor nummer 5:fizz_buzz.rb: console:

class FizzBuzz

def self.print(number)

return "Fizz" if (number % 3 == 0)

return "Buzz" if number == 5

end

end

...

Finished tests in 0.000352s, 8522.3157 tests/s, 8522.3157 assertions/s.

3 tests, 3 assertions, 0 failures, 0 errors, 0 skips

Page 18: Test Driven Development Workshop

Voorbeeldoplossing - stap 7Wat gebeurt er nu bij nummer 10?test_fizz_buzz.rb: console:

class FizzBuzz < Test::Unit::TestCase

def test_number_5

assert_equal "Buzz", FizzBuzz.print(5)

end

def test_number_10

assert_equal "Buzz", FizzBuzz.print(10)

end

end

F...

Finished tests in 0.000565s, 7083.0057 tests/s, 7083.0057 assertions/s.

1) Failure:test_number_10(TestFizzBuzz) [test_fizz_buzz.rb:18]:<"Buzz"> expected but was<nil>.

4 tests, 4 assertions, 1 failures, 0 errors, 0 skips

Page 19: Test Driven Development Workshop

Voorbeeldoplossing - stap 8Herschrijf de code:fizz_buzz.rb: console:

class FizzBuzz

def self.print(number)

return "Fizz" if (number % 3 == 0)

return "Buzz" if (number % 5 == 0)

end

end

....

Finished tests in 0.000387s, 10343.3474 tests/s, 10343.3474 assertions/s.

4 tests, 4 assertions, 0 failures, 0 errors, 0 skips

Page 20: Test Driven Development Workshop

Voorbeeldoplossing - stap 9Schrijf de test voor 3 en 5:test_fizz_buzz.rb: console:

class TestFizzBuzz < Test::Unit::TestCase

def test_number_15

assert_equal "FizzBuzz", FizzBuzz.print(15)

end

end

.F...

Finished tests in 0.000618s, 8085.1594 tests/s, 8085.1594 assertions/s.

1) Failure:test_number_15(TestFizzBuzz) [test_fizz_buzz.rb:22]:<"FizzBuzz"> expected but was<"Fizz">.

5 tests, 5 assertions, 1 failures, 0 errors, 0 skips

Page 21: Test Driven Development Workshop

Voorbeeldoplossing - stap 10Schrijf de code voor 3 en 5:fizz_buzz.rb: console:

class FizzBuzz

def self.print(number)

return "FizzBuzz" if number == 15

return "Fizz" if (number % 3 == 0)

return "Buzz" if (number % 5 == 0)

end

end

.....

Finished tests in 0.000392s, 12763.0138 tests/s, 12763.0138 assertions/s.

5 tests, 5 assertions, 0 failures, 0 errors, 0 skips

Page 22: Test Driven Development Workshop

Voorbeeldoplossing - stap 11Wat gebeurt er nu bij 30?test_fizz_buzz.rb: console:

class TestFizzBuzz < Test::Unit::TestCase

def test_number_15

assert_equal "FizzBuzz", FizzBuzz.print(15)

end

def test_number_30

assert_equal "FizzBuzz", FizzBuzz.print(30)

end

end

...F..

Finished tests in 0.000599s, 10010.2104 tests/s, 10010.2104 assertions/s.

1) Failure:test_number_30(TestFizzBuzz) [test_fizz_buzz.rb:26]:<"FizzBuzz"> expected but was<"Fizz">.

6 tests, 6 assertions, 1 failures, 0 errors, 0 skips

Page 23: Test Driven Development Workshop

Voorbeeldoplossing - stap 12Schrijf de code voor 30:fizz_buzz.rb: console:

class FizzBuzz

def self.print(number)

return "FizzBuzz" if (number % 3 == 0) &&

(number && 5 == 0)

return "Fizz" if (number % 3 == 0)

return "Buzz" if (number % 5 == 0)

end

end

......

Finished tests in 0.000423s, 14191.6775 tests/s, 14191.6775 assertions/s.

6 tests, 6 assertions, 0 failures, 0 errors, 0 skips

Page 24: Test Driven Development Workshop

Voorbeeldoplossing - stap 13Refactor de code voor 30:fizz_buzz.rb: console:

class FizzBuzz

def self.print(number)

return "FizzBuzz" if (number % 15 == 0)

return "Fizz" if (number % 3 == 0)

return "Buzz" if (number % 5 == 0)

end

end

......

Finished tests in 0.000423s, 14191.6775 tests/s, 14191.6775 assertions/s.

6 tests, 6 assertions, 0 failures, 0 errors, 0 skips

Page 25: Test Driven Development Workshop

Voorbeeldoplossing - stap 14Wat als we een foutje hadden gemaakt?fizz_buzz.rb: console:

class FizzBuzz

def self.print(number)

return "FizzBuzz" if (number % 3 == 0) ||

(number % 5 == 0)

return "Fizz" if (number % 3 == 0)

return "Buzz" if (number % 5 == 0)

end

end

F.F.FF

Finished tests in 0.000999s, 6007.5034 tests/s, 6007.5034 assertions/s.

1) Failure:test_number_10(TestFizzBuzz) [test_fizz_buzz.rb:18]:<"Buzz"> expected but was<"FizzBuzz">.

2) Failure:test_number_3(TestFizzBuzz) [test_fizz_buzz.rb:6]:<"Fizz"> expected but was<"FizzBuzz">.

3) Failure:test_number_5(TestFizzBuzz) [test_fizz_buzz.rb:14]:<"Buzz"> expected but was<"FizzBuzz">.

4) Failure:test_number_6(TestFizzBuzz) [test_fizz_buzz.rb:10]:<"Fizz"> expected but was<"FizzBuzz">.

6 tests, 6 assertions, 4 failures, 0 errors, 0 skips

Page 26: Test Driven Development Workshop

Voorbeeldoplossing - stap 15Schrijf de test voor alle andere getallen:test_fizz_buzz.rb: console:

class TestFizzBuzz < Test::Unit::TestCase

def test_number_2

assert_equal "2", FizzBuzz.print(2)

end

end

..F....

Finished tests in 0.000631s, 11091.4634 tests/s, 11091.4634 assertions/s.

1) Failure:test_number_2(TestFizzBuzz) [test_fizz_buzz.rb:30]:<"2"> expected but was<nil>.

7 tests, 7 assertions, 1 failures, 0 errors, 0 skips

Page 27: Test Driven Development Workshop

Voorbeeldoplossing - stap 16Schrijf de code voor alle andere getallen:fizz_buzz.rb: console:

class FizzBuzz

def self.print(number)

return "FizzBuzz" if (number % 15 == 0)

return "Fizz" if (number % 3 == 0)

return "Buzz" if (number % 5 == 0)

return number.to_s

end

end

.......

Finished tests in 0.000520s, 13452.1220 tests/s, 13452.1220 assertions/s.

7 tests, 7 assertions, 0 failures, 0 errors, 0 skips

Page 28: Test Driven Development Workshop

Voorbeelduitkomst - next steps➢ Elke individuele regel naar een aparte methode

abstraheren➢ De complete lijst laten zien met het uitvoeren van een

bestand➢ User Interface

Page 29: Test Driven Development Workshop

Voorbeeldoplossing - stap 17Itereren over 100 getallen:fizz_buzz.rb: console:

class FizzBuzz

def self.print(number)

return "FizzBuzz" if (number % 15 == 0)

return "Fizz" if (number % 3 == 0)

return "Buzz" if (number % 5 == 0)

return number.to_s

end

end

(1..100).each{|number| puts FizzBuzz.print(number)}

ruby fizz_buzz.rb12Fizz4BuzzFizz78FizzBuzz11Fizz1314FizzBuzz1617Fizz19BuzzFizz2223...etc