# Java Junit Test Case



## blueman189 (26. Sep 2018)

Hallo habe folgende Aufgabe programmiert: 

Frage ist jetzt wie ich mit meinem Code jetzt einen JunitTestCase machen kann? Bitte kann mir einer helfen. Ich sitzt hier schon ewig daran und kapier nicht wie ich das am besten als Test machen kann. Mein Code der getestet werden soll mit JunitTestcase in eclipse:

```
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

public class TestatProg3{
   
    public double ertragBraeburn = 0;
    public double ertragPinkLady =0;
    public double avgBraeburn =0;
    public double avgPinkLady =0;
    private ArrayList<ApfelsorteZelle> AppleData = new ArrayList<ApfelsorteZelle>();
           
    public TestatProg3() {       
        try {
            BufferedReader FileReader = new BufferedReader(new FileReader("D:\\Testat\\testat.csv"));
               
            String zeile = "";
            String[] ZeileEins = FileReader.readLine().split(";");
                   
            boolean richtigerSyntax = prüfeKorrekteSyntax(ZeileEins);
            while (null != (zeile = FileReader.readLine()) && richtigerSyntax) 
            {
                String[] actualRow = zeile.split(";");
                if(!searchCellWithVariety(actualRow))                 //Zellensuche nach sorte
                {
                addNewVariety(actualRow);                            //neue Sorte wird hinzugefügt
                }
            }
                   
            int counter = 0;
            while(AppleData.size() > counter) 
            {
                AppleData.get(counter).berechneDurchschnittsertragInDenErsten10JahrenProBaumProSorte();
                AppleData.get(counter).berechneDurchschnittsgesamtertragProBaumProSorte();
                if(counter == 0) 
            {
                           
                ertragBraeburn=AppleData.get(counter).getGesamtertrag();
                avgBraeburn = AppleData.get(counter).getErtragInDenErsten10Jahren();
                avgBraeburn = Math.round(100.0*avgBraeburn)/100.0;
                ertragBraeburn=Math.round(100.0*ertragBraeburn)/100.0;           
                }
            else if(counter == 1)
            {
                ertragPinkLady=AppleData.get(counter).getGesamtertrag();
                avgPinkLady =AppleData.get(counter).getErtragInDenErsten10Jahren();
                avgPinkLady = Math.round(100.0*avgPinkLady)/100.0;
                ertragPinkLady =Math.round(100.0*ertragPinkLady)/100.0;
            }else 
                {
                System.out.println("");
                }
                counter++;
                }
                   
                }
                catch (FileNotFoundException e) 
                {
                    e.printStackTrace();
                } 
                catch (IOException e) 
                {
                    e.printStackTrace();
                }
       
       
        String HtmlTabellenHeader="<h1><i> Informatik III </i></h1><p><u><b>Testat:</b></u> Programmieren III </p>"        //website
                        + "<table border = 2>"
                        + "<tr>"
                        +     "<th>Apfelsorte</th>"
                        +     "<th>Gesamtertrag</th> "
                        +     "<th> Erträge pro Sorte in erste 10 Jahre</th> "
                        + "</tr> "
                        + "<tr> "
                        + "<td>Braeburn </td><td>";
               
                String BraeburnErtrag="</td>"
                        + "<td>";
           
                String BraeburnDurchschnitt="</td></tr><tr>"
                        + " <td>Pink Lady </td> <td>";
                String ErtragPinkLady = "</td><td>";
                String DurchschnittPinkLady = "</td> </tr> </table>";               
               
                File f = new File ("D:\\Testat\\testat.html");
               
                try 
                {
                    BufferedWriter b = new BufferedWriter (new FileWriter (f));
                    b.write(HtmlTabellenHeader);
                    b.write (Double.toString(ertragBraeburn));
                    b.write(BraeburnErtrag);
                    b.write(Double.toString(avgBraeburn));
                    b.write(BraeburnDurchschnitt);
                    b.write(Double.toString(ertragPinkLady));
                    b.write(ErtragPinkLady);
                    b.write(Double.toString(avgPinkLady));
                    b.write(DurchschnittPinkLady);
                    b.close ();                            //schließen BufferedWriter
                } 
                catch (IOException e) 
                {
                    e.printStackTrace();
                }
               
                System.out.println(ertragBraeburn);
                System.out.println(ertragPinkLady);
                System.out.println(avgBraeburn);
                System.out.println(avgPinkLady);
               
            }
           
    private void addNewVariety(String[] actualRow) 
        {
            ApfelsorteZelle neueApfelsorte = new ApfelsorteZelle(actualRow[0], Integer.parseInt(actualRow[1]),
            Integer.parseInt(actualRow[2]), Integer.parseInt(actualRow[3]));
            AppleData.add(neueApfelsorte);       
        }


    private boolean prüfeKorrekteSyntax(String[] ersteZeile) 
        {
            if(!ersteZeile[0].equals("Sorte") || !ersteZeile[1].equals("Anzahl") || !ersteZeile[2].equals("Alter")
                || !ersteZeile[3].equals("Gesamtertrag")) {
            System.out.println("Diese Datei hat falschen Syntax.");
            return false;
        }
        return true;
               
        }


    private boolean searchCellWithVariety(String[] actualRow) 
        {
            boolean bereitsVerarbeitet = false;
            int nZelle = 0;
            while(!bereitsVerarbeitet && !AppleData.isEmpty() && AppleData.size() > nZelle) {
               
                if(AppleData.get(nZelle).getName().equals(actualRow[0])) {
                   
                addRow(AppleData.get(nZelle), actualRow);
                bereitsVerarbeitet = true;
            return true;
                                                                            }
            nZelle++;
            }
                return false;
            }

    private void addRow(ApfelsorteZelle apfelsorteZelle, String[] actualRow) 
    {
        apfelsorteZelle.fügeZuGesamtertragHinzu(
                Integer.parseInt(actualRow[3]), Integer.parseInt(actualRow[1]));
               
        apfelsorteZelle.fügeZuErtragInDenErsten10JahrenHinzu(
                Integer.parseInt(actualRow[3]), Integer.parseInt(actualRow[1]),
                Integer.parseInt(actualRow[2]));       
    }

    public class ApfelsorteZelle             //Klasse für eigene Arraylsit --> WErte voneinandergetrennt gespeichert
    {   
        int anzahlTeiler = 0;       
        private String name;
        private double gesamtertrag = 0;
        private double ertragInDenErsten10Jahren;
               
        public ApfelsorteZelle(String name, int anzahlBäume, int alter, double gesamtertrag) 
        {
            this.name = name;
            fügeZuGesamtertragHinzu(gesamtertrag, anzahlBäume);
            fügeZuErtragInDenErsten10JahrenHinzu(gesamtertrag, anzahlBäume, alter);
        }
               
        public String getName() 
        {
            return name;
        }
               
        public double getGesamtertrag() 
        {
            return gesamtertrag;
        }
               
        public double getErtragInDenErsten10Jahren() 
        {
            return ertragInDenErsten10Jahren;
        }
               
        public void fügeZuGesamtertragHinzu(double zahl, int anzahlBäume) 
        {
            gesamtertrag = gesamtertrag + zahl / anzahlBäume;
            anzahlTeiler++;
        }
               
        public void fügeZuErtragInDenErsten10JahrenHinzu(double zahl, int anzahlBäume, int alter) 
        {
            if(alter < 10) {
                ertragInDenErsten10Jahren = ertragInDenErsten10Jahren + zahl / anzahlBäume;
            } else {
                ertragInDenErsten10Jahren = ertragInDenErsten10Jahren + zahl / anzahlBäume / alter * 10;
            }
        }
               
        public void berechneDurchschnittsgesamtertragProBaumProSorte() 
        {
            gesamtertrag = gesamtertrag / anzahlTeiler;
        }
               
        public void berechneDurchschnittsertragInDenErsten10JahrenProBaumProSorte() 
        {
            ertragInDenErsten10Jahren = ertragInDenErsten10Jahren / anzahlTeiler;
        }
           
       
    }   
}
```


----------



## mihe7 (26. Sep 2018)

Du musst Deinen Code erstmal testbar machen. Wenn Du alles im Konstruktor machst und auch noch eine bestimmte Datei lädst, wie soll das getestet werden?


----------



## blueman189 (26. Sep 2018)

Wie mach ich das?
Also für Junite erstma eine neue klasse erstellen mit namen test hinten dran, aber weiter weiß ich leider nicht, bin anfänger


----------



## mihe7 (26. Sep 2018)

Ich rede nicht von JUnit, sondern von Deinem Code  

Tests zu programmieren ist im Prinzip sehr einfach: man führt einfach die entsprechende Funktion durch und vergleicht das tatsächliche mit dem erwarteten Ergebnis. JUnit unterstützt den Entwickler dabei.

Damit man Code anständig testen kann, muss er aber so geschrieben sein, dass er testbar ist. Guter Code ist Code, der leicht testbar ist. 

Aktuell ist es so, dass Deine Klasse zu viel macht. Der Code nimmt aus einer bestimmten Datei die Daten, verarbeitet diese und schreibt sie in eine Datei. Du kannst also keine Einzelteile des Codes testen. Vielmehr müsstest Du hergehen und in Deinem Test die Eingabedatei schreiben, dann Deine Funktion aufrufen und die Ausgabedatei mit dem erwarteten String vergleichen. Das ist nicht das, was man normalerweise möchte.

Bzgl. Eclipse kann ich Dir nicht helfen, aber da gibt es genug Material (z. B. https://www.youtube.com/watch?v=pV-12xPt7jg).


----------



## AndiE (26. Sep 2018)

Du musst Testfälle erstellen:
1. Kann das Programm auch (zusätzliche) Sorten wie "Jonagold", "Boskop" usw. verarbeiten oder Änderungen der Sorten?

2. Rechnet das Programm richtig?: Du musst hierzu Dummy-Sammlungen anlegen.

2a) Stimmt die Anzahl der Bäume einer Sorte, die weniger als 10 Jahre alt sind? 
2b)Stimmt der errechnete Gesamt-Ertrag je Sorte ? 
2c)Gibt das Programm den richtigen Durchschnitt je Sorte aus?

3. Fehlertests: 
3a) Kann das Programm negative Werte ausschließen(Ertrag ist -10)? Gibt es dann Fehler aus?
3b) Findet das Programm Fehler, wenn nicht alle Daten je Zeile eingegeben werden? 
3c) Was ist, wenn zuviel Daten je Zeile eingegeben werden?


----------



## MoxxiManagarm (27. Sep 2018)

Ergänzung zu den Fehlertests:
- I/O Fehler (Leseschutz auf csv, Datei nicht vorhanden...)
- Semantikfehler csv (vorhandene oder nicht vorhandene Spaltennamen, Encoding, Trennzeichen...)
- Eingabe von nicht numerisch parsebaren Werten

Weitere Hinweise:
- Bitte vermeide Umlaute in Benennungen (z.B. prüfeKorrekteSyntax, anzahlBäume)
- searchCellWithVariety ist besser mit einer for-Schleife darstellbar, ähnliche while-Schleifen hast du z.B. auch im Konstruktor.


----------



## blueman189 (27. Sep 2018)

Danke für eure Hilfe, werde jetzt damit anfangen


----------

