Assertions Tests

multihamster

Mitglied
Ich habe eine Methode (Methode) welche 2 Arrays (gefüllt mit booleans) als Input hat und einfach nur prüft an wie vielen Stellen sich die beiden Arrays unterscheiden und gibt das als int zurück.

Nun will ich die Methode mit der Klassse MethodeTest mit Assertions testen. Einen Test hab ich schon. Jemand eine Idee was ich sonst noch für einen Test machen könnte? Einen bei dem ich davon ausgehe dass ich gültige boolean eingeben.
 

Anhänge

  • Screenshot 2021-10-21 163857.png
    Screenshot 2021-10-21 163857.png
    34,9 KB · Aufrufe: 5
K

kneitzel

Gast
Du hast generell immer wieder die gleichen Tests:
- leere Eingaben (Also bei Dir null oder Arrays der Größe 0 und das beim ersten oder zweiten oder beiden Parametern)
- ungültige Eingaben (Arrays unterschiedlicher Länge)
- Dann wären da evtl. noch die Fälle mit einem Element oder mehreren, Abweichungen am Anfang, in der Mitte und am Ende
Das ist ein typisches Vorgehen, ob das alles so für Deine Tests notwendig ist, musst Du wissen.

Test Driven Development macht sowas meist deutlich einfacher, denn da hat man dann mehrere kleine Veränderungen und es gibt immer alle Tests direkt. Das verhindert die Suche nach "notwendigen Testcases" und vor allem: Der Code ist problemlos testbar (Ist bei Dir jetzt auch der Fall, aber das ist schnell eben nicht der Fall wenn es nur etwas komplexer wird).
 

Robertop

Bekanntes Mitglied
Gerade beim Schreiben von Tests für komplexere Klassen, habe ich mir angewöhnt, ganz vorne einen "emptyTest" zu machen, also eine ganz leere Testfunktion. So kann man finde ich schneller sehen, wenn man zum Beispiel etwas im setup falsch gemacht hat oder sonst welche gravierende Fehler gemacht hat, die nur zufällig dazu führen, dass die richtigen Tests fehlschlagen. (Wenn man richtig TDD macht, sollte das natürlich gar nicht erst passieren, aber wer hat schon die Zeit... 😅 )

Außerdem finde ich bei Tests immer gut, wenn man die in die drei Teile Arrange, Act und Assert einteilt. Der Arrange Teil ist bei dir das Setzen der beiden Arrays, aber das Act und Assert hast du dann zusammen in einer Zeile. Wenn du den Methodenaufruf und das Assert in eigene Zeilen machst, ist beim Lesen des Tests schneller erkennbar, was der Aufruf ist, was er zurückgibt und was erwartet wird:

Java:
int unterschiede = Methode.methode1(ar1, ar2);

Assertions.assertEquals(3, unterschiede);
 

multihamster

Mitglied
Aber wie könnte ich jetzt möglichst einfach mit einem dieser Test (bei dem ich davon ausgehe dass der Anwender etwas falsches eingibt) überprüfen ob eines der beiden Arrays welche an die Methode übergeben worden sind statt eines booleans (was der Typ sein sollte) einen int z.b reinschreibt?

Da meine Methode als Rückgabewert einen int hat (die Anzahl der Unterschiede der beiden arrays) kann ich auch nicht mit array.length arbeiten
 

LimDul

Top Contributor
Aber wie könnte ich jetzt möglichst einfach mit einem dieser Test (bei dem ich davon ausgehe dass der Anwender etwas falsches eingibt) überprüfen ob eines der beiden Arrays welche an die Methode übergeben worden sind statt eines booleans (was der Typ sein sollte) einen int z.b reinschreibt?

Da meine Methode als Rückgabewert einen int hat (die Anzahl der Unterschiede der beiden arrays) kann ich auch nicht mit array.length arbeiten
Bei einem Test brauchst du array.length auch nicht.

Ein int-Array kannst du in die Methode nicht reingeben vermute ich mal, weil in der Signatur der Methode das als boolean array definiert ist. Das würde nicht kompilieren. Den Compiler brauchst du nicht prüfen.

Du musst dir überlegen, welche Eingaben kann die Methode aufgerufen werden und was kann rauskommen. Du hast eine Methode die technisch wie folgt aussieht:

Eingabe: 2 Boolean Arrays
Rückgabe: Ein int-Wert

Was gibt die Methode aus, wenn ein Array null ist?
Was gibt die Methode aus, wenn beide Arrays null ist?
Was gibt die Methode aus, wenn ein Array leer ist?
Was gibt die Methode aus, wenn beide Arrays leer sind?
Was gibt die Methode aus, wenn die Arrays unterschiedlich lang sind (z.B. einmal 2 und einmal 4 Elemente)

Diese Konstellationen muss du mit Tests prüfen.
 
K

kneitzel

Gast
statt eines booleans (was der Typ sein sollte) einen int z.b reinschreibt?
Das kann ja gar nicht passieren. Die Methode bekommt boolean[] als Parameter, daher kann da nichts anderes übergeben werden. Die Sorge hast Du nicht.

Da Du von einem Anwender sprichst, der da etwas rein geben könnte: Bitte immer den Fokus behalten: Du testest hier eine Methode. Da ist nichts mit einem Anwender. Du musst also nur die Methode betrachten und die Methode ist sogar noch sehr einfach, denn sie basiert auf keinem inneren Zustand. Also keine Abhängigkeiten in der Art. Du hast nur zwei Eingaben und musst da bei allen Fällen schauen, was dabei raus kommt.

Da meine Methode als Rückgabewert einen int hat (die Anzahl der Unterschiede der beiden arrays) kann ich auch nicht mit array.length arbeiten
Du musst natürlich klar definieren, was das Resultat sein soll bei welcher Eingabe. Und da hast Du viele Möglichkeiten:

a) undefined: Wenn Du mir Schrott gibst, dann bekommst Du irgendwas zurück. Keine Ahnung was. Interessiert mich auch nicht.
==> Das ist die schlechteste Variante, die man wählen kann. Wenn eine Eingabe nicht in Ordnung war, dann sollte die Methode dies immer klar signalisieren um zu verhindern, dass mit dem Fehler weiter gearbeitet wird.

b) Du schaust, ob und wie Du Fehler in der Rückgabe signalisieren kannst. Ggf. ist dann noch der Rückgabetyp anzupassen.
==> Das ist schon besser. Bei Deiner Methode wären negative Werte denkbar. -1 wird zurück gegeben, wenn die Eingabe ungültig war. Andere Dinge, die man oft findet: Es wird eine Referenz zurück gegeben (also bei Dir z.B. Integer) - dann kann man null zurück geben. Oder man nutzt Typen wie Optional<T>. Dies ist aber immer noch nicht gut, denn Du musst nach dem Aufruf immer die Rückgabe prüfen. Das bläht den Code aber auf.

c) Wenn ein Fehler auftritt, dann wird eine Exception geworfen. Wenn einer der Parameter null ist, dann wird eine NPE geworfen (egal ob absichtlich oder unabsichtlich :) ). Wenn die Arrays unterschiedliche Länge haben, dann wird eine andere Exception geworfen ...
==> Das ist der Weg, der durchaus üblich ist.

Bezüglich Exception werfen: Das soll nur passieren, wenn eine Ausnahme eintritt. Also etwas, das nicht zu erwarten war. Wenn ich eine Methode bereit stelle, dann erwarte ich, dass der Entwickler, der diese nutzt, diese richtig nutzt. ==> Ausnahme
Der Nutzer vertippt sich => Das passiert immer, also keine Ausnahme!

Die Regel hier besagt: Exceptions sollten nicht für den normalen Programmablauf genutzt werden! Also Dinge, die alles mögliche sein können, immer erst prüfen. Also wenn eine Methode wie in b) angedeutet auch null zurück geben kann: Bitte Prüfen!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Gaudimagspam Assertions im Programm hinzufügen Java Basics - Anfänger-Themen 4
O Was tut diese Methode? und wie müssen die assertions aussehen? Java Basics - Anfänger-Themen 21
L Assertions in mehrdimensionalen Arrays Java Basics - Anfänger-Themen 7
6 Best Practice Feedback zu Service / JUnit Tests Java Basics - Anfänger-Themen 3
M Anfängerfehler - Tests JUnit IntelliJ Java Basics - Anfänger-Themen 24
P Probleme mit JUnit-Tests, es kommt was anderes raus als bei manuellen Tests Java Basics - Anfänger-Themen 5
T gradle und tests Java Basics - Anfänger-Themen 1
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
L JUnit tests in java Java Basics - Anfänger-Themen 5
C JUnit Tests. How to Java Basics - Anfänger-Themen 5
L Junit Tests Java Basics - Anfänger-Themen 10
M Open Source Projekt mit Unit Tests gesucht Java Basics - Anfänger-Themen 5
S Kommt es zu Seiteneffekten wenn man waehrend den laufenden JUnit Tests den Code aendert? Java Basics - Anfänger-Themen 2
M Verständnisfrage zu JUnit Tests und private Methoden Java Basics - Anfänger-Themen 3
T Unit tests fehlerhaft bitte um hiiiiilfe :D Java Basics - Anfänger-Themen 1
G JUnit-Tests im Programmdurchlauf starten Java Basics - Anfänger-Themen 4
M Junit Tests durchführen, die eine Verbindung zu einer Daten erfordern Java Basics - Anfänger-Themen 3
J J-Unit Tests Java Basics - Anfänger-Themen 6
V Frage zu JUnit Tests Java Basics - Anfänger-Themen 3
A String in Double umwandeln mit Tests Java Basics - Anfänger-Themen 3
A JUnit Tests in Jar-Archiv packen Java Basics - Anfänger-Themen 2
M JUNIT tests mit ant script ausführen Java Basics - Anfänger-Themen 4
T Junit Tests Java Basics - Anfänger-Themen 7
W Problem beim erstellen eines Tests Java Basics - Anfänger-Themen 16
M Junit tests gehen nicht Java Basics - Anfänger-Themen 2
F Gleiche JUnit-Tests automatisert mit verschiedenen Methoden ausführen Java Basics - Anfänger-Themen 6
J Einführung in JUnit-Tests Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben