Hilfe bei Testfällen.

Diskutiere Hilfe bei Testfällen. im Java Basics - Anfänger-Themen Bereich.
M

Macklaire

Hallo. Ich soll in Java den Teil eines Minesweeperspiels programmieren, bei dem dem folgende Testfälle erfüllt werden, aber ich blick einfach nicht durch. Kann mir da jemand weiterhelfen?


Die Testfälle:



import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;

import org.junit.Test;

public class MineFieldTest {

@test
public void initialeBreiteWirdGemerkt() {
int hoehe = 4;
int breite = 5;
MineField mf = new MineField(breite, hoehe);

int actualBreite = mf.getBreite();

assertEquals(breite, actualBreite);
}

@test
public void initialeHoeheWirdGemerkt() {
int hoehe = 4;
int breite = 5;
MineField mf = new MineField(breite, hoehe);

int actualHoehe = mf.getHoehe();

assertEquals(hoehe, actualHoehe);
}

@test
public void initialAlleFelderKeineBombe() {
int hoehe = 4;
int breite = 5;
MineField mf = new MineField(breite, hoehe);

for (int x = 0; x < breite; x++) {
for (int y = 0; y < hoehe; y++) {
assertFalse("Feld an [" + x + "," + y + "] darf keine Bombe haben", mf.hatBombe(x, y));
}
}
}

}
 
L

LimDul

Wo genau blickst du nicht durch?

PS: Setze den Code bitte in Code-Tags, dann ist er einfacher lesbar
 
H

httpdigest

Du sollst halt eine MineField Klasse schreiben, die diese getesteten Anforderungen erfüllt.
Z.B.:
Java:
public class MineField {
  private final int breite;
  private final int hoehe;
  public MineField(int breite, int hoehe) {
    this.breite = breite;
    this.hoehe = hoehe;
  }
  public int getBreite() {
    return breite;
  }
  public int getHoehe() {
    return hoehe;
  }
  public boolean hatBombe(int x, int y) {
    return false;
  }
}
Hierbei kann man sehr schön test-driven vorgehen.
 
M

Macklaire

Also ich habe bereits ein komplettes Minesweeper programmiert. Aber ich weiß nicht wie ich das mit den Testfällen angehen soll. Denn zB bei dem 3ten Fall, soll auf eben diesem Feld keine Bombe sein, damit der Testfall positiv ist. Aber das kann ich ja nicht beeinflussen, da Minesweeper bei der Bombenverteilung random sein muss.

Ich habe diese Aufgabe ohne weitere Worte bekommen und weiß nicht recht, wie ich das ganze jetzt angehen soll.

Wie setze ich den Code in Code-Tags?
 
J

JustNobody

Vorgehen bei sowas ist doch ganz einfach: Du hast den Test. Dann probier, ob er sich übersetzen lässt.

So Du nur den Test hast, dann wirst Du erst einmal darüber stolpern, dass er MineField nicht kennt. Also erzeugst Du diese Klasse (leer).
Wenn Du jetzt wieder compilierst, dann sollte es an anderen Dingen scheitern. Also z.B. der fehlende Konstruktor mit zwei Parametern. Also bauen wir den ein (leer!).
Dann fehlt getBreite(), getHoehe(), ... die baust du dann auch alle ein (minimal - also z.B. mit return 0;), bis es kompiliert.

Wenn es sich übersetzen lässt, dann schaust Du, ob die Tests durchlaufen.

Und wenn Du immer schön minimal vorgegangen bist, dann wirst Du eine interessante Lösung haben, bei der getBreite einfach ein return 5; enthält. hatBombe gibt immer false zurück.

Das wirkt evtl. am Anfang extrem, aber das ist - im übertriebenen Sinn - tatsächlich das Vorgehen. Unit Tests werden erfüllt mit minimalem Code. Und beim überfliegen habe ich z.B. keine Notwendigkeit gesehen, dass Breite / Höhe gemerkt oder gar ein zweidimensionales Array erstellt werden müsste ...
 
M

Macklaire

Aber wie kann der letzte Testfall immer positiv zurückkommen, wenn die Bomben bei jeden durch lauf wo anders sind. Also das Feld, das im Testfall vorgegeben ist wird ja nicht immer ohne Bombe sein können
 
M

Macklaire

@httpdigest
Danke für das was du geschickt hast. So weit war ich auch schon. Nur verstehe ich den letzten Testfall eben nicht. Tut mir leid, wenn ich mich unklar ausgedrückt hab.
 
T

temi

Aber wie kann der letzte Testfall immer positiv zurückkommen, wenn die Bomben bei jeden durch lauf wo anders sind. Also das Feld, das im Testfall vorgegeben ist wird ja nicht immer ohne Bombe sein können
Doch soll es. Der Test verlangt, dass ein neu erstelltes Minenfeld keine Bomben enthält. Die müssen halt später zugefügt werden. Das wird von den Tests aber nicht verlangt.
 
M

Macklaire

@temi

Achso. Also wenn keine Bomben generiert werden, muss ich nur das Feld erzeugen und dann sind eh alle leer.
 
T

temi

@temi

Achso. Also wenn keine Bomben generiert werden, muss ich nur das Feld erzeugen und dann sind eh alle leer.
Wie schon @JustNobody geschrieben hat. Der Test wird mit der minimalen Lösung erfüllt, d.h. du musst überhaupt kein Feld erzeugen. Der Test wird bereits erfüllt, wenn die Methode einfach false zurückgibt.

Java:
public class MineField {

  public MineField(int breite, int hoehe) {

  }
  
  public int getBreite() {
    return 5;
  }

  public int getHoehe() {
    return 4;
  }

  public boolean hatBombe(int x, int y) {
    return false;
  }
}
 
Zuletzt bearbeitet:
J

JustNobody

Was zeigt, dass die Testfälle nicht vollständig sind.
Ja, das ist richtig. Das zeigt Deine "Musterlösung" auch sehr deutlich.

Das sieht auch relativ "seltsam" aus. Gewisse Dinge macht man ja "einfach so". Also Instanzvariable mit Getter/Setter und einem Konstruktor der die setzen kann. Das ist etwas, darüber denkt man nicht einmal nach!

Hintergrund, wieso man das hier aber nicht so machen sollte:
Du würdest streng genommen eine Funktionalität schreiben, die nicht getestet ist. So man "Tests first" vorgehen will, wäre dies als falsch anzusehen. Oft findet man in der Praxis aber ein "Ich schreibe Code, dann teste ich den Code und wenn die Coverage hoch genug ist, bin ich fertig und niemand meckert mit mir!".

Wenn man sicher sein will, dass man Tests immer zuerst schreibt, dann muss man hier aber genau aufpassen.

Was aus Sicht von Clean Code mit rein kommt: KISS: Keep It Simple, Stupid. Also auch nichts machen, was nicht gefordert ist.

Das wäre zumindest meine Sichtweise auf dieses Thema - evtl. hilft es dem einen oder anderen ja auch beim Verständnis und es macht dann etwas mehr Sinn.
 
Thema: 

Hilfe bei Testfällen.

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben