Cooler CSV Reader in JUnit 5

Erstellt am 24. Juli 2017 von It_berater

Will man Testfälle aus einer CSV-Datei verwenden, geht das mit JUnit 5 Super einfach. Es gibt da eine neue Annotation @CsvFileSource der nur der Dateiname der CSV-Datei übergeben werden muss, und schon wird für jede Zeile der Test ausgeführt. Die Datei muss im Classpath liegen und mit Komma (,) getrennt sein. Sie darf keine Überschrift haben.

Als Beispiel soll mal die flug-data.csv dienen, die ua. die Summe aller erfassten Flugzeuge enthält.

Hier ein Auszug:

aed4022e-c6e9-45b1-96c1-14270c68a036,3550,Fri Jun 30 07:37:25 CEST 2017,287,148,115,200,139,150,110,122,129,157,155,250,347,531,293,302,99,16
8695a419-e76a-46f4-9a97-3ba7f0d06999,3514,Fri Jun 30 08:17:07 CEST 2017,206,138,126,181,137,151,126,119,117,142,172,214,338,576,353,292,103,23
ee29ce4a-4b9c-4491-ab6c-e888ccbbf4fa,3612,Fri Jun 30 08:29:03 CEST 2017,289,136,121,178,171,144,134,117,132,145,166,223,323,573,360,284,94,22
a95c25b5-8b3d-4922-9ce3-2d22269b32e8,3555,Fri Jun 30 09:23:14 CEST 2017,213,135,120,191,130,178,113,141,123,158,150,241,337,549,383,289,87,17
874494b7-4824-40b2-8660-d9acec56f837,4121,Fri Jun 30 11:27:51 CEST 2017,220,142,129,209,165,158,137,153,141,174,191,339,395,672,364,369,139,24
562e4c98-98bd-472c-9e9b-fc919c2260aa,5055,Fri Jun 30 16:00:44 CEST 2017,237,195,218,308,260,250,172,158,210,270,248,424,493,696,365,372,127,52
898c57c1-88c2-436d-b49a-a2db85ddc1fb,3277,Sun Jul 02 08:35:18 CEST 2017,211,116,92,156,118,129,102,126,99,125,134,198,308,592,393,289,77,12
6e3663bf-19c1-49fe-8260-3aa4e237b198,5084,Thu Jul 06 15:57:54 CEST 2017,292,206,216,318,259,221,149,150,179,211,230,364,474,781,421,390,160,63
ac38b07f-3aa6-4908-a7d7-bae630916f99,5296,Wed Jul 19 17:34:38 CEST 2017,259,237,214,347,272,237,181,174,186,237,202,332,440,821,439,480,183,55
b7f9487e-dd29-4095-a064-d401192ce9ad,4904,Sun Jul 23 20:32:03 CEST 2017,227,275,221,331,264,209,165,147,171,190,218,329,379,726,434,394,157,67

Wir wollen jetzt jede Zeile überprüfen, ob die Summe über 3000 Flugzeuge liegt und ob die UID vorhanden ist. Auch wollen wir die Testergebnisse um eine laufende Nr. ergänzen.

Hier die Methode:

@DisplayName("CSV Flugdaten validierung")
@ParameterizedTest(name = "Test Nr. {index} mit Summe: {1} und UID: {0} ")
@CsvFileSource(resources = "/flug-data.csv")
void flugDatenDateiTest(String uid, int summe) {

	assertNotNull(uid, "Da fehlt eine UID");
	assertTrue(summe > 3000, "Das sind zu wenig Flugzeuge!");
}

Mit {index} kann auf die laufende Nr. zugegriffen werden. Und mit {0} auf die erste Spalte mit {1} auf die zweite Spalte usw.

Der Testlauf sieht dann so aus:

Diese und auch andere Klassen sind in JUnit 5 noch mit @API(Experimental) annotiert. D.h. sie können in zukünftigen Versionen ohne weiteres auch wegfallen.

Übrigens ist in der JUnit 5 Version der Nachrichten-Parameter nicht mehr an der 1. Stelle sondern an der Letzten. So kann man die Methoden auch auseinander halten und es braucht nicht mehr viel gescrollt zu werden:

assertNotNull(uid, "Da fehlt eine UID");
assertTrue(summe > 3000, "Das sind zu wenig Flugzeuge!");

Ähnliche Artikel:

  1. Anzahl Flugzeuge weltweit – (Tendenz steigend) – Aktuell 5055
  2. Rest Test Programm: Java Migration von JUnit 4 nach JUnit 5 (1.0.0.-M6)
  3. JUnit 5 @ParameterizedTest mit @ValueSource oder 3 Gründe warum man keine JUnit Tests schreiben sollte!