# Testmethode schreiben



## Terence86 (6. Nov 2016)

Aufgabenstellung: 
Schreiben Sie eine Klasse ZeichenkettenTest mit einer Methode testVerkuerze, die keine Argumente annimmt. Sie soll eine Methode verkuerze in einer Klasse Zeichenketten mit unterschiedlichen Eingaben testen und dadurch eventuelle Fehler aufdecken. testVerkuerze gibt die Zeichenkette "richtig" zurück, wenn das Ergebnis der Methode in allen Testfällen der erwartete Wert war, oder sonst für den ersten fehlerhaften Aufruf "falsch: s=|...| n=... erwartet=|...| war=|...|" mit den entsprechenden Wertangaben.

Mein Ansatz/Überlegung:

```
public class ZeichenkettenTest {
    public static void testVerkuerze(String s, int n, String erw) {
        testVerkuerze("Fachhochschule", 3, "Fac[...]ule");
        testVerkuerze("Abrakadabra", 2, "Ab[...]ra");
        testVerkuerze("Hallo", 0, "Hallo");
        testVerkuerze("Hallo", -2, "Hallo");
       // Paar Ideen zum Testen 

        String erg = Zeichenketten.verkuerze(s,n);
        if (!erg.equals(erw)) {
            System.out.println("falsch:" +  "s=" + s + " n=" + n + " erwartet=" + erw  + " war=" + erg);
        }
             else {
            System.out.println("richtig");
             }
    }
```

Wenn ich die Tests in die main methode schreibe und teste, gibt sie mir das richtige aus.
Nur soll ich ohne main hoch laden, da der 'Praktomat' die Testmethode wiederum testet.

Den Fehler spuckt er aus: 

```
PreTest.java:22: error: method testVerkuerze in class ZeichenkettenTest cannot be applied to given types;
assertEquals(normalize(ZeichenkettenTest.testVerkuerze()), normalize("richtig"));
                                         ^
  required: String,int,String
  found: no arguments
  reason: actual and formal argument lists differ in length
PreTest.java:29: error: method testVerkuerze in class ZeichenkettenTest cannot be applied to given types;
assertEquals(normalize(ZeichenkettenTest.testVerkuerze().substring(0,7)), normalize("falsch:"));
```

Jemand ne Idee?


----------



## mrBrown (6. Nov 2016)

Lies dir doch noch mal die Aufgabe durch, schon der erste Satz enthält deinen Fehler 
(Und zusätzlich der Letzte einen weiteren)


----------



## tommysenf (6. Nov 2016)

Terence86 hat gesagt.:


> mit einer Methode testVerkuerze, die keine Argumente annimmt


Hmm, wat könnte da wohl schief laufen?


----------



## Terence86 (6. Nov 2016)

```
public static void testVerkuerze()
```
 so oder wie? Sind doch die Parameter!? im confused
bitte erleuchtet mich!


----------



## mrBrown (6. Nov 2016)

De Text sagt keine Parameter, der Fehler sagt keine Parameter, aber du hattest es mit Parametern.
Also ja, so ohne ists richtig


----------



## Terence86 (6. Nov 2016)

Ah die Argumente sind die Parameter, alles klar! Nagut umgestellt und fast alles ist rot unterlegt in Eclipse.


----------



## Terence86 (6. Nov 2016)

Lieber Herr MrBrown,
könnten sie mir weiter helfen was ich da umstellen muss das es passt, Eclipse will das ich die Parameter rein schreibe egal was ich versuch umzustellen.


----------



## InfectedBytes (6. Nov 2016)

Terence86 hat gesagt.:


> Ah die Argumente sind die Parameter, alles klar! Nagut umgestellt und fast alles ist rot unterlegt in Eclipse.


Am besten schreibst du mal wie dein Code jetzt aussieht, denn "habe es umgestellt" sagt nicht viel über deinen neuen Code aus.


----------



## Terence86 (6. Nov 2016)

Mit umgestellt meinte ich nur die Methode ohne Parameter.
Da das ja so gewollt ist, nur schraube ich da rum das keine Fehler mehr kommen.(zumindes versuche)
Muss ich da 3 Varaiblen deklarieren ?
Weil irgendwie muss der doch wissen mit was ich arbeite string oder int etc..


----------



## InfectedBytes (6. Nov 2016)

Schreib doch einfach mal deinen neuen Code, damit man sieht was du nun tatsächlich gemacht hast


----------



## Terence86 (6. Nov 2016)

```
public static void testVerkuerze() {
      
        //testVerkuerze("Fachhochschule", 3, "Fac[...]ule");

        if (!Zeichenketten.verkuerze("Fachhochschule", 3).equals("Fac[...]ule")) {
            System.out.println("falsch:" +  "s=" + s + " n=" + n + " erwartet=" + erw  + " war=" + erg);
        }
             else {
            System.out.println("richtig");
             }
    }
```
Will der sowas? Bei mehreren Test ist das voll umständlich. Und so wie ich das verstanden habe sollen wie mehrere Eingaben testen.
String s und int n sowie erg, erw müsten natürlich auch umgeändert werden. Habe ich aber mal gelassen weil ich das irgendwie zu umständlich finde.


----------



## Terence86 (6. Nov 2016)

Ok mal korrigiert:

```
public static void testVerkuerze() {
       
        //testVerkuerze("Fachhochschule", 3, "Fac[...]ule");

        if (!Zeichenketten.verkuerze("Fachhochschule", 3).equals("Fac[...]ule")) {
            System.out.println("falsch:" +  "s=" + "Fachhochschule" + " n=" + "3" + " erwartet=" + "Fac[...]ule"  + " war=" + Zeichenketten.verkuerze("Fachhochschule", 3));
        }
             else {
            System.out.println("richtig");
             }
    }
```


----------



## mrBrown (6. Nov 2016)

Du solltest den letzten Satz noch beachten, aber es geht in die richtige Richtung 

Was soll denn da umständlich sein?


----------



## Terence86 (6. Nov 2016)

Ja habs mal überprüfen lassen, bekomme jetzt die Fehler: 

```
PreTest.java:22: error: 'void' type not allowed here
assertEquals(normalize(ZeichenkettenTest.testVerkuerze()), normalize("richtig"));
                                                       ^
PreTest.java:29: error: void cannot be dereferenced
assertEquals(normalize(ZeichenkettenTest.testVerkuerze().substring(0,7)), normalize("falsch:"));
```
Habe aus dem Void ein String gemacht und statts System.out.println return gemacht. Was meinen Sie mit letztem Satz?


----------



## Terence86 (6. Nov 2016)

Umständlich dahin gehend das ich für jeden "Test", eine neues if else schreiben muss. Klar kann man kopieren und nur die Werte ändern, aber naja.


----------



## mrBrown (6. Nov 2016)

Terence86 hat gesagt.:


> Habe aus dem Void ein String gemacht und statts System.out.println return gemacht. Was meinen Sie mit letztem Satz?


Genau das meinte ich mit letztem Satz 



Terence86 hat gesagt.:


> Umständlich dahin gehend das ich für jeden "Test", eine neues if else schreiben muss. Klar kann man kopieren und nur die Werte ändern, aber naja.


Musst du nicht, mit if-else für jeden wird's auch nicht klappen.
Aber erstmal ist ein if für jeden richtig, danach kann man refactoren


----------



## Terence86 (6. Nov 2016)

Ok. Java - Compiler ist nun zufrieden. Nur der Pretester meckert noch 

```
erste Tests der Funktionalitaet - Bestehen notwendig, aber nicht hinreichend fuer Erfolg

PreTest...

testeTestVerkuerze1:
OK
testeTestVerkuerze2:
  ZeichenkettenTest.testVerkuerze().substring(0,7);
FEHLER: zuletzt erwarteter und tatsächlich erhaltener Wert unterscheiden sich
erwartet wurde: "falsch:"
erhalten wurde: "richtig"

testeTestVerkuerze3:
OK
testeTestVerkuerze4:
OK
testeTestVerkuerze5:
OK
testeTestVerkuerze6:
OK
testeTestVerkuerze7:
OK
testeTestVerkuerze8:
  ZeichenkettenTest.testVerkuerze().substring(0,7);
FEHLER: zuletzt erwarteter und tatsächlich erhaltener Wert unterscheiden sich
erwartet wurde: "falsch:"
erhalten wurde: "richtig"
```

Was muss ich den noch machen? Irgendwas stimmt ja noch nicht.


----------



## mrBrown (6. Nov 2016)

Offensichtlich ist dein Test falsch.


----------



## Terence86 (6. Nov 2016)

OK was verstehe ich da nicht. Liegt es daran das ich nur den einen Test drin gelassen habe?


> Musst du nicht, mit if-else für jeden wird's auch nicht klappen.


Liegt es daran? Ich weis nicht wie ich sonst anders mache.


----------



## mrBrown (6. Nov 2016)

Nein, daran das dein Test was falsches zurück gibt, ohne Code ist das aber jetzt nur raten


----------



## Terence86 (6. Nov 2016)

```
public class Zeichenketten {
   
    public static String verkuerze(String s, int n) {

        if (n < 0) {
            return "Bitte keinen negativen Wert eingeben!";
        }

        if (2 * n + 5 >= s.length()) {
            return s;
        }

        else {
            return s.substring(0, n) + "[...]" + s.substring(s.length() - n, s.length());
```
Das der Code von der Klasse Zeichenketten. Falls der erwünscht war.


----------



## mrBrown (6. Nov 2016)

Zeig mal zusätzlich deinen Test, dein Fehler kann in beiden liegen


----------



## Terence86 (6. Nov 2016)

```
public class ZeichenkettenTest {
   
    public static String testVerkuerze() {
       
       
        //testVerkuerze("Fachhochschule", 3, "Fac[...]ule");

        if (!Zeichenketten.verkuerze("Fachhochschule", 3).equals("Fac[...]ule")) {
            return "falsch:" +  "s=" + "Fachhochschule" + " n=" + "3" + " erwartet=" + "Fac[...]ule"  + " war=" + Zeichenketten.verkuerze("Fachhochschule", 3);
        }
             else {
            return "richtig";
             }
    }
```


----------



## Terence86 (6. Nov 2016)

Die Klasse Zeichenketten ist aber schon abgeschlossen und richtig . Die könnte ich nicht ändern.


----------



## mrBrown (6. Nov 2016)

Die sind beide richtig, der "Fehler" liegt entweder in der Testenden Klasse oder in der Aufgabenstellung


----------



## Terence86 (6. Nov 2016)

Nachdem ich ein paar mehr Tests hinzugefügt habe, bekomme ich den Fehler nur noch einmal. Denke das ich noch Testen sollte wenn n zb. negative ist usw.


----------



## Meniskusschaden (6. Nov 2016)

Das verstehe ich nicht. Woher weiß die testende Klasse denn, was du testest? Bisher sah es so aus, als ob sich alle Tests in einer Methode befinden sollten. Schreibst du doch eine Methode pro Test? Habe das Gefühl, dass da noch irgend eine Info fehlt.


----------



## Terence86 (6. Nov 2016)

In dieser Aufgabe sind die Rollen vertauscht: Sie schreiben nicht die Lösung, sondern eine Testmethode,
die kontrolliert, ob eine Lösung korrekt ist. Die zu untersuchende Lösung ist eine zu Aufgabe 2 auf
Blatt 04, also eine Methode verkuerze in einer Klasse Zeichenketten.
Schreiben Sie eine Klasse ZeichenkettenTest mit einer Methode testVerkuerze, die keine Argumente
annimmt. Sie soll eine Methode verkuerze in einer Klasse Zeichenketten mit unterschiedlichen
Eingaben testen und dadurch eventuelle Fehler aufdecken. testVerkuerze gibt die Zeichenkette
"richtig" zurück, wenn das Ergebnis der Methode in allen Testfällen der erwartete Wert war, oder
sonst für den ersten fehlerhaften Aufruf "falsch: s=|...| n=... erwartet=|...| war=|...|" mit
den entsprechenden Wertangaben.
Hinweis: Überlegen Sie sich, welche unterschiedlichen Fälle von Aufrufen vorkommen können. Sehen
Sie jeweils einen repräsentativen Aufruf vor und prüfen Sie, ob das Ergebnis der erwartete Wert ist.
Laden Sie nur die Klasse ZeichenkettenTest in den Praktomat.

Das war die Aufgabenstellung.


----------



## Terence86 (6. Nov 2016)

Ah geschafft. Danke für die Hilfe!!!!! 
Ja der wollte verschiedene Fälle haben. subString(0,7) brachte mich auf die Idee zu Testen was bei einer Zeichenkette von 7 und n = 0 passieren soll. Das hatte noch gefehlt.


----------



## Meniskusschaden (6. Nov 2016)

Dann ergibt das für mich nur einen Sinn, wenn dieser Praktomat sich selbst in die Aufrufe von verkuerze() einklinkt (vielleicht als Proxy) und überprüft, ob die Ergebnisse von testVerkuerze() dazu passen und die Testabdeckung ausreicht. Vielleicht habe ich aber auch gerade nur ein Brett vor'm Kopf.



Terence86 hat gesagt.:


> subString(0,7) brachte mich auf die Idee zu Testen was bei einer Zeichenkette von 7 und n = 0 passieren soll.


Ich denke, da wird nur der Anfang des von testVerkuerze() zurück gelieferten Strings ausgeschnitten, damit man ihn mit "richtig" und  "falsch:" vergleichen kann. Ist ja trotzdem gut, wenn du dadurch einen fehlenden Testfall gefunden hast.


----------



## mrBrown (7. Nov 2016)

Meniskusschaden hat gesagt.:


> Dann ergibt das für mich nur einen Sinn, wenn dieser Praktomat sich selbst in die Aufrufe von verkuerze() einklinkt (vielleicht als Proxy) und überprüft, ob die Ergebnisse von testVerkuerze() dazu passen und die Testabdeckung ausreicht. Vielleicht habe ich aber auch gerade nur ein Brett vor'm Kopf.
> 
> Ich denke, da wird nur der Anfang des von testVerkuerze() zurück gelieferten Strings ausgeschnitten, damit man ihn mit "richtig" und  "falsch:" vergleichen kann. Ist ja trotzdem gut, wenn du dadurch einen fehlenden Testfall gefunden hast.


Seh ich beides genauso


----------

