Test Driven Development Workshop
-
Upload
karen-sijbrandij -
Category
Technology
-
view
472 -
download
2
description
Transcript of Test Driven Development Workshop
Test Driven Development
Introductie
● Wat is TDD?
● Waarom TDD?
● 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
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
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
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
Waarom TDD
NIET testen:
Waarom TDD
De workshop - Coding Dojo regels
Groepjes van tweeComputer wisselt met elke stapAlle code moet getest zijnEr zijn meerdere oplossingen mogelijkProbeer eens iets nieuws
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"
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"
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Voorbeelduitkomst - next steps➢ Elke individuele regel naar een aparte methode
abstraheren➢ De complete lijst laten zien met het uitvoeren van een
bestand➢ User Interface
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