Software Entwicklung, Testen, Java, JUNIT

  • Hey, ich wäre euch super dankbar wenn mir irgendwer bei folgender Frage helfen könnte!


    Aufgabe:" Schreiben Sie für die Klasse Ganzzahl einen Unit-Test mit JUnit, wobei Sie sich an folgender Spezifikation orientieren:


    Die Klasse Ganzzahl repräsentiert ganze Zahlen und stellt verschiedene Funktionen zur Verfügung, die stets Exemplare von Gannzahl zurückliefer:


    - Ein öffentlicher Initialisierungskonstruktor erzeugt ein Exemplar der Klasse aus einem ihm übergebenen int- Paramter


    - Eine Methode mit der Signatur public Ganzzahl wurzel(Ganzzahl) berechnet die größte ganze Zahl, die kleiner oder gleich der Quadratwurzel ist . Beachten Sie, dass die Quadratwurzel von negativen Zahlen nicht definiert ist.


    - Eine Methode mit der Signatur public int toInt(Ganzzahl) wandelt ein Ganzzahlexemplar in einen int -Wert um.
    ------------------------------------------------------


    Meine Frage: In der Übung haben wir alle assert-Methoden kennengelernt jedoch wurde in der zu testenden Klasse immer ein true oder ein int Wert returnt den wir auf z.b. gleichheit getestet haben ( mit assertequals) ; wie muss ich in dieser aufgabe vorgehen ? Hier wird ja jedes mal ein Ganzzahl objekt returnt ? Wie kann ich hier eine negative zahl der quadratwurzel testen( um zu zeigen dass diese nicht definiert ist)? Bitte helft mir ich wäre euch sehr dankbar:))

  • Du kannst die toInt(Ganzzahl) methode verwenden, um den int-Wert der Ganzzahl-Objekte, die zurückgeliefert werden, auszulesen und mit assert überprüfen. Vergiss nicht, auch die toInt Methode zu testen (indem du sie mit Ganzzahl-Objekten und auch null aufrufst). Da nicht definiert wurde, was die Methode wurzel(Ganzzahl) für negative Ganzzahlen tun soll, kannst zum Beispiel entweder null zurückliefern und das mit assert überprüfen, oder du kannst eine Exception werfen, die du dann mit @Test(expected = Exception.class) überprüfen kannst. Dazu kannst du existierende Exception Klassen verwenden (zB InvalidArgumentException oder so), oder selbst eine Exception Klasse (extends Exception) erstellen.

  • public class GanzzahlTest {


    //Ganzzahl Objekt beispiel:
    private Ganzzahl beispiel;


    //Testumgebung schaffen
    @Before
    public void setUp() throws Exception {
    beispiel = new Ganzzahl(
    Was muss ich jetzt hier übergeben er erwartet eine Ganzzahl? )
    }
    //Testen
    test
    public void negativezahlen(){

    int a = beispiel.toInt(
    hier auch beispiel übergeben?)
    assertEquals(
    Wie prüfe ich jetzt ob wirklich bei negativen Werten einen Fehler entsteht? )


    ///// Danke für deine Hilfe!!! In der Aufgabe stand noch mit drinne dass die toInt Methode nicht getestet werden muss , man diese jedoch verwenden soll!Das war die Klausuraufgabe im letzten Jahr aber ist mit dem Niveau unserer Übungsaufgaben leider nicht zu vergleichen:o Habe dir mal die ganze Aufgabe privat zukommen lassen, danke danke


  • Also, bei beispiel = new Ganzzahl(...); erwartet er keine Ganzzahl, sondern wie in der Angabe zum Initialisierungskonstruktor beschrieben wird ein int übergeben, zum Beispiel new Ganzzahl(5);


    bei beispiel.toInt(beispiel) kannst du das Ganzzahl Objekt übergeben, in der Methode wird ja der int-Wert vom Objekt zurückgeliefert.


    Mit den negativen Zahlen hast du wie gesagt zwei Möglichkeiten die ich als sinnvoll erachte: Entweder in der Methode wurzel() machst du if(ganzzahl.toInt(ganzzahl) < 0) return null; und überprüfst das dann mit assertEquals(ganzzahl, null). Oder - und das würde ich empfehlen - du machst if(ganzzahl.toInt(ganzzahl) < 0) throw new GanzzahlException(), und überprüfst dann wie vorhin von mir gepostet ob die Exception wirklich geworfen wird.

  • Ja also in die Methode wurzel() darf ich leider nichts verändern ich soll wie gesagt nur den Junit-Test schreiben. Also ohne in die Methoden eine if bedingung zu schreiben, hast du noch eine idee wie es mit einem assert klappen könnte? :/

  • Ich hab die Angabe gelesen, aber ich habe angenommen du musst die Klasse Ganzzahl selber programmieren - oder ist die schon vollständig gegeben? Dann sieh bitte im Code nach was die Methode wurzel() macht, wenn du sie mit einer Ganzzahl die einen negativen int-Wert darstellt aufrufst. Alternativ kannst du auch in einem Testcase die Methode mit einer negativen Ganzzahl aufrufen und mit System.out.println() das Ergebnis ausgeben. Je nachdem was die Methode in dem Fall macht, musst du testen ob das wirklich passiert.


    Kopier den Code der Klasse Ganzzahl hierher, dann kann ich dir besser helfen.

  • Also Code der Klasse Ganzzahl hast du auch nicht? Wie führst du dann die Tests aus? Jedenfalls würde ich dann einfach geeignete Annahmen treffen, in diesem Fall, dass eine InvalidArgumentException geworfen wird wenn die Methode mit falscher Ganzzahl aufgerufen wird.

  • Wir sollen uns nur an der gegebenen Spezifikation orientieren! Also nur einen Test zu der Ganzzahl Klasse schreiben:
    was hälst du hier von:


    public class GanzzahlTest{



    private Ganzzahl beispielnegative;







    @Before //Testumgebung schaffen
    public void setUp(){
    beispielnegative = new Ganzzahl(-1);
    }



    //Testen, hier wird eine Exception geworfen wenn nicht schlägt der Test fehl
    @Test(expect = IllegalArgumentException.class)
    public void negativ(){
    beispielnegative.wurzel(beispielnegative);
    }



    --------------------


    Aber meine Frage: es war gefordert dass man die toint methode verwendet , die brauche ich ja in meinem fall gar nicht mehr! hast du eine idee wofür ich die verwenden soll?!

  • Ja, sieht schon ganz gut aus, außer dass der korrekte Testbefehl @Test(expected = IllegalArgumentException.class) lautet. Du hast recht, toInt brauchst du für diesen Testfall nicht - aber du sollst ja nicht nur den Fehlerfall testen, sondern auch den Normalfall. Das heißt du brauchst noch einen weiteren Test wo du wurzel() mit einer positiven Ganzzahl aufrufst und dann das Ergebnis mit toInt ausliest und mit assert sicherstellst dass es passt. Abgesehn von Fehlerfall und Normalfall könntest du dir auch noch Spezialfälle überlegen, wo du die zu überprüfenden Methoden zum Beispiel mit einer Ganzzahl die 0 repräsentiert aufrufst.


    Generell solltest du dir immer überlegen, wie du die Ergebnisse der Methoden einteilen kannst um mit möglichst wenig Tests alle möglichen Fälle abdecken zu können, bei wurzel() wäre das:
    Ganzzahl < 0 -> Testfall, ob Exception geworfen wird.
    Ganzzahl > 0 -> Testfall, ob die Operation korrekt berechnet wird.
    Ganzzahl = 0 -> Testfall für den Grenzfall, da hier bei der Implementierung oft Fehler passieren.

  • Cool danke!!! :) eine kleine Frage noch
    Zu dem Testfall mit der positiven ganzen Zahl:
    public class GanzzahlTest{
    private Ganzzahl beispielpositiv = new Ganzzahl(9);
    .......
    .......
    .......
    test
    public void testpositiv{
    beispielpositiv = beispielpositiv.wurzel(beispielpositiv); //
    IST DAS SO MÖGLICH?? Bevor ich die toInt verwende? Ich versteh noch nicht ganz wie ich das Ergbnis aus wurzel() zwischenspeicher ? Geht das so mit einer einfachen Zuweisung?


    // Und dann mit assert überprüfen ob aus Wurzel 9 = 3 ist :)
    asserteuqal(3,beispielpositiv.toInt(beispielpositiv));

    }

  • Ja, es ist möglich das Ergebnis von wurzel() so mit einer Zuweisung zwischenzuspeichern, allerdings würde ich dir noch empfehlen dafür eine neue Ganzzahl anzulegen, dadurch wird alles viel verständlicher. Also:
    Ganzzahl ergebnis = beispielpositiv.wurzel(beispielpositiv);
    und dann beim Überprüfen auslesen mit:
    ergebnis.toInt(ergebnis)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!