JUnit testing is inkonsistent

A

arhzz

Bekanntes Mitglied
Hallo! Ich habe mir diese Klasse Aufgabaut

Java:
package at.jku.ssw.queens;
import at.jku.ssw.queens.test.InvalidMoveException;
import at.jku.ssw.queens.test.InvalidPositionException;
import at.jku.ssw.queens.test.QueensException;
import at.jku.ssw.queens.test.State;

public class Queens {

    public static Queens create(int n) throws IllegalArgumentException {
        if (n < 0) {
            throw new IllegalArgumentException();
        }
        return new Queens(n);
    }
    // TODO: fields
    private int board[][];
    private int nOfQueens;

    public Queens(int n) {
        // TODO
        this.board = new int [n][n];
        this.nOfQueens = nOfQueens;
    }

    public int getSize() {
        // TODO
        return board.length;
    }

    public int getNQueens() {
        // TODO
        return nOfQueens;
    }
    //Hilfsmethoden
    public boolean checkCol(char col) {
        return col == 'A' || col == 'B' || col == 'C' || col == 'D' || col == 'E' || col == 'F' || col == 'G' || col == 'H';
    }
    //Hilfsmethoden
    public boolean checkRow(int row) {
        return row >= 1 && row <= board.length;
    }

    public State setQueen(int row, char col) throws QueensException {
        // TODO
        if (!checkRow(row) || !checkCol(col)) {
            throw new InvalidPositionException();
        } else if (hasQueen(row, col)) {
            throw new InvalidMoveException();
        } else if (checkRow(row) && checkCol(col)) {
            board[row+1][col-65] = 'Q';
            nOfQueens++;
        }
        return getGameState();
    }

    public State removeQueen(int row, char col) throws QueensException {
        // TODO
        if (!checkRow(row) || !checkCol(col)) {
            throw new InvalidPositionException();
        } else if (!hasQueen(row, col)) {
            throw new InvalidMoveException();
        } else if (hasQueen(row, col)) {
            board[row+1][col-65] = 0;
            nOfQueens--;
        }
        return getGameState();
    }


    public boolean hasQueen(int row, char col) throws InvalidPositionException {
        // TODO
        if (!checkRow(row) || !checkCol(col)) {
            throw new InvalidPositionException();
        } else
            return board[row+1][col-65] == 'Q';
    }

    public State getGameState() {
        int numberOfQueens = getNQueens();

        if (numberOfQueens == getSize()) {
            return State.COMPLETE;
        } else if (numberOfQueens < getSize()) {
            return State.INCOMPLETE;
        }
        return State.INVALID;
    }

    public void clear() {
        // TODO
        removeAll();
        nOfQueens = 0;
    }
    public void removeAll() {
        for(int row = 0; row < board.length; row++) {
            for(int col = 0; col < board.length; col++) {
                board[row][col] = 0;
            }
        }
    }

}

Dazu habe ich diese Test Klasse aufgebaut um zu testen ob die methoden richtig funktionieren

Java:
package at.jku.ssw.queens.test;

import static org.junit.jupiter.api.Assertions.*;

import at.jku.ssw.queens.Queens;
import org.junit.jupiter.api.Test;

class QueensTest {

    @Test
    void testCreate() { //passt
        assertNotNull(Queens.create(5));
        assertThrows(IllegalArgumentException.class, () -> Queens.create(-1));
    }

    @Test
    void testGetSize() { // passt
        Queens queen = Queens.create(5);
        assertEquals(queen.getSize(), 5);
    }

    @Test
    void testgetNQueens() { // index 5 out of bound for lenght 5
        Queens queen = Queens.create(5);
        try {
            queen.setQueen(2, 'B');
            assertTrue(queen.hasQueen(2, 'B'));
            queen.setQueen(3, 'C');
            assertTrue(queen.hasQueen(3, 'C'));
            queen.setQueen(1, 'E');
            assertTrue(queen.hasQueen(1, 'E'));
            queen.setQueen(4, 'F');
            assertTrue(queen.hasQueen(4, 'F'));
            queen.setQueen(5, 'H');
            assertTrue(queen.hasQueen(5, 'H'));

        } catch (QueensException e) {
            e.printStackTrace();
        }

        assertEquals(5, queen.getNQueens());

    }

    @Test
    void testSetQueen() { // Invalid exception
        Queens queen = Queens.create(5);
        assertThrows(InvalidPositionException.class, () -> queen.setQueen(-1, 'H'));
        try {
            queen.setQueen(1, 'A');
            assertTrue(queen.hasQueen(1, 'A'));
            queen.setQueen(8, 'H');
            assertTrue(queen.hasQueen(8, 'H'));
        } catch (QueensException e) {
            e.printStackTrace();
        }
    }
    @Test
    void testRemoveQueen() { //passt
         final Queens queen = Queens.create(5);
        try {
            queen.setQueen(1,'A');
        } catch (QueensException e) {
            e.printStackTrace();
        }

        try {
            queen.removeQueen(1,'A');
        } catch (QueensException e) {
            e.printStackTrace();
            fail();
        }
    }
    @Test
    void testhasQueen() { //passt
        Queens queen = Queens.create(5);
        try {
            assertFalse(queen.hasQueen(2, 'B'));
            try {
                queen.setQueen(3,'A');
            } catch (QueensException e) {
                e.printStackTrace();
            }
            assertTrue((queen.hasQueen(3, 'A')));
        }
        catch (QueensException e) {
            e.printStackTrace();
            fail();
        }
        assertThrows(InvalidPositionException.class,() -> queen.hasQueen(2,'Y'));
    }

    @Test
    void testGameState() { // index out of bound
        Queens queen = Queens.create(5);
        try {
            queen.setQueen(1,'A');
        } catch (QueensException e) {
            e.printStackTrace();
        }
        try {
            queen.setQueen(3,'C');
        } catch (QueensException e) {
            e.printStackTrace();
        }
        try {
            queen.setQueen(2,'F');
        } catch (QueensException e) {
            e.printStackTrace();
        }
        assertEquals(State.INCOMPLETE,queen.getGameState());
        try {
            queen.setQueen(2, 'F');
        } catch (QueensException e) {
            e.printStackTrace();
        }
        assertEquals(State.INVALID,queen.getGameState());
    }

    @Test
    void testClear() { //invalid exception
        Queens queen = Queens.create(5);
        try {
            queen.setQueen(1,'B');
        } catch (QueensException e) {
            e.printStackTrace();
        }
        try {
            queen.removeQueen(3,'A');
        } catch (QueensException e) {
            e.printStackTrace();
        }
        queen.clear();
        assertEquals(0,queen.getNQueens());
    }
}

Und ich hatte wie immer Probleme mit aufbauen von den Klassen aber jetzt passiert mir etwas wirklich kommisches und ich probiere schon seit Stunden lang es zu losen aber es geht nicht.Namlich ein Paar Methoden funktionieren ohne Problem (ich habe neben den methoden das kommentar "passt" dazu geschrieben).Die anderen Paar methoden funkioniren,im sinne der test zahlt als passed und IntelliJ sagt die methode passt aber die Konsole gibt mir diesen Error aus.

at.jku.ssw.queens.test.InvalidPositionException
at at.jku.ssw.queens.Queens.setQueen(Queens.java:46)
at at.jku.ssw.queens.test.QueensTest.testSetQueen(QueensTest.java:52)

Process finished with exit code 0

Also ich verstehe nicht warum das passiert,ich habe mir die methoden mehrmals angeschaut und ich sehe nicht was falsch daran ist.Habe neben den methoden ein kommentar geschrieben wo dieser Problem auftaucht.Und zum schluss habe ich in den letzten 2 methoden ein IndexOutOfBound exception was ich wirklich wirklich nicht verstehe weil die methode die mir diesen Error gibt,verwende ich in jeder andere methode und diese Tests und Methoden funktionieren ganz ok. Noch eine kleine erganzung zu den Exceptions.

InvalidPositionException: Soll dann geworfen werden wenn eine ungültige position übergeben wird (ungültig wenn checkCol und checkRow false zurückliefern)
InvalidMoveException: Soll dann geworfen werden wenn eine Position übergeben wird die schon besitzt ist(hasQueen züruckliefert)

Entschuldigen sie denn Langen Post und die mehrere Fragen,aber ich würde mich auf ein bisschen Hilfe freuen


Mfg
 
F

fhoffmann

Top Contributor
Java:
    public Queens(int n) {
        this.board = new int [n][n];
        this.nOfQueens = nOfQueens; // was soll das ???
    }
 
A

arhzz

Bekanntes Mitglied
Java:
    public Queens(int n) {
        this.board = new int [n][n];
        this.nOfQueens = nOfQueens; // was soll das ???
    }
Bin mir nicht sicher das ich deine Frage verstehe,meinst du wofur ich die variable brauch? Einfach fur die anzahl der Damen in den Spiel,oder warum ich this hier anwende? Einfach weil wir so es in der Schule gemacht haben.
 
A

arhzz

Bekanntes Mitglied
Er meinte damit einfach nur, dass du an der Stelle bestimmt etwas verwechselt hast, und bestimmt
nOfQuens = n;
oder Ähnliches schreiben wolltest... war kein persönlicher Angriff (denke ich). :)
Asoo ok ja dass macht sicher mehr sinn.Ja also das es ein personlicher Angriff war dachte ich nie im leben,war wirklich nur verwirrt 🤣🤣
 
L

LimDul

Top Contributor
Die Zeile hier in setQueen:

Java:
 board[row+1][col-65] = 'Q';
Da muss mit ziemlicher Sicherheit row-1 stehen. Wenn row = 8 ist, wird auf auf den Index 9 zugegriffen - bei einem Array wo der maximale Index 7 ist, etwas problematisch :)
 
kneitzel

kneitzel

Top Contributor
Also der Hinweis sollte nur aussagen, dass die Zeile nichts macht, da du kein solches Argument hast. Du weist der Instanzvariablen nur die Instanzvariable zu.

Und wenn in deinem Test das setzen einer Queen fehl schlägt, wird eine Exception geworfen. Der Test wechselt dann in den catch und gibt nur den Stacktrace aus und beendet sich dann (erfolgreich!)
 
A

arhzz

Bekanntes Mitglied
Die Zeile hier in setQueen:

Java:
board[row+1][col-65] = 'Q';
Da muss mit ziemlicher Sicherheit row-1 stehen. Wenn row = 8 ist, wird auf auf den Index 9 zugegriffen - bei einem Array wo der maximale Index 7 ist, etwas problematisch
Habe ich schon probiert,mit row-1 row und row+1 immer das selbe
 
A

arhzz

Bekanntes Mitglied
Also der Hinweis sollte nur aussagen, dass die Zeile nichts macht, da du kein solches Argument hast. Du weist der Instanzvariablen nur die Instanzvariable zu.

Und wenn in deinem Test das setzen einer Queen fehl schlägt, wird eine Exception geworfen. Der Test wechselt dann in den catch und gibt nur den Stacktrace aus und beendet sich dann (erfolgreich!)
Aber warum wurde das setzen einer Queen fehlschlagen? Dann past etwas mit der setQueen methode in der Queens Klasse?
 
kneitzel

kneitzel

Top Contributor
Also erst einmal hast Du einen Unit Test so zu schreiben, dass er wirklich testet! Und das nicht erfolgreiche setzen eine Queen soll als Fehler interpretiert werden. ==> Schreibe erst einmal den Test richtig! Ein Test, der nichts testet ist Müll - den kannst Du also auch gleich löschen.

Im Test Driven Development ist es sogar so, dass man immer erst einen Test schreibt, der fehl schlägt (Das ist dann der erste Schritt) und dann wird der Produktions-Code so angepasst, dass der Test erfolgreich ist (zweiter Schritt).

Das könntest Du auch so machen.

Habe ich schon probiert,mit row-1 row und row+1 immer das selbe
An welcher Stelle hast Du es wie geändert? Wo genau kommt dann welche Exception? Die Exception zusammen mit dem Ort sollten alles aussagen, was Du brauchst, um den Fehler zu lokalisieren. Zur Not einfach die einzelnen Elemente ausgeben oder im Debugger an der Stelle anschauen.
 
A

arhzz

Bekanntes Mitglied
Also erst einmal hast Du einen Unit Test so zu schreiben, dass er wirklich testet! Und das nicht erfolgreiche setzen eine Queen soll als Fehler interpretiert werden. ==> Schreibe erst einmal den Test richtig! Ein Test, der nichts testet ist Müll - den kannst Du also auch gleich löschen.

Im Test Driven Development ist es sogar so, dass man immer erst einen Test schreibt, der fehl schlägt (Das ist dann der erste Schritt) und dann wird der Produktions-Code so angepasst, dass der Test erfolgreich ist (zweiter Schritt).

Das könntest Du auch so machen.


An welcher Stelle hast Du es wie geändert? Wo genau kommt dann welche Exception? Die Exception zusammen mit dem Ort sollten alles aussagen, was Du brauchst, um den Fehler zu lokalisieren. Zur Not einfach die einzelnen Elemente ausgeben oder im Debugger an der Stelle anschauen.
Ich schau mir das nochmal an.
 
L

LimDul

Top Contributor
Grundsätzlich hat in einem JUnit Test ein try/catch in den seltensten Fällen was zu suchen.

Entweder es wird getestet das eine Exception kommt => dafür gibt es assertThrows
oder es darf keine Exception kommen => Dann kein try/catch, JUnit handelt das schon selber

Ein Try/Catch in einem JUNit 5 Test ist eigentlich immer ein Zeichen, dass der Test in der Form nicht sinnvoll ist.
 
A

arhzz

Bekanntes Mitglied
Ja also I habe es irgendwie geschafft,das die Testklasse klapt.Allerdings nit mit asswertThrows,mal schauen wie die bewertung am schluss aussieht
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Junit Testing bei XML? Java Basics - Anfänger-Themen 3
X JUnit testing Java Basics - Anfänger-Themen 7
L JUNIT Testing Java Basics - Anfänger-Themen 3
A Junit Test für MysqlDataSource JDBC Java Basics - Anfänger-Themen 3
A Test Junit Java Basics - Anfänger-Themen 1
H Junit test Java Basics - Anfänger-Themen 12
P Methoden JUnit 4 - Test Java Basics - Anfänger-Themen 6
P Probleme mit JUnit-Tests, es kommt was anderes raus als bei manuellen Tests Java Basics - Anfänger-Themen 5
Y Wie kann ich Konsoleneingaben durch den Scanner mit JUnit 4 testen? Java Basics - Anfänger-Themen 1
B JUnit 4: Wie man die eigene Liste testen kann [TDD] Java Basics - Anfänger-Themen 46
N Fehler bei JUnit Test Java Basics - Anfänger-Themen 5
W JUnit Tests Java Basics - Anfänger-Themen 4
hello_autumn Klassen Anzahl sowie die Anzahl der Junit Tests ermitteln? Java Basics - Anfänger-Themen 8
B JUnit / Exceptions/ try-catch Java Basics - Anfänger-Themen 6
L JUnit tests in java Java Basics - Anfänger-Themen 5
N JUnit und private Methoden testen. Java Basics - Anfänger-Themen 9
F JUnit - Was ist mit "side effects" gemeint ? Java Basics - Anfänger-Themen 2
H JUnit in Eclipse: java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 9
B JUnit Test erstellen Java Basics - Anfänger-Themen 6
W Problem bei JUnit Test Aufgabe Java Basics - Anfänger-Themen 15
J LocalDateTime testen mit Junit Java Basics - Anfänger-Themen 20
W JUnit Test und HashCode Java Basics - Anfänger-Themen 14
A Objekt in Methode zurückgeben, JUnit zeigt Error Java Basics - Anfänger-Themen 2
A Kfz - Händler Klasse. JUnit-Test gibt noch Fehler an, aber finde Ursache nicht Java Basics - Anfänger-Themen 7
O JUnit - Objektreferenzen Java Basics - Anfänger-Themen 3
G Testen mit JUnit Java Basics - Anfänger-Themen 4
B Palindrom Test mit Junit Java Basics - Anfänger-Themen 23
C JUnit Tests. How to Java Basics - Anfänger-Themen 5
S Junit Test Java Basics - Anfänger-Themen 2
shiroX Klassen Klasse/Methode private final jUnit-Fehler Java Basics - Anfänger-Themen 5
L Junit Tests Java Basics - Anfänger-Themen 10
A IllegalArgumentException in JUnit testen Java Basics - Anfänger-Themen 3
V ToString-Methode mit JUnit testen(BlueJ) Java Basics - Anfänger-Themen 10
shiroX Methoden JUnit-Test einer void-Methode Java Basics - Anfänger-Themen 4
V JUnit Klassen Java Basics - Anfänger-Themen 3
T Junit Mockito: Instanz von inneren erzeugten Objekten Java Basics - Anfänger-Themen 4
S JUnit - Swing- Anwendung wird nicht neu gestartet Java Basics - Anfänger-Themen 0
B Binäre Suche - Junit Test Java Basics - Anfänger-Themen 6
S Kommt es zu Seiteneffekten wenn man waehrend den laufenden JUnit Tests den Code aendert? Java Basics - Anfänger-Themen 2
M JUnit Testmethoden mit mehreren assert Methoden Java Basics - Anfänger-Themen 1
S Double und Gleitkommazahlen mit JUnit testen Java Basics - Anfänger-Themen 7
K JUnit: Objekte von eigenen Klassen vergleichen...geht nicht Java Basics - Anfänger-Themen 5
Z JUnit Exception Java Basics - Anfänger-Themen 2
M Verständnisfrage zu JUnit Tests und private Methoden Java Basics - Anfänger-Themen 3
M Ist die Hamcrest Bibliothek auch schon in Junit 4.11 verfügbar? Java Basics - Anfänger-Themen 1
S Unterschied .jar Datei ausführen und junit Testfall... Java Basics - Anfänger-Themen 3
M Reihenfolge von Testmethoden in JUnit beeinflussen Java Basics - Anfänger-Themen 2
S Separate Funktion für JUnit-Test Java Basics - Anfänger-Themen 3
G JUnit-Tests im Programmdurchlauf starten Java Basics - Anfänger-Themen 4
T Best Practice JUnit: Wie Klassen durch Stubs/Mockups ersetzen Java Basics - Anfänger-Themen 7
T JUnit test failed Java Basics - Anfänger-Themen 3
M Junit Tests durchführen, die eine Verbindung zu einer Daten erfordern Java Basics - Anfänger-Themen 3
T Junit in Eclipse Java Basics - Anfänger-Themen 1
P JUnit bedeutungen Java Basics - Anfänger-Themen 3
R JUnit Test mit einer Dateistruktur als Testparameter Java Basics - Anfänger-Themen 3
shiroX OOP Array kleinste Zahl mit jUnit test Java Basics - Anfänger-Themen 3
S JUnit assertEquals funktioniert nichgt wie es sollte :( Java Basics - Anfänger-Themen 7
V Frage zu JUnit Tests Java Basics - Anfänger-Themen 3
B JUnit für JFileChooser Java Basics - Anfänger-Themen 6
S Code stimmt nicht für vorgegebenen JUnit-Test Java Basics - Anfänger-Themen 2
S File vergleich - Junit Java Basics - Anfänger-Themen 6
T JUnit Java Basics - Anfänger-Themen 18
G Junit Java Basics - Anfänger-Themen 4
T JUnit Suite frage Java Basics - Anfänger-Themen 6
R JUnit Test mit mehrfach ausgeführt Java Basics - Anfänger-Themen 6
S InvocationTargetException bei JUnit Testlauf Java Basics - Anfänger-Themen 2
B JUnit - Mini-Test Java Basics - Anfänger-Themen 9
T Unterschied zwischen Integrationstest und JUnit test? Java Basics - Anfänger-Themen 12
Y Junit Test - Testwert ändert sich Java Basics - Anfänger-Themen 12
T Junit --Exception testen Java Basics - Anfänger-Themen 15
A JUnit Tests in Jar-Archiv packen Java Basics - Anfänger-Themen 2
G Erste Schritte JUNIT Regressionstests automatisieren Java Basics - Anfänger-Themen 2
M JUnit - nur einzelne Methode testen? Java Basics - Anfänger-Themen 4
M JUnit - nur Failures loggen? Java Basics - Anfänger-Themen 2
S Hilfe zu Java-Programm und JUnit Test!! Java Basics - Anfänger-Themen 5
T JUNit Test IOException Java Basics - Anfänger-Themen 5
R String Replace für JUnit Java Basics - Anfänger-Themen 19
T JUNIT Nullpointerexception Java Basics - Anfänger-Themen 3
M JUNIT tests mit ant script ausführen Java Basics - Anfänger-Themen 4
S [JUnit] eigener Testsuite Runner + Ausgabe Java Basics - Anfänger-Themen 6
S [JUnit] Print Results while running Java Basics - Anfänger-Themen 6
W Mit jUnit Array testen? Java Basics - Anfänger-Themen 5
T Junit Tests Java Basics - Anfänger-Themen 7
I JUnit Datapoints für mehrere Testklassen Java Basics - Anfänger-Themen 4
Spin JUNIT Test Case - Problem bei testen Java Basics - Anfänger-Themen 2
T brauche HILFE beim Junit test:eek: Java Basics - Anfänger-Themen 11
M Junit tests gehen nicht Java Basics - Anfänger-Themen 2
E OOP einfache Array Aufgabe mit jUnit Java Basics - Anfänger-Themen 5
C jUnit: Erfahren, ob der getestete Code eine Exception gehandelt hat Java Basics - Anfänger-Themen 3
timbeau JUnit Test Dauer speichern/loggen Java Basics - Anfänger-Themen 16
turmaline JUnit testen ob keine Exception auftritt Java Basics - Anfänger-Themen 23
D JUnit auf Matrix anwenden Java Basics - Anfänger-Themen 5
W JUnit 4.X und Parameter Java Basics - Anfänger-Themen 4
xehpuk In JUnit über eigenen Thread testen Java Basics - Anfänger-Themen 3
P JUnit - Optimierung der Testklassen Java Basics - Anfänger-Themen 13
S JUnit: Konsole aktualisiert sich nicht Java Basics - Anfänger-Themen 3
G JUnit ist das neue main() Java Basics - Anfänger-Themen 16
A junit test wann verwendet man "was"? Java Basics - Anfänger-Themen 4
J JUnit Test Java Basics - Anfänger-Themen 2
H JUnit Customizing Java Basics - Anfänger-Themen 5

Ähnliche Java Themen


Oben