# JUnit und dynamische Tests



## Mullle (16. Sep 2008)

Ich wollte mal fragen, ob es in JUnit möglich ist Tests dynamisch hinzuzufügen. Normalerweise hat man ja eine Testsuit in der die Tests fest codiert sind. Ich würde es gerne so gestalten das man einem Testcase unterschiedliche Parameter vorgibt, die er testen soll, ohne das man den gleichen Testcases immer wieder codieren muss.


```
import junit.framework.*;
public class TestExample extends TestCase {
    public void testOne()
    {
        assertEquals(1, Test(5));
    }
    public void testTwo()
    {
        assertEquals(2, Test(10));
    }
    public void testThree()
    {
        assertEquals(3, Test(15));
    }
    public void testFour()
    {
        assertEquals(4, Test(20));
    }
}
```

Dafür würde ich nur noch gerne einen Test durchführen, der dann aber die Parameter woanders auslesen kann.
(z.B. ein XML File -  Der Benutzer schreibt in ein XML File welchen Test er mit welchen Parameter ausführen will[/code]


----------



## maki (16. Sep 2008)

Was möchtest du denn genau?

"Tests dynamisch hinzufügen" ???

Oder deine testdaten externalisieren?


----------



## Guest (16. Sep 2008)

Sorry... du hast recht, nicht dynamisieren, sondern externisieren.


----------



## maki (16. Sep 2008)

Testdaten externalisieren ist keine schlechte Idee, allerdings muss man dann unbedingt darauf achten, dass die Tests lesbar bleiben(!!!).

Testdaten kann man prinzipiell in vielen versachiedenen Datenquellen(Dateien, RDBMS, etc.pp.) und Formate(XML, Properties, eignene Formate) externalisieren, allerdings ist es nötig zu wissen, um was für Daten es sich dabei handelt.

Sollte man natürlich nur machen, wenn es sein muss, da die lesbarkeit darunter leiden kann.


----------



## Guest (16. Sep 2008)

Gibt es da für JUnit schon bereits fertige Tools? Damit wäre eigentlich meine Frage schon beantwortet.


----------



## maki (16. Sep 2008)

Für JDBC Tests zB. gibt es zB. DBUnit, wenn du "normale" Daten hast, kannst du diese zB aus einer txt Datei mit einem BufferedReader einlesen und mit einem StringTokenizer trennen, es kommt wie gesagt auf die Daten an.

Allerdings sollte man nicht wahllos alle Daten aus den tests externalisieren, lohnt sich aus mehreren Gründen erst ab einer bestimmten Datenmenge, ob man diese Datenmenge wirklich brauchtist eine andere Frage, in deinem Beispiel müsste man wissen, was Test genau machen soll.


----------



## Mulle (16. Sep 2008)

Also ich hab das Tool JTestCase gefunden womit man Daten externalisieren kann Beispiel:

Java Code

```
// Asserting result
        boolean succeed = testCase.assertTestVariable("result",
            (new Integer(result)));
```

XML Code

```
<asserts>
         <assert name="result" type="int" action="EQUALS">10</assert>
       </asserts>
    ..........
```

Aber lösen tut das mein Problem nicht.

Wenn ich einen assertEqual durchführen will und dafür mehre Klassen zu testen habe, dann möchte ich eigentlich bloss einmal die Testsuit dafür anlegen und dem dann mehrfach die zu testende Methode übergeben.[/code]


----------



## maki (16. Sep 2008)

> Wenn ich einen assertEqual durchführen will und dafür mehre Klassen zu testen habe, dann möchte ich eigentlich bloss einmal die Testsuit dafür anlegen und dem dann mehrfach die zu testende Methode übergeben.


Pro Klasse eine TestCase Klasse ist imho eine wichtige Regel, Tests sollten von einander unabhängig sein, denke dass wir hier ohne konkretes Beispiel nicht weit kommen werden, denn so wie du das schilderst, hast du enorme Redundanzen (die Methoden mehrerer Klassen sollen dasselbe Ergebnis liefern) die unbedingt weg sollten 
Liegt aber wahrscheinlich an deinem fast nicht vorhandenen Beispiel.


----------



## foobar (16. Sep 2008)

JUnit bietet dir schon etwas ähnliches: http://www.testearly.com/2007/04/13/take-heed-of-mixing-junit-4s-parameterized-tests/


----------



## Guest (17. Sep 2008)

Da finde ich das JTestCase schon geschickter, im Grunde bietet es genau das was ich brauche. Bei JUnit, müsste ich einen extra XML Parser zum externalisieren der Daten verwenden. JTestCase bietet das schon vom Grund aus an.


----------



## sauerkraut (24. Sep 2008)

Gibt es eigentlich irgendwie eine Möglichkeit in JUnit einen Parameter in der Testsuit zu übergeben?


```
public NewTest(String method, String test) {
		super(method);
	}

	public static TestSuite suite() {
		TestSuite suite = new TestSuite();
		suite.addTest(new NewTest("testOne", "test"));
		return suite;
	}
```


```
public void testOne(String test)
    {
		assertEquals(test, "test");
    }
```


----------



## sauerkraut (25. Sep 2008)

Also ich verwende jetzt JUnit 4 um meine Daten zu parametisieren, allerdings hab ich bisher noch keine Möglichkeit gefunden die Daten auch zu externalisieren. Hat damit jemand schon Erfahrung bei JUnit 4?


----------

