Testmethode schreiben

Terence86

Aktives Mitglied
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:
Java:
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:
Code:
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?
 
Lies dir doch noch mal die Aufgabe durch, schon der erste Satz enthält deinen Fehler 😉
(Und zusätzlich der Letzte einen weiteren)
 
Java:
public static void testVerkuerze()
so oder wie? Sind doch die Parameter!? im confused
bitte erleuchtet mich!
 
De Text sagt keine Parameter, der Fehler sagt keine Parameter, aber du hattest es mit Parametern.
Also ja, so ohne ists richtig 😉
 
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.
 
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..
 
Java:
    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.
 
Ok mal korrigiert:
Java:
    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");
             }
    }
 
Du solltest den letzten Satz noch beachten, aber es geht in die richtige Richtung 😉

Was soll denn da umständlich sein?
 
Ja habs mal überprüfen lassen, bekomme jetzt die Fehler:
Code:
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?
 
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.
 
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 😉

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 😉
 
Ok. Java - Compiler ist nun zufrieden. Nur der Pretester meckert noch 😀
Code:
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.
 
Java:
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.
 
Java:
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";
             }
    }
 
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.
 
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.
 
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.
 
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.
 
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.

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

Zurück
Oben