A brief intro to TDD for a JUG-TAA event

  • 846 views
Uploaded on

A simple and quick introduction to Test-Driven Development presented at the JUG Trentino-AltoAdige event at XPeppers, August 22, 2012.

A simple and quick introduction to Test-Driven Development presented at the JUG Trentino-AltoAdige event at XPeppers, August 22, 2012.

More in: Technology , Business
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
846
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
5
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Quickly add a test.\nRun all tests and see the new one fail.\nMake a little change.\nRun all tests and see them all succeed.\nRefactor to remove duplication.\n\n
  • \n
  • First we'll solve the “that works” part\n Then we'll solve the “clean code” part\n
  • \n
  • \n
  • \n
  • \n
  • Esempio:\n \n Roman 0 => ""\n \n Mercato Titoli\n il mercato è chiuso di default\n non ci sono ordini su un titolo che non esiste\n se metto ordini su un titolo con il mercato chiuso ho una eccezione\n\n
  • \n
  • \n
  • Il prossimo test\n Trattiamo ogni test come una nuova occasione per imparare e ridurre la complessità sul modello del problema \n ogni test ci da ulteriore conoscenza\n ES\n Mercato Titoli\n qual'è la prossima domanda a cui vogliamo rispondere?\n\n
  • Il prossimo test\n Trattiamo ogni test come una nuova occasione per imparare e ridurre la complessità sul modello del problema \n ogni test ci da ulteriore conoscenza\n ES\n Mercato Titoli\n qual'è la prossima domanda a cui vogliamo rispondere?\n\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

Transcript

  • 1. Test-Driven Development Coding Dojo Pietro Di Bello pietro.di.bello@xpeppers.com @pierodibello @xpeppers JUG Trentino Alto-Adige Agosto 2012
  • 2. Che cos’è il TDD?è una tecnica di design in cui lo sviluppo di unafunzionalità è guidato dalla scrittura di uno o più unittest • si basa sulluso di unit test • lo sviluppo del codice è guidato dalla scrittura di unit test che devono essere di volta in volta verificati • il test viene scritto ed eseguito PRIMA del codice stesso che consentirà di verificarlo
  • 3. Write a testpublic class AdderTest { @Test public void testTwoPlusThree() { Adder a = new Adder(); assertEquals(5, a.add(2, 3)); }}
  • 4. Now it compilespublic class AdderTest { @Test public void testTwoPlusThree() { Adder a = new Adder(); assertEquals(5, a.add(2, 3)); }}public class Adder { public int add(int a, int b) { return 0; }}
  • 5. Red bar!public class AdderTest { @Test public void testTwoPlusThree() { Adder a = new Adder(); assertEquals(5, a.add(2, 3)); }}public class Adder { public int add(int a, int b) { return 0; }} Expected 5, was 0
  • 6. Do the simplest thingpublic class AdderTest { @Test public void testTwoPlusThree() { Adder a = new Adder(); assertEquals(5, a.add(2, 3)); }}public class Adder { public int add(int a, int b) { return 5; }}
  • 7. Refactorpublic class AdderTest { @Test public void testTwoPlusThree() { Adder a = new Adder(); assertEquals(5, a.add(2, 3)); }}public class Adder { public int add(int a, int b) { return a+b; }}
  • 8. The procedure1. Write a test2. Make it compile Expected 5, was 03. Make it pass quickly4. Refactor to remove duplication
  • 9. RedRefactor Green Repeat every 2-10 min.
  • 10. Clean code that works.
  • 11. TDD: why?• Per abbattere la complessità• Consente di ridurre la soluzione di un problema complesso in tanti problemi più semplici (divide et impera)
  • 12. TDD: why?Ogni test rappresenta una opportunità di porre unadomanda sul sistema, la cui risposta ci porterà ad unmaggiore consolidamento della conoscenza e unariduzione dellunknown
  • 13. TDD: why?When we write a test, we imagine the perfectinterface for our operation.We are telling ourselvesa story about how the operation will look from theoutside.Our story wont always come true, but its better tostart from the best-possible application programinterface (API) and work backward than to makethings complicated, ugly, and "realistic" from theget-go. Kent Beck
  • 14. Simple designThe code is simple enough when it: 0. Runs all the tests 1. Contains no duplication 2. Expresses every idea that we need to express 3. Has the minimum number of classes and functions(In this order) Kent Beck, Extreme Programming Explained
  • 15. Il primo test• deve essere piccolo• il più semplice possibile • ad es possiamo selezionare un caso degenere• tracciamo i primi contorni di una API ad undettaglio molto più fine di quanto siamo abituatisolitamente
  • 16. Il primo test
  • 17. Il primo test
  • 18. Il prossimo testTrattiamo ogni test come una nuova occasione perimparare e ridurre la complessità sul modello delproblemaQual’è la prossima domanda a cui vogliamo rispondere?
  • 19. Il prossimo test
  • 20. Uso della to-do list• Utile per gestire la complessità • elencare i diversi aspetti del problema• NON si elencano i test da implementare • non è TDD• Riduce lo stress• Bussola per farci capire a che punto siamo e non ci perdere la strada• Se mi viene in mente qualcosa la scrivo nella todolist e continuo sulla mia strada senza perdere focus • => tecnica del Pomodoro
  • 21. Coding Dojo
  • 22. What’s a kata?A kata is meant to be memorized.Students of a kata study it as a form, not as a conclusion.It is not the conclusion of the kata that matters, its thesteps that lead to the conclusion. Bob Martin (http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata)
  • 23. The Bowling Game Kata By Robert Martin “Uncle Bob”http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata
  • 24. Il punteggio del bowlingCi sono 10 frame. In ogni frame il giocatore ha due possibilità di abbattere 10 birilli (pins). Il punteggio per il frame è il numero di birilli abbattuti, più i bonus per stike o spare.Uno spare è quando il giocatore abbatte 10 birilli in due tiri. Il bonus per quel frame è il numero di birilli abbattuti al tiro successivo. Nel frame 3 dellesempio, il punteggio è 10 (i birilli abbattuti) più il bonus di 5 (abbattuti nel tiro successivo.)Uno strike è quando il giocatore abbatte tutti i birilli in un solo tiro. Il bonus per quel frame è il numero di birilli abbattuti nei due tiri successiviNel decimo frame, se il giocatore fa uno strike o spare può fare i tiri necessari per completare il frame. In ogni caso, al decimo frame non vengono fatti più di tre tiri.
  • 25. I requisiti• Scrivete una classe“Game” con due metodi: • roll(pins : int) è chiamato ogni volta che il giocatore fa un tiro. L’argomento è il numero di birilli abbattuti. • score(): int è chiamato quando il gioco termina e ritorna il punteggio finale.
  • 26. Una veloce sessione di design Ovviamente avremo bisogno di una classe Game.
  • 27. Una veloce sessione di design Un gioco ha 10 frames.
  • 28. Una veloce sessione di design Un frame ha uno o due birilli (pins)
  • 29. Una veloce sessione di design Il decimo frame è diverso dagli altri: può avere due o tre tiri.
  • 30. Una veloce sessione di designLa funzione scoredeve iterare su tutti iframes e calcolare iloro punteggi.
  • 31. Una veloce sessione di design Il punteggio di uno spare o di uno strike dipende dal punteggio del frame successivo
  • 32. Coding Katas: String Calculator by Roy Osherove (http://osherove.com/tdd- kata-1)
  • 33. StringCalculator KataCreate a simple String calculator with a method int Add(string numbers)The method can take zero, one or two numbers, andwill return their sum• for example “” or “1” or “1,2”• for an empty string it will return 0Start with the simplest test case of an empty string andmove to one and two numbers
  • 34. StringCalculator KataRemember to solve things as simply as possible sothat you force yourself to write tests you did notthink aboutRemember to refactor after each passing test
  • 35. StringCalculator KataAllow the Add method to handle an unknownamount of numbers
  • 36. StringCalculator Kata Allow the Add method to handle new lines between numbers (instead of commas).• the following input is ok:  “1n2,3”  (will equal 6)• the following input is NOT ok:  “1,n” (not need to prove it - just clarifying)
  • 37. StringCalculator KataSupport different delimitersto change a delimiter, the beginning of the string will contain aseparate line that looks like this:“//[delimiter]n[numbers…]”for example “//;n1;2” should return three where the defaultdelimiter is ‘;’ .the first line is optional.all existing scenarios should still be supported
  • 38. StringCalculator KataCalling Add with a negative number will throw an exception “negatives not allowed” - and the negative that was passed.If there are multiple negatives, show all of them in the exception message
  • 39. StringCalculator KataNumbers bigger than 1000 should be ignored, so adding 2 + 1001 = 2
  • 40. More on code kata• http://codekata.pragprog.com/• http://codingdojo.org/• https://sites.google.com/site/tddproblems/all-problems-1• http://xp123.com/articles/tests-from-a-hat/
  • 41. HomeworkRoman Numerals kata:write a Roman class which converts an integer into aroman number string.es: 12 => “XII”Bonus: can you write the inverse converter (from romanto integer)?es: “IX” => 9
  • 42. HomeworkPrime Factors kata: • http://butunclebob.com/ ArticleS.UncleBob.ThePrimeFactorsKata
  • 43. Supermarket checkout• Compute the total price• Scan items one at a time• In any order
  • 44. Copyright 2008-2012 XPeppersTutti i diritti di riproduzione sono riservati.