Øvingsoppgave i testprogrammering

Thomas Flemming, USIT

 

Formålet med øvingsoppgavene i testprogrammering er å få en smaksprøve på hvordan automatiserte tester kan brukes til å designe systemet før man implementerer det, refaktorisere eksisterende kode og debugge kode.

 

Teknisk

Før man kan begynne på oppgavene må man sjekke at man får kompilert koden og kjørt testene. Det forutsetter at man har jdk 1.4.

 

CVS

Alle filene ligger tilgjengelig i cvs under w3/sandbox/kino_oppgave

 

Eclipse

Eclipse brukere kan bygge prosjektet og kjøre testene fra eclipse.

 

1.      Fra kommandolinjen gå til folderne kino_oppgave

2.      Skriv ’maven eclipse’

3.      I Eclipse høyreklikk på prosjektet og velg ’refresh’

 

For å kjøre testene gå inn på rullgardinmenyen ’Run’->’run…’ Klikk på JUnit og knappen ’new’. Velg ’run all tests…’  For å kjøre testene om igjen trykk control F11.

 

Emacs

Prosjektet må bygges med maven og testene må kjøres fra kommandolinjen. For å bygge prosjektet:

 

1.      Gå til folderen kino_oppgave

2.      Skriv maven java:compile

3.      Sørg for at Alle testene må kjøres kan kjøres slik fra kommandolinjen:

 

For å kjøre alle testene gå til folderen kino_oppgave/target/ og skriv:

 

C:\cygwin\prosjekter\kino_oppgave\target\classes>java -cp .;../../lib/junit-3.8.1.jar;../../lib/jdom-b8.jar tests.AllTes

ts

..........

Time: 0,211

 

OK (10 tests)

 

 


Eksempel 1

 

Øvingsoppgaven går ut på å lage et system for å kjøpe kinobilletter elektronisk. Det er allerede laget kode som simulerer et kinobillettsystem og en betalingsløsning. Vi ser for oss at vi har fått i oppdrag å lage ulike klienter for web, wap og web services, men backoffice systemet er ikke ferdig utviklet ennå så vi har laget noen klasser for å simulere billettsystemet.

 

Få billettsystemet til å vise filminformasjon på XML format

Vi ønsker å utvide systemet til å skrive ut informasjon om en film på xml format:

 

kino_oppgave\target\classes>java kino_klient.XMLFilmInfo xmlInfo 1

<?xml version="1.0" standalone="yes" ?>

   <film>

      <navn>Somethings gotta give</navn>

      <id>1</id>

   </film>

 

 

Billettsystemet har allerede en metode for å hente en film. Testen ser slik ut:

 

    public void testgetFilm() {

        BillettSystem billettSystem = new BillettSystem();

        Film film = billettSystem.getFilm(1);

        assertEquals("Somethings gotta give", film.getName());

        film = billettSystem.getFilm(1);

        assertEquals(null, film);

    }

 

I stedet for å designe systemet eller lage UML diagrammer begynner vi med å lage en test før vi skriver selve koden.

 

    public void testFilmXMLOutput(){

        BillettSystem billettSystem = new BillettSystem();

        Film film = billettSystem.getFilm(1);

        String filmInfo = film.getInfoXML();

        assertTrue(!filmInfo.equals(""));

    }

 


Vi får feilmeldinger fordi metoden film.getInfoXML()ikke finnes, så vi lager et tomt skjellet.

 

    public String getInfoXML() {

        return “ ”;

    }

 

Vi kjører testen som passerer, og utvider systemet med flere assert linjer for å få testet at det virkelig er xml som returneres og at den inneholder elementene den skal. Etter mange steg kan man ende opp med disse testene:

 

    public void testFilmXMLOutput() throws JDOMException {

        BillettSystem billettSystem = new BillettSystem();

        Film film = billettSystem.getFilm(1);

        String filmInfo = film.getInfoXML();

        Element root = parseXmlString(filmInfo);

        String navn = root.getChildText("navn");

        assertEquals("Somethings gotta give", navn );

    }

 

    private static Element parseXmlString(String xml) throws JDOMException{

        StringReader stream = new StringReader(xml);

        InputSource is = new InputSource(stream);

        DocumentBuilderFactory factory=

                       DocumentBuilderFactory.newInstance();

        Element root = null;

        Document doc;

        SAXBuilder builder = new SAXBuilder();

        doc = builder.build(is);

        root = doc.getRootElement();

        return root;

    }

 

For å få testet koden ble det laget en metode parseXmlString(String xml). Selve koden som testes ser slik ut:

 

    public String getInfoXMLformat() {

        String xml = "<?xml version=\"1.0\" standalone=\"yes\" ?>\n"

                  + "<kino>\n" 

                  + "  <navn>" + name + "</navn>\n"

                + "  <id>" + id + "</id>\n"

                + "</kino>\n";

        return xml;

    }

 


Koden som gjør det mulig å kjøre koden fra kommandolinjen tester vi ikke her, men den kan også testes ved hjelp av mockobjects pakken som har en printwriter som ikke skriver til skjerm, men lagrer inneholdet i ram.

 

package kino_klient;

import java.util.*;

import billettsystem.*;

 

public class FilmInfo {

 

      BillettSystem billettSystem;

     

      public FilmInfo(){

            billettSystem = new BillettSystem();

      }

     

      public static void main(String[] args) {

        BillettSystem billett = new BillettSystem();

        if (args.length > 0) {

            if (args[0].equals("xmlInfo")) {

                BillettSystem billettSystem = new BillettSystem();

                int filmId = atoi(args[1]);

                Film film = billettSystem.getFilm(filmId);

                System.out.println(film.getInfoXML());

            }

...

           

Oppgave 1: Vise kino informasjon på XML format

Gjør det samme som oppgaven over, men for kinoer.

 

Oppgave 2: Kjøp av  kinobillett

 

Fra kommandolinjen skal man kunne kjøpe 2 billetter til ”Ringenes herre: Atter en konge” slik:

           

                >java oppgave2.kjoepBillett 1 2 Visa 4925161411111111 05/05 

Betaling ok.

Film: Somethings gotta give

Kino: Klingenberg

Ant.: 2

Ha en hyggelig kinotur!

 

                >java oppgave2.kjoepBillett 1 2 Visa 4925161411111111 05/05 

Betaling ok.

Feil antall parametere.

 

Bruk:

kjoepBillett forestillingsnummer antall Visa|Mastercard kortnummer korttype

 

                >java oppgave2.kjoepBillett 1 2 Visa 49251_UGYLDIG 05/05 

Ugyldig kort

 

For å løse oppgaven se på testene i TestOppgave2(). Den inneholder tester som er kommentert ut, men som bør virke. Det er laget en mockup av oppgave2 i oppgave2/KjoepBillett.java som man kan ta utgangspunkt i.