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 test @Test 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)); } @Test 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)); } @Test 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, egentlig) @Test 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)); } @Test 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)); } @Test 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 ”111111111” 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 ”11111111”

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 ”111111111” 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 ”11111111”

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: Repository @Test 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 © Steria @Test 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: Repository @Test 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: Repository @Test 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: Websider @Test 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: Websider @Test 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 tester @Test 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 tester @Test 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 histogram @Test public void simpleCategoriesShouldBeSumOfMatchingDice() {... } @Test public void smallStrait() {... } @Test public void largeStrait() {... } @Test public void threeOfAKind() {... }

50 © Steria JUnit eksempel #1: Yatzy histogram @Test 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 histogram @Test 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 histogram @Test 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() { @Override public int calculate(int[] histogram) { for (int i=0; i<histogram.length; i++) { if (histogram[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