Tecnologia e Applicazioni Internet...

60
Tecnologia e Applicazioni Internet 2011/12 Matteo Vaccari http://matteo.vaccari.name/ [email protected] Lezione 0 - Test-Driven Development 1 domenica 25 marzo 12

Transcript of Tecnologia e Applicazioni Internet...

Page 1: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Tecnologia e Applicazioni Internet 2011/12

Matteo Vaccarihttp://matteo.vaccari.name/

[email protected]

Lezione 0 - Test-Driven Development

1domenica 25 marzo 12

Page 2: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Le vostre aspettative?

2domenica 25 marzo 12

Page 3: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Argomenti• Progettazione applicativa moderna

• Test-Driven Development

• Test unitario e funzionale di applicazioni web

• Uso del database in Java

• Java Servlet API

• JavaScript

• Ajax

3domenica 25 marzo 12

Page 4: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Esame

• 7 punti: laboratorio

• 7 punti: orale

• 16 punti: elaborato

4domenica 25 marzo 12

Page 5: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Application Design

5domenica 25 marzo 12

Page 6: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Obiettivo: software manutenibile e affidabile

6domenica 25 marzo 12

Page 7: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Affidabile = ?

7domenica 25 marzo 12

Page 8: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Assenza di difetti :-)

Working software

8domenica 25 marzo 12

Page 9: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Come ottenere software affidabile?

• Testing

• Review

• Design

9domenica 25 marzo 12

Page 10: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Terminologia

10domenica 25 marzo 12

Page 11: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Terminologia

11domenica 25 marzo 12

Page 12: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

12domenica 25 marzo 12

Page 13: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Terminologia

13domenica 25 marzo 12

Page 14: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Terminologia

14domenica 25 marzo 12

Page 15: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Tabella di casi di test

• Unit under test

• Input values

• Expected output

15domenica 25 marzo 12

Page 16: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Manutenibile = ?

16domenica 25 marzo 12

Page 17: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Costo del cambiamento

Kent Beck, Extreme Programming Explained17domenica 25 marzo 12

Page 18: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Può essere così?

Kent Beck, Extreme Programming Explained18domenica 25 marzo 12

Page 19: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Perché il costo del cambiamento aumenta?

19domenica 25 marzo 12

Page 20: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Cost of change: C Cost of change: C + n Cost of change: C x n

n

??

Cost of change: Cn

Cost of change: C n

20domenica 25 marzo 12

Page 21: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

/** * @see org.apache.wicket.request.IRequestCycleProcessor#resolve(org.apache.wicket.RequestCycle, * org.apache.wicket.request.RequestParameters) */ public IRequestTarget resolve(final RequestCycle requestCycle, final RequestParameters requestParameters) { IRequestCodingStrategy requestCodingStrategy = requestCycle.getProcessor() .getRequestCodingStrategy();

final String path = requestParameters.getPath(); IRequestTarget target = null;

// See whether this request points to a bookmarkable page if (requestParameters.getBookmarkablePageClass() != null) { target = resolveBookmarkablePage(requestCycle, requestParameters); } // See whether this request points to a rendered page else if (requestParameters.getComponentPath() != null) { // marks whether or not we will be processing this request int processRequest = 0; // 0 == process, 1 == page expired, 2 == not active page anymore synchronized (requestCycle.getSession()) { // we need to check if this request has been flagged as // process-only-if-path-is-active and if so make sure this // condition is met if (requestParameters.isOnlyProcessIfPathActive()) { // this request has indeed been flagged as // process-only-if-path-is-active

Session session = Session.get(); IPageMap pageMap = session.pageMapForName(requestParameters.getPageMapName(), false); if (pageMap == null) { // requested pagemap no longer exists - ignore this // request processRequest = 1; } else if (pageMap instanceof AccessStackPageMap) { AccessStackPageMap accessStackPageMap = (AccessStackPageMap)pageMap; if (accessStackPageMap.getAccessStack().size() > 0) { final Access access = (Access)accessStackPageMap.getAccessStack() .peek();

final int pageId = Integer.parseInt(Strings.firstPathComponent( requestParameters.getComponentPath(), Component.PATH_SEPARATOR));

if (pageId != access.getId()) { // the page is no longer the active page // - ignore this request processRequest = 2; } else { final int version = requestParameters.getVersionNumber(); if (version != Page.LATEST_VERSION && version != access.getVersion()) { // version is no longer the active version - // ignore this request processRequest = 2;

} } } } else { // TODO also this should work.. } } } if (processRequest == 0) { try { target = resolveRenderedPage(requestCycle, requestParameters); } catch (IgnoreAjaxRequestException e) { target = EmptyAjaxRequestTarget.getInstance(); } } else { Request request = requestCycle.getRequest(); if (request instanceof WebRequest && ((WebRequest)request).isAjax() && processRequest == 2) { // if processRequest is false in an ajax request just have an empty ajax target target = EmptyAjaxRequestTarget.getInstance(); } else { throw new PageExpiredException("Request cannot be processed"); } } } // See whether this request points to a shared resource else if (requestParameters.getResourceKey() != null) { target = resolveSharedResource(requestCycle, requestParameters); } // See whether this request points to the home page else if (Strings.isEmpty(path) || ("/".equals(path))) { target = resolveHomePageTarget(requestCycle, requestParameters); }

// NOTE we are doing the mount check as the last item, so that it will // only be executed when everything else fails. This enables URLs like // /foo/bar/?wicket:bookmarkablePage=my.Page to be resolved, where // is either a valid mount or a non-valid mount. I (Eelco) am not // absolutely sure this is a great way to go, but it seems to have been // established as the default way of doing things. If we ever want to // tighten the algorithm up, it should be combined by going back to // unmounted paths so that requests with Wicket parameters like // 'bookmarkablePage' are always created and resolved in the same // fashion. There is a test for this in UrlMountingTest. if (target == null) { // still null? check for a mount target = requestCodingStrategy.targetForRequest(requestParameters);

if (target == null && requestParameters.getComponentPath() != null) { // If the target is still null and there was a component path // then the Page could not be located in the session throw new PageExpiredException( "Cannot find the rendered page in session [pagemap=" + requestParameters.getPageMapName() + ",componentPath=" + requestParameters.getComponentPath() + ",versionNumber=" + requestParameters.getVersionNumber() + "]"); } } else { // a target was found, but not by looking up a mount. check whether // this is allowed if (Application.get().getSecuritySettings().getEnforceMounts() && requestCodingStrategy.pathForTarget(target) != null) { String msg = "Direct access not allowed for mounted targets"; // the target was mounted, but we got here via another path // : deny the request log.error(msg + " [request=" + requestCycle.getRequest() +",target=" + target + ",session=" + Session.get() + "]"); throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_FORBIDDEN,msg); } }

// (WICKET-1356) in case no target was found, return null here.RequestCycle will deal with // it // possible letting wicket filter to pass the request down the filter chain /* * if (target == null) { // if we get here, we have no recognizedWicket target, and thus // * regard this as a external (non-wicket) resource request on //this server return * resolveExternalResource(requestCycle); } */

return target; }

21domenica 25 marzo 12

Page 22: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Slides by Dave Nicolette

Starting code baseCost of change: C

Changes implementedCost of change: C + n

Code cleaned upCost of change: C

22domenica 25 marzo 12

Page 23: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Test-Driven Development

23domenica 25 marzo 12

Page 24: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Obiettivo:clean code that works

24domenica 25 marzo 12

Page 25: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

I Valori del TDD

• Mantieni il focus

• Fai una sola cosa per volta

• Passi piccoli!

• Semplicità

25domenica 25 marzo 12

Page 26: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Henrik Bærbak Christensen 5

You are all employed today

Welcome to PayStation Ltd. We will develop the main

software to run pay stations.

55

26domenica 25 marzo 12

Page 27: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Case: Pay Station

Welcome to PayStation Ltd. Customer: AlphaTown

Requirements–accept coins for payment

• 5, 10, 25 cents–show time bought on display–print parking time receipts–US: 2 minutes cost 5 cent–handle buy and cancel

Henrik Bærbak Christensen 6

27domenica 25 marzo 12

Page 28: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Stories

Henrik Bærbak Christensen 7

28domenica 25 marzo 12

Page 29: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Minimum Terminology

–Production code–Test code–Failure–Defect–Test case:

• Input: -37; • Execute: Math.abs(x); • expected output: +37

Henrik Bærbak Christensen 11

29domenica 25 marzo 12

Page 30: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Principi del TDD

• Principle: test

• How do I test my code? Write an automated test

30domenica 25 marzo 12

Page 31: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Principi del TDD

• Principle: test first

• When should you write your tests? Before you write the code that’s to be tested

31domenica 25 marzo 12

Page 32: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Principi del TDD

• Principle: test list

• What should you test?

• Before you begin, write a list of all the tests you know you will have to write.

32domenica 25 marzo 12

Page 33: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

The TDD rhythm

1. Quickly add a test

2. Run all the tests and see the new one fail

3. Make a little change

4. Run all the tests and see them all succeed

5. Refactor to remove duplication

33domenica 25 marzo 12

Page 34: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

The Rhythm: Red-Green-Refactor

The Rhythm

24

Works part

Clean part

Introduce test of delta-feature

Implement delta-feature that does not break any existing code

Improve code quality

34domenica 25 marzo 12

Page 35: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Quanto dura un ciclo?

• Da 1 a 15 minuti -- di più significa che non stiamo facendolo bene

35domenica 25 marzo 12

Page 36: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Henrik Bærbak Christensen 28

Exercise: Test List

Generate the Test List for these stories

Henrik Bærbak Christensen 2828

36domenica 25 marzo 12

Page 37: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

?

37domenica 25 marzo 12

Page 38: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

• Accetta una moneta corretta

• 5 cent comprano 2 minuti

• Rifiuta moneta scorretta

• Il display mostra i minuti comprati

• Premendo “buy” ottengo una ricevuta

• Premendo “cancel” si resetta la stazione

Una lista di test

38domenica 25 marzo 12

Page 39: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Preliminari

• Apriamo Eclipse, prendiamo confidenza con JUnit

39domenica 25 marzo 12

Page 40: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Da dove iniziamo?

• Principio TDD: inizia da un test che:

• ti insegna qualcosa e che

• pensi di poter implementare

40domenica 25 marzo 12

Page 41: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

• Accetta una moneta corretta

• 5 cent comprano 2 minuti

• Rifiuta moneta scorretta

• Il display mostra i minuti

• Premendo “buy” ottengo una ricevuta

• Premendo “cancel” si resetta la stazione

Una lista di test

41domenica 25 marzo 12

Page 42: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

• Accetta una moneta corretta

• 5 cent comprano 2 minuti

• Rifiuta moneta scorretta

• Il display mostra i minuti

• Premendo “buy” ottengo una ricevuta

• Premendo “cancel” si resetta la stazione

Scegliamo...

42domenica 25 marzo 12

Page 43: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

43domenica 25 marzo 12

Page 44: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

• Accetta una moneta corretta

• 5 cent comprano 2 minuti

• Rifiuta moneta scorretta

• Il display mostra i minuti

• Premendo “buy” ottengo una ricevuta

• Premendo “cancel” si resetta la stazione

Una lista di test

44domenica 25 marzo 12

Page 45: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

45domenica 25 marzo 12

Page 46: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

• Accetta una moneta corretta

• 5 cent comprano 2 minuti

• Rifiuta moneta scorretta

• Il display mostra i minuti

• Premendo “buy” ottengo una ricevuta

• Premendo “cancel” si resetta la stazione

• 25 cent comprano 10 minuti

Triangoliamo

46domenica 25 marzo 12

Page 47: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

• Accetta una moneta corretta

• 5 cent comprano 2 minuti

• Rifiuta moneta scorretta

• Il display mostra i minuti

• Premendo “buy” ottengo una ricevuta

• Premendo “cancel” si resetta la stazione

• 25 cent comprano 10 minuti

Scegliamo il secondo test

47domenica 25 marzo 12

Page 48: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

• Accetta una moneta corretta

• 5 cent comprano 2 minuti

• Rifiuta moneta scorretta

• Il display mostra i minuti

• Premendo “buy” ottengo una ricevuta

• Premendo “cancel” si resetta la stazione

• 25 cent comprano 10 minuti

Il secondo test passa!

48domenica 25 marzo 12

Page 49: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Questa implementazione è sbagliata!!!

Che cosa dobbiamo fare ora?

49domenica 25 marzo 12

Page 50: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

• Accetta una moneta corretta

• 5 cent comprano 2 minuti

• Rifiuta moneta scorretta

• Il display mostra i minuti

• Premendo “buy” ottengo una ricevuta

• Premendo “cancel” si resetta la stazione

• 25 cent comprano 10 minuti

• 2 monete da 5 cent comprano 4 minuti

Aggiungiamo un test!

50domenica 25 marzo 12

Page 51: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

• Accetta una moneta corretta

• 5 cent comprano 2 minuti

• Rifiuta moneta scorretta

• Il display mostra i minuti

• Premendo “buy” ottengo una ricevuta

• Premendo “cancel” si resetta la stazione

• 25 cent comprano 10 minuti

• 2 monete da 5 cent comprano 4 minuti

Scegliamo il terzo test

51domenica 25 marzo 12

Page 52: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

• Accetta una moneta corretta

• 5 cent comprano 2 minuti

• Rifiuta moneta scorretta

• Il display mostra i minuti

• Premendo “buy” ottengo una ricevuta

• Premendo “cancel” si resetta la stazione

• 25 cent comprano 10 minuti

• 2 monete da 5 cent comprano 4 minuti

Scegliamo il quarto test

52domenica 25 marzo 12

Page 53: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Step 3. Make a little change

• Ups? Little change??? We need two changes

• An implementation of Receipt

• Implementing the buy method

• Small steps? What are my options?

• The old way: Do both in one go!

• Fix receipt first, buy next...

• Fix buy first, implement receipt later...

53domenica 25 marzo 12

Page 54: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Che cosa facciamo?

A) Do both in one go!

B) Fix receipt first, buy next...

C) Fix buy first, implement receipt later...

Votiamo :-)

54domenica 25 marzo 12

Page 55: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Analisi

• Small steps: B or C

• Fix receipt first, buy next...

• Perdo il focus!!!

• Complete buy first – do receipt next

• Ma come faccio senza avere una Receipt?

55domenica 25 marzo 12

Page 56: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Suspence ...

56domenica 25 marzo 12

Page 57: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Fake it!Restituiamo un oggetto “finto”

57domenica 25 marzo 12

Page 58: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Quinto test: Receipt

58domenica 25 marzo 12

Page 59: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Sesto test: Buy (vero)

59domenica 25 marzo 12

Page 60: Tecnologia e Applicazioni Internet 2011/12matteo.vaccari.name/tai/slides2012/2012-tai-lezione-00.pdf · Tabella di casi di test • Unit under test • Input values • Expected output

Problema: 100 cent comprano 40 minuti

• But how to enter 100 cent?

• add 5, add 5, add 5, add 10, add ...

• for ( int i = 0; i <= 20; i++ ) { add 5; }

• private method add2Quarters()

60domenica 25 marzo 12