Laste ned presentasjonen
Presentasjon lastes. Vennligst vent
PublisertJoakim Ødegård Endret for 9 år siden
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
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
Liknende presentasjoner
© 2024 SlidePlayer.no Inc.
All rights reserved.