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?
 

mrBrown

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

Terence86

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

mrBrown

Super-Moderator
Mitarbeiter
De Text sagt keine Parameter, der Fehler sagt keine Parameter, aber du hattest es mit Parametern.
Also ja, so ohne ists richtig ;)
 

Terence86

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

Terence86

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

Terence86

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

Terence86

Aktives Mitglied
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");
             }
    }
 

mrBrown

Super-Moderator
Mitarbeiter
Du solltest den letzten Satz noch beachten, aber es geht in die richtige Richtung ;)

Was soll denn da umständlich sein?
 

Terence86

Aktives Mitglied
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?
 

Terence86

Aktives Mitglied
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

Super-Moderator
Mitarbeiter
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 ;)
 

Terence86

Aktives Mitglied
Ok. Java - Compiler ist nun zufrieden. Nur der Pretester meckert noch :D
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.
 

Terence86

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

Terence86

Aktives Mitglied
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";
             }
    }
 

Terence86

Aktives Mitglied
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

Top Contributor
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

Aktives Mitglied
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

Aktives Mitglied
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

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

mrBrown

Super-Moderator
Mitarbeiter
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
 

Neue Themen


Oben