Eclipse Test Cases mit JUnit

Steven81

Neues Mitglied
Hallo zusammen...

Ich suche jemand der mir bei einer Aufgabe weiterhelfen könnte. Die Aufgabe bestand darin ein Tool zu programmieren welches auf eine SQL-Datenbank zugreift um von dieser Daten als XML-File zu speichern. Dies wäre alles schön und gut wenn zur Aufgabe nicht noch die Test Klassen hinzugekommen wären welche zwingend mit JUnit erstellt werden sollten. Der Aufbau unseres Codes sieht wie folgt aus:

C7JdN7CSoM.PNG


Die einzige Möglichkeit sehe ich bei den Helpers und Controllers Klassen aber da ich erstens JUnit gar nicht kenne und zweitens etwas überfragt bin was ich testen könnte hoffe ich, dass mir hier jemand einen Typ oder weiterhelfen könnte.

Mein Ansatz wäre die DBConnection Class... Weiss aber nicht ob das wirklich sinn macht, da diese die Werte in die interne DB schreibt?

Java:
public class DBConnection {

    public int id;

    public String name;

    public String server;

    public String username;

    public String password;

    public File driverFile;

    public String driverFilePath;

    public String classForName;

    static DAODBConnection conData = new HsqlDAOdbConnection();


    public DBConnection(int id, String name, String server, String username, String plainPassword, File driverFile,
	    String classForName) throws Exception {
	this.id = id;
	this.name = name;
	this.server = server;
	this.username = username;
	this.password = AESencrp.encrypt(plainPassword);
	this.driverFile = driverFile;
	this.classForName = classForName;
    }

    public DBConnection(int id, String name) {
	this.id = id;
	this.name = name;
    }

    public DBConnection(int id, String name, String server, String username, String plainPassword, String driverFile,
	    String classForName) throws GeneralSecurityException {
	this.id = id;
	this.name = name;
	this.server = server;
	this.username = username;
	this.password = AESencrp.encrypt(plainPassword);
	this.driverFilePath = driverFile;
	this.classForName = classForName;
    }

    public DBConnection(int id, String name, String server, String username, String password)
	    throws GeneralSecurityException {
	this.id = id;
	this.name = name;
	this.server = server;
	this.username = username;
	this.password = AESencrp.encrypt(password);
    }


    private void testConnection(DBConnection connection) throws Exception {
	//return internalFunctions.openCon(this.server, this.username, AESencrp.decrypt(this.password)) != null;
    }


    public static void adddbConnection(DBConnection connection) throws IOException, SQLException,
	    ClassNotFoundException {
	conData.addDBConnection(connection);
    }


    public static void editdbConnection(DBConnection connection) {
	conData.editSetting(connection.id, connection);
    }


    public static void deletedbConnection(int id) {
	conData.deleteSetting(id);
    }


    public static Connection connectDatabase(DBConnection connection) throws GeneralSecurityException, IOException {
	Connection c = null;
	String serverURL = connection.server;
	String userName = connection.username;
	String passWD = connection.password;
	Connection con = null;
	String classforName = connection.classForName;
	
	try {

	    Class.forName(classforName);

	    c = internalFunctions.openCon();

	} catch (ClassNotFoundException e) {
	    e.printStackTrace();
	}
	return c;
    }

    public static java.util.List<DBConnection> getAllConnections() throws Exception {
	java.util.List<DBConnection> conList;
	conList = conData.getAllConnections();
	return conList;
    }

    public static DBConnection getdbConnection(int i) throws Exception {
	return conData.getdbConnection(i);
    }
}
 
N

nillehammer

Gast
Du hast eine Klasse mit Methoden und Konstruktoren programmier. Du erwartest beim Aufruf dieser mit bestimmten Parametern ein bestimmtes Verhalten. Das tatsächliche Verhalten testest Du durch Aufruf und anschließende Verifikation (englisch Assert). Nachfolgend ein kleines Beispiel:
Java:
public class Rechner {
  // Addiert die Parameter, negative Zahlen sind nicht erlaubt
  public static int add(int first, int second) {

    if(first < 0) throw new IllegalArgumentException("Negative Werte sind nicht erlaubt");
    // Die fehlende Prüfung des zweiten Parameters ist Absicht, damit der Test auch was findet ;-))
    return first + second;
  }
}
Jetzt denkst Du Dir Testfälle für diese Methode aus:
- Erster Parameter negativ, zweiter Positiv --> nicht erlaubt, es sollte eine Exception fliegen
- Erster Parameter positiv, zweiter negativ --> nicht erlaub, es sollte eine Exception fliegen
- Beide Parameter positiv --> erlaubt, es sollte die Summe zurück gegeben werden
Die Programmierst Du dann in einem JUNit-Testcase aus
Java:
public class RechnerTest {

  @Test
  public void testAdd() {

     try {
        Rechner.add(-1,2);
        // Wenn die Exception nicht geflogen ist, wird die nachfolgende
        // Zeile aufgerufen und zeigt an, dass der Test fehlgeschlagen ist
        Assert.fail("Erster Parameter war negativ, es hätte eine IllegalArgumentException fliegen müssen.");
     } catch(IllegalArgumentException) {
        // do nothing expected test result
     }

     try {
        Rechner.add(1,-2);
        // Wenn die Exception nicht geflogen ist, wird die nachfolgende
        // Zeile aufgerufen und zeigt an, dass der Test fehlgeschlagen ist
        Assert.fail("Zweiter Parameter war negativ, es hätte eine IllegalArgumentException fliegen müssen.");
     } catch(IllegalArgumentException) {
        // do nothing expected test result
     }

     // Hier rufen wir die Methode mit gültigen Parametern auf
    // und merken uns das Ergebnist
     final int addResult = Rechner.add(1,1);

     // Hier verifizieren wir, ob das Ergebnis unserer Erwartung (2)
     // entspricht.
     Assert.assertEquals(2, addResult);
  }
}
Vorgehen soweit klar? Testcases werden in extra Klassen abgelegt, die im selben Package liegen, wie die zu testende Klasse. Damit sie nicht mit diesen Klassen gemischt liegen, baut man sich die Package-Struktur i.d.R. zwei Mal auf, einmal unter bspw src/main/java für die normalen Klassen und dann unter bspw. src/test/java für die Testklassen.

zweitens etwas überfragt bin was ich testen könnte hoffe ich, dass mir hier jemand einen Typ oder weiterhelfen könnte.
Alles muss getestet werden. Bei dem Beispiel DB-Connection könntest Du bspw. testen, ob die Methode wirklich die Exception schmeißt und, ob sie im gutfall ein nicht-null zurück gibt.
 
Zuletzt bearbeitet von einem Moderator:

Steven81

Neues Mitglied
Danke für die vielen Tipps!

Du hättest aber nicht zufällig ein Beispiel für diese Exception Tests anhand der DBConnection?

Gruss und nochmals Danke
 

kama

Top Contributor
Hi,

also sorry, aber das ist JUnit 3.8 ...old...

Java:
@Test
  public void testAdd() {
 
     try {
        Rechner.add(-1,2);
        // Wenn die Exception nicht geflogen ist, wird die nachfolgende
        // Zeile aufgerufen und zeigt an, dass der Test fehlgeschlagen ist
        Assert.fail("Erster Parameter war negativ, es hätte eine IllegalArgumentException fliegen müssen.");
     } catch(IllegalArgumentException) {
        // do nothing expected test result
     }

Das geht mit JUnit 4 ...in der zwischenzeit einfacher und schöner...

Java:
  @Test(expected = IllegalArgumentException.class)  
  public testAddFirstParameterWrong() {
    Rechner.add(-1,2);
  }

  @Test(expected = IllegalArgumentException.class)  
  public testAddSecondParameterWrong() {
    Rechner.add(1,-1);
  }

...

Gruß
Karl-Heinz Marbaise
 
N

nillehammer

Gast
Das geht mit JUnit 4 ...in der zwischenzeit einfacher und schöner...
Das stimmt, kannte ich auch. Benutze ich aber nicht so gerne, weil ich meistens im catch-Block nicht nur den Kommentar drinnen habe, sondern auch einen Assert auf die Exception-Message mache.
Du hättest aber nicht zufällig ein Beispiel für diese Exception Tests anhand der DBConnection?
Nicht wirklich. Mir ist nicht so ganz klar, welche Parameter Deiner Methoden/Konstruktoren wozu gut sind. War denn meine Beschreibung des Vorgehens nicht gut genug, um das auf Deinen Fall zu übertragen?
 

kama

Top Contributor
Hi,

Das stimmt, kannte ich auch. Benutze ich aber nicht so gerne, weil ich meistens im catch-Block nicht nur den Kommentar drinnen habe, sondern auch einen Assert auf die Exception-Message mache.

Dann würde ich nicht JUnit sondern TestNG nehmen...der kann das besser...


Java:
@Test(expectedExceptions = { 
   IllegalArgumentException.class 
}, 
expectedExceptionsMessageRegExp = "^First message must be there")
	public void failingBasedOnWrongFirstParameter() {
		//Whatever..
		throw new IllegalArgumentException("First message must be there");
	}

Abgesehen davon möchte ich in der Zwischenzeit keine Kommentare mehr haben...hier ist es besser sprechende test Namen zu Verwenden...Kommentare habe nämlich leider die Eigenschaft zu altern und dann falsch zu werden...weil jemande vergisst die auch anzupassen...


Gruß
Karl-Heinz Marbaise
 
N

nillehammer

Gast
[OT]
kama hat gesagt.:
Dann würde ich nicht JUnit sondern TestNG nehmen...der kann das besser...
Witzig, dass Du das ansprichst. Tatsächlich benutze ich TestNG und nicht JUnit. Habe es hier nur auf JUnit übertragen, weil die Frage sich auf JUnit bezog. Das von Dir gezeigte Feature (expectedExceptionsMessageRegExp) kannte ich aber noch nicht. Das sieht gut aus! Danke![/OT]
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Oben