Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Hva var egentlig spørsmålet? Johannes Brodwall. FitNesse eksempel #1.

Liknende presentasjoner


Presentasjon om: "Hva var egentlig spørsmålet? Johannes Brodwall. FitNesse eksempel #1."— Utskrift av presentasjonen:

1 Hva var egentlig spørsmålet? Johannes Brodwall

2 FitNesse eksempel #1

3 © Steria En public void femereSkalGiAntall() throws Exception { assertEquals(0, scoreForKast("femere", 1, 2, 2, 2, 1)); assertEquals(10, scoreForKast("femere", 1, 2, 5, 5, 1)); assertEquals(15, scoreForKast("femere", 5, 2, 5, 5, 1)); public void seksereSkalGiAntall() throws Exception { assertEquals(0, scoreForKast("seksere", 1, 2, 2, 2, 1)); assertEquals(12, scoreForKast("seksere", 1, 2, 6, 6, 1)); assertEquals(18, scoreForKast("seksere", 6, 2, 6, 6, 1)); public void fulltHus() throws Exception { assertEquals(0, scoreForKast("fullt_hus", 1, 2, 3, 4, 5)); assertEquals(11, scoreForKast("fullt_hus", 1, 3, 3, 1, 3)); assertEquals(28, scoreForKast("fullt_hus", 5, 6, 6, 5, 6)); }

4 © Steria En test (vel... tre, public void femereSkalGiAntall() throws Exception { assertEquals(0, scoreForKast("femere", 1, 2, 2, 2, 1)); assertEquals(10, scoreForKast("femere", 1, 2, 5, 5, 1)); assertEquals(15, scoreForKast("femere", 5, 2, 5, 5, 1)); public void seksereSkalGiAntall() throws Exception { assertEquals(0, scoreForKast("seksere", 1, 2, 2, 2, 1)); assertEquals(12, scoreForKast("seksere", 1, 2, 6, 6, 1)); assertEquals(18, scoreForKast("seksere", 6, 2, 6, 6, 1)); public void fulltHus() throws Exception { assertEquals(0, scoreForKast("fullt_hus", 1, 2, 3, 4, 5)); assertEquals(11, scoreForKast("fullt_hus", 1, 3, 3, 1, 3)); assertEquals(28, scoreForKast("fullt_hus", 5, 6, 6, 5, 6)); }

5 © Steria | 29/06/2014Presentation titlep5 © Steria Agenda (skjult) Vekker: Hvorfor oppfører folk seg rart under fullmåne? Appertiff: Eksempel – test av yatzy poenggiving Bakgrunn: Johannes fra Steria. Nedgangstid? Ingen endringer. Søkt om sommerjobb? Svar i mars. Ønsketenking Hvilke foredeler har vi ved å skrive en test først `Hvilke fordeler har vi ved å beskrive besvarelsen først Agenda Krav som test TDD – demo Yatzy: Har énere, toere, treere. Trenger par, hus Konklusjon: Hvordan gjøre det bra på eksamen?

6 Hva var egentlig spørsmålet? Johannes Brodwall Chief Scientist, Steria

7 Hva er krav?

8 © Steria | 29/06/2014Presentation titlep8 © Steria ”Hvorfor skal kunden ha noe løst?”

9 © Steria | 29/06/2014Presentation titlep9 © Steria Behovsforståelse

10 © Steria | 29/06/2014Presentation titlep10 © Steria ”Hva skal løse når?”

11 © Steria | 29/06/2014Presentation titlep11 © Steria Planlegging

12 © Steria | 29/06/2014Presentation titlep12 © Steria ”Hvordan skal systemet løse hver enkelt krav?”

13 © Steria | 29/06/2014Presentation titlep13 © Steria Kravspesifikasjon

14 Eksempel: Signering

15 © Steria | 29/06/2014Presentation titlep15 © Steria Utvikler Produkteier Tester

16 © Steria | 29/06/2014Presentation titlep16 © Steria Utvikler Produkteier Tester Som en betaler, Ønsker jeg å signere mine oppdrag, Slik at ingen kan utgi seg for å være meg

17 © Steria | 29/06/2014Presentation titlep17 © Steria Utvikler Produkteier Tester Hva med både ok signerte og feilsignerte oppdrag i en fil?

18 © Steria | 29/06/2014Presentation titlep18 © Steria Utvikler Produkteier Tester Ummm (hjelp?)

19 © Steria

20 | 29/06/2014Presentation titlep20 © Steria Utvikler Produkteier Tester Gitt at en fil med oppdrag 1 og 2 Og oppdrag 1 er korrekt signert Og oppdrag 2 er ikke er korrekt signert Når filen valideres Så skal oppdrag 1 behandles normalt Og kunden skal motta en kvittering med teksten ”oppdrag 2 avvist”

21 © Steria FitNesse eksempel #1

22 © Steria FitNesse eksempel #1

23 © Steria | 29/06/2014Presentation titlep23 © Steria Utvikler Produkteier Tester Gitt at.... Når.... Så... Cucumber (rspec)

24 Et faktisk eksempel til

25 © Steria Fra mitt nåværende prosjekt: ”Ta arbeidsoppgave” Gitt jeg går til arbeidslistebilde ”teamets arbeidsliste” Og jeg velger oppgaven med ”Fødselsnummer” lik ” ” Og jeg trykker på ”Plukk oppgave” Når jeg går til arbeidslistebilde ”min arbeidsliste” Så skal oppgavelisten inneholde 1 oppgave Og oppgavens ”Fødselsnummer” skal være ” ”

26 © Steria Fra mitt nåværende prosjekt: ”Ta arbeidsoppgave” Gitt jeg går til arbeidslistebilde ”teamets arbeidsliste” Og jeg velger oppgaven med ”Fødselsnummer” lik ” ” Og jeg trykker på ”Plukk oppgave” Når jeg går til arbeidslistebilde ”min arbeidsliste” Så skal oppgavelisten inneholde 1 oppgave Og oppgavens ”Fødselsnummer” skal være ” ”

27 Eksempel: Yatzy

28 © Steria | 29/06/2014Presentation titlep28 © Steria Utvikler Produkteier Tester Fullt hus skal gi 25 poeng

29 © Steria

30 | 29/06/2014Presentation titlep30 © Steria Utvikler Produkteier Tester Fullt hus skal gi 25 poeng

31 © Steria | 29/06/2014Presentation titlep31 © Steria Utvikler Produkteier Tester Regnes det som fullt hus om fem dice har samme pipcount

32 © Steria | 29/06/2014Presentation titlep32 © Steria Utvikler Produkteier Tester WTF?!?

33 © Steria | 29/06/2014Presentation titlep33 © Steria Utvikler Produkteier Tester For eksempel fem 4-ere er ikke fullt hus Ok! 

34 © Steria

35 Utviklers tester

36 Gjenspeiler funksjonelle tester

37 HUSKELAPP TIL JOHANNES: GÅ TIL ECLIPSE NÅ

38 Gode enhetstester er også krav

39 © Steria JUnit eksempel #3: public void shouldRetrieveSameInstanceForSameKey() throws Exception { Category inserted = new Category("A"); Serializable id = repository.insert(inserted); repository.flushChanges(); Category retrieved1 = repository.retrieve(Category.class, id); Category retrieved2 = repository.retrieve(Category.class, id); Category retrieved3 = repository.find(Category.class).iterator().next(); retrieved1.setCategoryName("Z"); assertEquals(retrieved1.getCategoryName(), retrieved2.getCategoryName()); assertEquals(retrieved1.getCategoryName(), retrieved3.getCategoryName()); }

40 © public void shouldRetrieveSameInstanceForSameKey() throws Exception { Category inserted = new Category("A"); Serializable id = repository.insert(inserted); repository.flushChanges(); Category retrieved1 = repository.retrieve(Category.class, id); Category retrieved2 = repository.retrieve(Category.class, id); Category retrieved3 = repository.find(Category.class).iterator().next(); retrieved1.setCategoryName("Z"); assertEquals(retrieved1.getCategoryName(), retrieved2.getCategoryName()); assertEquals(retrieved1.getCategoryName(), retrieved3.getCategoryName()); } JUnit eksempel #3: Repository When I change one instance Then the others should be updated, too Given a database with one category Given I retrieve this category several times

41 © Steria JUnit eksempel #3: public void uncommittedInsertsShouldBeInvisibleForOtherThreads() { repository.beginTransaction(); Category category = new Category("A"); repository.insert(category); repository.flushChanges(); assertNull(retrieveInNewThread(Category.class, category.getId())); repository.commit(); assertEquals(category, retrieveInNewThread(Category.class, category.getId())); }

42 © Steria JUnit eksempel #3: public void uncommittedInsertsShouldBeInvisibleForOtherThreads() { repository.beginTransaction(); Category category = new Category("A"); repository.insert(category); repository.flushChanges(); assertNull(retrieveInNewThread(Category.class, category.getId())); repository.commit(); assertEquals(category, retrieveInNewThread(Category.class, category.getId())); } Given I insert a new category while in a transaction When I retrieve the category from another thread Then I should not be able to see it When I commit the transaction When I retrieve the category from another thread Then I should be able to see it

43 © Steria JUnit eksempel #4: public void listProductsPageShouldShowAll() throws Exception { Product product1 = new Product(uniqueName("product"), 12300); Product product2 = new Product(uniqueName("product"), 300); repository.insertAll(product1, product2); repository.flushChanges(); tester.beginAt("/products/"); tester.assertTextInElement("products", product1.getProductName()); tester.assertTextInElement("products", product2.getProductName()); }

44 © Steria JUnit eksempel #4: public void listProductsPageShouldShowAll() throws Exception { Product product1 = new Product(uniqueName("product"), 12300); Product product2 = new Product(uniqueName("product"), 300); repository.insertAll(product1, product2); repository.flushChanges(); tester.beginAt("/products/"); tester.assertTextInElement("products", product1.getProductName()); tester.assertTextInElement("products", product2.getProductName()); } Then I should see both products Given two products with unique names in the database When I go to the /products/ web page

45 © Steria JUnit eksempel #5: Husk negative public void priceMustBeNumeric() throws Exception { String oldName = uniqueName("product"); int oldPrice = 1234; Product product = new Product(oldName, oldPrice); Serializable id = repository.insert(product); repository.flushChanges(); tester.beginAt("/products/" + id + "/edit.html"); tester.setTextField("productName", uniqueName("product")); tester.setTextField("price", "this is not a price!"); tester.submit(); tester.assertMatchInElement("errorExplaination", "[Pp]rice.*numeric"); Product stored = repository.retrieve(Product.class, id); assertEquals(oldPrice, stored.getPrice()); assertEquals(oldName, stored.getProductName()); }

46 © Steria JUnit eksempel #5: Husk negative public void priceMustBeNumeric() throws Exception { String oldName = uniqueName("product"); int oldPrice = 1234; Product product = new Product(oldName, oldPrice); Serializable id = repository.insert(product); repository.flushChanges(); tester.beginAt("/products/" + id + "/edit.html"); tester.setTextField("productName", uniqueName("product")); tester.setTextField("price", "this is not a price!"); tester.submit(); tester.assertMatchInElement("errorExplaination", "[Pp]rice.*numeric"); Product stored = repository.retrieve(Product.class, id); assertEquals(oldPrice, stored.getPrice()); assertEquals(oldName, stored.getProductName()); } Then I should see an error message Given a product in the database When I go to the /products/ /edit web page And I go change the price to a negative value And I press submit And the product should be unchanged in the database

47 © Steria | 29/06/2014Presentation titlep47 © Steria Utvikler Gitt at.... Når.... Så...

48 Test først gir godt design

49 © Steria JUnit eksempel #1: Yatzy public void simpleCategoriesShouldBeSumOfMatchingDice() {... public void smallStrait() {... public void largeStrait() {... public void threeOfAKind() {... }

50 © Steria JUnit eksempel #1: Yatzy public void threeOfAKind() { assertEquals(0, scoreFor("three_of_a_kind", 1, 1, 2, 2, 3)); assertEquals(3, scoreFor("three_of_a_kind", 1, 1, 1, 2, 3)); assertEquals(6, scoreFor("three_of_a_kind", 2, 2, 2, 3, 3)); assertEquals(9, scoreFor("three_of_a_kind", 1, 1, 3, 3, 3)); }

51 © Steria JUnit eksempel #1: Yatzy public void fullHouse() { assertEquals(0, scoreFor("full_house", 1, 1, 2, 2, 3)); assertEquals(0, scoreFor("full_house", 1, 1, 1, 2, 3)); assertEquals(25, scoreFor("full_house", 1, 1, 1, 2, 2)); assertEquals(25, scoreFor("full_house", 1, 1, 2, 2, 2)); assertEquals(25, scoreFor("full_house", 5, 5, 6, 6, 6)); }

52 © Steria JUnit eksempel #1: Yatzy public void histogramShouldReturnFrequencyOfEachDie() { int[] roll = { 1, 1, 2, 3, 4 }; int[] histogram = new ScoreCard().histogram(roll); assertEquals(7, histogram.length); assertEquals(-1, histogram[0]); assertEquals(2, histogram[1]); assertEquals(1, histogram[2]); assertEquals(1, histogram[3]); assertEquals(1, histogram[4]); assertEquals(0, histogram[5]); assertEquals(0, histogram[6]);

53 © Steria JUnit eksempel #1: Yatzy histogram scoreCalculators.put("four_of_a_kind", new ScoreCalculator() public int calculate(int[] histogram) { for (int i=0; i= 4) return i*4; } return 0; } });

54 Hvordan gjøre det bra på eksamen

55 Kjenn fasiten?

56 Forstå spørsmålet

57

58 Andre typer tester

59 © Steria | 29/06/2014Presentation titlep59 © Steria Ron Jeffries Only test what you want to work

60 © Steria | 29/06/2014Presentation titlep60 © Steria Johannes Find the defect where it’s cheapest

61 © Steria

62 Todo

63 © Steria JUnit eksempel #2: Session og transaksjoner public interface Repository { Serializable insert(Object entity); T retrieve(Class entityType, Serializable id); void update(Object entity); Collection find(Class entityType); void delete(Object entity); void flushChanges(); }

64 © Steria JUnit eksempel #2: Session og transaksjoner shouldRetrieveSeparateButEqualsAfterSessionFlush() shouldRetrieveSameInstanceForSameKey() rollbackShouldUndoInsertsDeletesAndUpdates() uncommittedInsertsShouldBeInvisibleForOtherThreads() uncommitedDeletesShouldBeInvisibleForOtherThreads() uncommitedUpdatesShouldBeInvisibleForOtherThreads()

65 © Steria JUnit eksempel #2: Session og transaksjoner public void startSession() { sessionForThread.set( new NestedChangeSet(permanentStore)); } public void beginTransaction() { this.transactionForThread.set( new NestedChangeSet(permanentStore)); getSession().setParent( this.transactionForThread.get()); }

66 Repository design

67 © Steria Vedlikeholdbarhet


Laste ned ppt "Hva var egentlig spørsmålet? Johannes Brodwall. FitNesse eksempel #1."

Liknende presentasjoner


Annonser fra Google