Hvordan uttrykke krav som tester Og omvendt Johannes Brodwall.

Slides:



Advertisements
Liknende presentasjoner
TDD over BDD why and how XP meetup Johannes Brodwall, Programming artist Steria Norway.
Advertisements

DROPS simulator - konspetet •En ny tilnærming til å forhindre DROPS •En interaktive 3D simulering av riggen, som gjør det mulig for brukeren å: - utføre.
Jara NetBusiness Vedlikeholdsrelease , 11. februar 2008.
Organization and board
Régis Laurent Director of Operations, Global Knowledge Competencies include: Gold Learning Silver System Management Touch, flip and fold Håvard Haukeberg.
NUUG.topic = Ruby.new Johannes Brodwall Takk til Dave Thomas for bruk av enkelte slides.
Hva var egentlig spørsmålet? Johannes Brodwall. FitNesse eksempel #1.
Ledelsesinformasjonsystem
Universell utforming Kirsten Ribu HiO Evaluering av datasystemer Analyse av systemegenskaper Kirsten Ribu
Unit testing Gruppe 2: Kjartan Haugen Jon Gunnar Bjørkmo
Testene koster mer enn de smaker? Ole Morten Amundsen
Strategisk og taktisk SOA Fagforbundet/Sykehuspartner Johannes Brodwall, Ikke virksomhetsarkitekt Steria Norway.
Web Client Software Factory Inge StubdalLevel 300 Avanade.
Key takes from the CXPA breakfast meeting 19th of march 2013 Summarized by KOBRA – Full text from Post It notes available in notes 1.
Gitte Holten Ingerslev - DPU Tekst Forskerens og didaktikerens blik på mødet mellem tekst og læser.
Det tar år å innføre smidige metoder i store organisasjoner… english inside™ Smidig
Norwegian national governance of archetypes
Det er ganske underlig med disse sentrale salmene. Selv om du ikke er religiøs burde du lese dette.
Designing the User Interface (Antall brukere == Antall meninger)
Making a Home Page. Why a Web Page? Easier to submit labs electronically (lack of color printers at university); Easier to submit labs electronically.
C# for javaprogrammerere
Hjelp, vi har algdat! En liten kickstart på TDT4120 Algoritmer og datastrukturer Åsmund Eldhuset.
Forum Produktutvikling og Design Temadag om Mekatronikk og produktutvikling Johan Rusaanes FMC Kongsberg Subsea.
Konseptuell modell Hvordan skal dette se ut ifra brukeren?
Kap 05 Abstrakte datastrukturer. Arv - Implementering Interface / Abstrakte klasser / Konkrete klasser Concrete classAbstract class Interface extends.
Men hva mener de som har klart det? Børge Haugset (NTNU&SINTEF)
1 Information search for the research protocol in IIC/IID Medical Library, 2013.
Copyright © 2003 Systek J2EE Arkitektur Java Workshop CBA Johannes Brodwall, Systek as.
WHY WE’RE STRENGTHENING ROTARY. OBJECTIVES  Clarify what Rotary stands for, how it’s different and why people should care  Elevate awareness and understanding.
ADA 95 – del3 Foreleser: Olaf Hallan Graven Bok: Programming in ADA95 (2nd) John Barnes.
Produkeierrollen i Scrum
Criteria Når og hvorfor bruke Criteria i Hibernate.
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.
Forskningsetikk og premiering av deltakere i forskning: Hva sier NESHs retningslinjer og hvilke forskningsetiske spørsmål reises? Bergen, 27, februar 2009.
Økonomiske forutsetninger Gullfaks landsbyen 2007.
OOT Seminar H-97 CORBA Praktisk del. Valg av ORB implementasjon n Har valgt å bruke Visigenic sin ORB implementsjon n ORB’en er 100% Java kodet n Bygger.
Trondheim 6. mars 2014 Mørke skyer i horisonten?.
Faktorer som innvirker på interne prosesser og ”effektivitet” i internasjonalt spredte team Hvilken innvirkning har følgende forhold på interne prosesser.
Database tilgang Opret forbindelse til din Ms SQL database inde i Visual Studio fra Server Explorer vinduet.
Løsningsforslag til MOFScript oppgave. Metamodellen.
02 - Java datatyper Grundlæggende om datatyper og variable.
C O M M E N T O R A / S Commentor A/S – Hørkær 24 – 2730 Herlev - Tel : (+45) Fax : (+45) Team System VSS user guide to TFVC.
1 | 2010 Internetteknologi 2 (ITNET2) Kort teknisk ASP.NET introduktion Mandag den 4/ Jesper Tørresø.
Project Fusion The power of combining resources. L y s b i l d e u t f o r m i n g : ” M / L O G O ” // V e l g b l a n t m a n g e l y s b i l d e o.
Publisering i åpne kanaler Anne Storset Institutt for mattrygghet og Infeksjonsbiologi.
Gruppeøving 15.mars Agenda Pitching med evaluering og diskusjon: Er forretningsideene klare? Gruppearbeid og diskusjon – tema åpent Neste hjemmeoppgave.
GPS simulator Et C# program som sender data fra en GPS fil til RS232 og simulerer en GPS engine. Tre linjer pr. sekund er satt opp.
Problem set 2 By Thomas and Lars PS: Choose the environment, choose many pages per sheet. Problem set 2 Exercise 11/29 Laget av: Thomas Aanensen og Lars.
Planning and controlling a project Content: Results from Reflection for action The project settings and objectives Project Management Project Planning.
Engelsk mal: Startside The Ageing Society – current situation, challenges and opportunities Steinar Barstad Warszawa 25th November 2014 Specialist Director.
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.
Section 5.4 Sum and Difference Formulas These formulas will be given to you on the test.
Primary French Presentation 10 Colours L.I. C’est de quelle couleur?
MikS WP1/WP2 Planned work from SINTEF.
Eksempel fra Nevrologisk avdeling
Dette er et eksempel på plassering av logoene.
CAMPAIGNING From vision to action.
Hva er XP ? Ikke ekstrem, men heller meget forsiktig
The Gains from International Trade
Kick-off Good morning everybody. Nice to see so many well known faces on a big day like this. My name is Audun Pettersen and I`m Head of Tourism.
Course PEF3006 Process Control Fall 2018 Split-range control
Course PEF3006 Process Control Fall 2017 Split-range control
LO2 – Understand Computer Software
1.4 Relations & Functions.
Database.
(You can delete these instructions before sharing with students.)
Utskrift av presentasjonen:

Hvordan uttrykke krav som tester Og omvendt Johannes Brodwall

FitNesse eksempel #1

© Steria | 29/06/2014Presentation titlep4 © Steria Agenda (skjult) Vekker: Hvorfor oppfører folk seg rart under fullmåne? Appertiff: Eksempel – test av signering V-modellen: Krav og testing Fra V til I Kostnaden av overleveringer Utviklers tester skaper design Utviklers tester uttrykkes som krav En testers mindset

© Steria | 29/06/2014Presentation titlep5 © Steria

| 29/06/2014Presentation titlep6 © Steria Krav Akseptanse Design Enhetstest Kode

© Steria | 29/06/2014Presentation titlep7 © Steria Krav Akseptanse Design Enhetstest Kode

© Steria | 29/06/2014Presentation titlep8 © Steria Krav Akseptanse

Hva er krav?

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

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

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

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

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

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

Hvorfor tester vi?

© Steria | 29/06/2014Presentation titlep17 © Steria Redde dårlig produkt?

© Steria | 29/06/2014Presentation titlep18 © Steria Finne feil?

© Steria | 29/06/2014Presentation titlep19 © Steria Kontrollere kvalitet?

© Steria | 29/06/2014Presentation titlep20 © Steria Skape tillit?

© Steria | 29/06/2014Presentation titlep21 © Steria Definere kvalitet.

© Steria | 29/06/2014Presentation titlep22 © Steria Krav Akseptanse Design Enhetstest Kode

Testers rolle

Eksempel: Signering

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

© Steria | 29/06/2014Presentation titlep26 © 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 titlep27 © Steria Utvikler Produkteier Tester Hva med både ok signerte og feilsignerte oppdrag i en fil?

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

© Steria | 29/06/2014Presentation titlep29 © 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 titlep32 © Steria Utvikler Produkteier Tester Gitt at.... Når.... Så... Cucumber (rspec)

Eksempel: Yatzy

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

© Steria

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

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

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

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

© Steria

Utviklers tester

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

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

© Steria Vedlikeholdbarhet

Andre typer tester

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

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

© Steria

Hvordan gjøre det bra på eksamen

© Steria | 29/06/2014Presentation titlep68 © Steria Krav Akseptanse Design Enhetstest Kode

Start med fasiten