Wenn man zwei verschiedene Implementierungen gegen das gleiche Interface hat, die sich nach vorne hin auch gleich verhalten sollen, kann man dafür auch die gleichen Tests verwenden.
Nur wie bekommt man NUnit dazu, die gleichen Tests zweimal mit unterschiedlichen Konfigurationen (sprich: Setups) auszuführen?
Nehmen wir an, wir haben ein klassisches Repository gegen verschiedene Persistenzimplementierungen und möchten diese nun testen.
Dazu haben wir also RepositoryA und RepositoryB. Typischerweise haben wir nun TestRepositoryA und TestRepositoryB um die Tests zu machen. Da diese hier inhaltlich gleich wären und nur die Instanzierung des Repositories unterschiedlich ist, wäre dies unnötig doppelter Code.
Die Lösung ist nun, für die beiden Testklassen eine abstrakte Oberklasse zu definieren, in der die Tests enthalten sind. Davon leiten wir zwei Klassen ab – je eine pro Repository – in der wir das Setup durchführen.
Das Ganze kann dann etwa wie folgt aussehen:
- TestRepositoryAbstract
- public void Test1()
- public void Test2()
- public void Test3()
- TestRepositoryA : TestRepositoryAbstract
- public void Setup()
- TestRepositoryB : TestRepositoryAbstract
- public void Setup()
In den Setup-Methoden der konkreten Klassen werden die jeweiligen Einstellungen für die Repositories vorgenommen (sinnvollerweise mit Hilfe einer Factory).
NUnit ruft die Tests für alle konkreten Klassen auf. In diesem Fall also für TestRepositoryA und TestRepositoryB; die Tests werden also – wie gewünscht – zweimal ausgeführt .
Auf diese Weise spart man sich eine Menge doppelten Code.