Elegante (N)Unit Tests für das Strategy Pattern

Der Sinn des Strategy Patterns liegt ja normalerweise darin, das selbe Ergebnis auf mehrere Arten berechnen zu können. Demnach macht es Sinn beim Unit Testing für die Schnittstelle der Strategy Testfälle zu definieren, die von allen Implementierungen durchlaufen werden.

NUnit bietet dazu eine sehr komfortable und einfache Möglichkeit. TestFixtures können einfach voneinander erben. Im Testrunner werden auch Testfälle einer vererbten Klasse berücksichtigt und sogar optisch hervorgehoben.

Als Beispiel dient ein Design aus DonkeyTrace:

Der SourceMarkerAnalyzer ist eine abstrakte Strategie, um eine Assembly nach bestimmten Attributen zu scannen. Zwei konkrete Strategien implementieren die abstrakte Strategie. Wenn die gleiche Assembly übergeben wird, müssen beide Implementierungen das gleiche Ergebnis liefern.

Definieren wir also zunächst die Testfälle, die das Verhalten unserer Strategy definieren:

Wichtig ist, dass diese Klasse nicht als „TestFixture“ attributiert wird. Diese Testfälle können in dieser Klasse noch nicht ausgeführt werden.

Dazu muss ein TestFixture definiert werden, welches von dem „abstrakten TestFixture“ erbt und die zu testende Strategie zuweist.

In dieser Klasse müssen keine Testfälle mehr definiert werden.

Es ist aber natürlich möglich, Testfälle hinzuzufügen, die sich nur auf die konkrete Strategy beziehen:

In diesem Fall wird getestet, ob eine Fallbacklösung eingesetzt wird, falls keine PDB-Datei verfügbar ist, was spezifisch für die konkrete PDB-Strategie ist.

Und so sieht das Resultat dann im Runner aus:

Wow, NUnit ist und bleibt einfach das beste Unit Testing Tool für .NET!