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

Slides:



Advertisements
Liknende presentasjoner
Hans Olav Norheim
Advertisements

TDD over BDD why and how XP meetup Johannes Brodwall, Programming artist Steria Norway.
Høgskolen i Oslo Webprogrammering SQL og databaser del 3.
Jara NetBusiness Vedlikeholdsrelease , 11. februar 2008.
Java Teknologi Teknikker Økosystem Johannes Brodwall
Organization and board
Hvordan uttrykke krav som tester Og omvendt Johannes Brodwall.
Ledelsesinformasjonsystem
Universell utforming Kirsten Ribu HiO Evaluering av datasystemer Analyse av systemegenskaper Kirsten Ribu
 Galls lov og erstatningsprosjekter Johannes Brodwall Chief scientist, Steria.
Unit testing Gruppe 2: Kjartan Haugen Jon Gunnar Bjørkmo
Testene koster mer enn de smaker? Ole Morten Amundsen
Om smidig brukerkommunikasjon Smidig 2011 Johannes Brodwall Steria Norway.
Objektorientert programmering i PHP del 2
Java 14 Et eksempel fra bioinformatikk: analyse av biologiske sekvenser Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet.
Title of presentation Customer/user group/conference Johannes Brodwall, Chief scientist Exilesoft Global.
Tema: Introduksjon Hvorfor Velocity? Installasjon Velocity VS. JSF / JSP Eksempler Oppsumering.
C# for javaprogrammerere
Kvalitetssikring av analyser til forskningsbruk
Web-applikasjoner Prosjekt3 Logging Gruppe 9 Malik Muhammad Naeem Kevan Qureshi.
Introduksjon til Java 5.0. Hva er nytt i 5.0? Generiske typer For-løkke med iterator (for-hver løkke) Automatisk innpakking av primitive typer Metadata.
SQLHiA Transaksjoner. SQLHiA TransaksjonDefinisjon En transaksjon er en serie av en eller flere SQL-statement som til sammen danner en logisk enhet. Med.
  © Steria FitNesse som nyttig verktøy Smidig FitNesse som nyttig verktøy Anders Vindvad.
Men hva mener de som har klart det? Børge Haugset (NTNU&SINTEF)
Når ble pragmatisk slukt av Smidig ? Joachim Haagen Skeie, Smidig 2011.
Design Patterns Iterator & Mediator. Gruppe 8 Presentasjonsgruppe:Resten av gruppen: Marianne AtesAndrè Johansen Tom Vidar LundeHege-Kristin Johansen.
1 Information search for the research protocol in IIC/IID Medical Library, 2013.
Smidig-workshop for Agresso
  © Steria Hvordan bli en bedre utvikler? Johannes Brodwall, Chief scientist, Steria Cicero 23. juni, 2010.
  © Steria Å Lytte til koden Johannes Brodwall, Chief scientist, Steria Iterate 21. mai, 2010.
PUS iterasjon 0 Johannes Brodwall Statens Landbruksforvaltning
Tema: Test First Positivist: Det som ikke kan måles, eksisterer ikke! Reduserer sjanser for defekter! Gir en oppdatert ”TODO-liste” Gir trygghet til å.
Scrum APressen Johannes Brodwall, Sjefsarkitekt Steria Norway.
Produkeierrollen i Scrum
Triggere Mutasjoner i basen. Triggers Triggers are stored procedures that execute automatically when something (event) happens in the database: : data.
Instead-of-trigger Faglig forum. Instead-of-trigger Problem: En har et VIEW som består av mange JOINs. Komplekst å oppdatere alle tabellene som inngår.
  Den perfekte julegaven til Javakoden din Johannes Brodwall Steria.
Eksempel på SQL ”SQL-setninger” har en struktur som likner på ”naturlig språk”, med ”verb, subjekter og adjektiver”. SQL-setningene begynner alltid med.
Hvordan lage seg en wikispaces Gå til bestem deg for hvilket wikispaces du vil ha (public, protected, private).
1 Kap 06 Ordnede / Sorterte lister Oppgave nr 06_02 Polynomer Klassehierarki Javadokumentasjon.
Å lese tall fra en fil, klassen Scanner 1.Et Scanner-objekt kan knyttes til et strømobjekt eller til en streng. 2.Kan skanne teksten etter data av ulike.
Kontinuerlig kvalitetskontroll. Hvordan komme helt i mål.
Planning and controlling a project Content: Results from Reflection for action The project settings and objectives Project Management Project Planning.
1 Java Database Connectivity (JDBC) Norvald H. Ryeng
INF1000 (Uke 14) Resten av eksamen H03 + del av V05 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Anja B.
A PROJECT WEEK 45: INTRO+ RESEARCH AND PLANNING WEEK 46: RESEARCH AND WIKI WRITING WEEK 47: NO ENGLISH WEEK 48: FINISHING TOUCHES WEEK 49: ORAL PRESENTATIONS.
Object  Klassen i java  Alle klasser arver fra denne om ikke noe annet blir spesifisert  ArrayList.add(Object instans)  Alle elementer formes til Object.
INF1000 (Uke 14) Eksamen V06 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Arild Waaler.
Mobilitet og organisatorisk endring Tom Erik Julsrud *Telenor Research & Development/University of Trondheim
Gruppeøving 8.mars Agenda Presentasjon av hjemmeoppgaver Endelig gruppeinndeling Elevator pitch Neste hjemmeoppgave.
Upload av bildefiler Utdrag fra ImageIn Ved Kirsten Klæbo Tirsdag 25/11-03.
Section 5.4 Sum and Difference Formulas These formulas will be given to you on the test.
Inf1000 (Uke 10) HashMap og ArrayList
Inf1000 (Uke 5) Arrayer, filer og tekst
Primary French Presentation 10 Colours L.I. C’est de quelle couleur?
Important to remember - Some grammar. The Noen steder har norsk bestemt artikkel mens engelsk ikke har the: – Abstrakte ord med generell betydning (love,
Activity og Intents Activity Intent
Digital bestillingsprosess for Armering, direkte fra modell
MikS WP1/WP2 Planned work from SINTEF.
Title: «How to use different tools and/or machines in the workshop»
Eksempel fra Nevrologisk avdeling
Dette er et eksempel på plassering av logoene.
Visning 2) Sett inn 3) Sett inn BILDE Bruk verktøylinja og gå til:
CAMPAIGNING From vision to action.
Hva er XP ? Ikke ekstrem, men heller meget forsiktig
Godt grep – presentasjon
Titteloppsett Undertittel.
Course PEF3006 Process Control Fall 2018 Split-range control
Course PEF3006 Process Control Fall 2017 Split-range control
ALL vectors have two components (x and y)
Utskrift av presentasjonen:

Hva var egentlig spørsmålet? Johannes Brodwall

FitNesse eksempel #1

© 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)); }

© 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)); }

© 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?

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

Hva er krav?

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

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

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

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

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

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

Eksempel: Signering

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

© 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

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

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

© Steria

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

© Steria FitNesse eksempel #1

© Steria FitNesse eksempel #1

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

Et faktisk eksempel til

© 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 ” ”

© 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 ” ”

Eksempel: Yatzy

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

© Steria

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

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

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

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

© Steria

Utviklers tester

Gjenspeiler funksjonelle tester

HUSKELAPP TIL JOHANNES: GÅ TIL ECLIPSE NÅ

Gode enhetstester er også krav

© 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()); }

© 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

© 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())); }

© 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

© 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()); }

© 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

© 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()); }

© 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

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

Test først gir godt design

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

© 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)); }

© 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)); }

© 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]);

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

Hvordan gjøre det bra på eksamen

Kjenn fasiten?

Forstå spørsmålet

Andre typer tester

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

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

© Steria

Todo

© 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(); }

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

© 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()); }

Repository design

© Steria Vedlikeholdbarhet