Singleton Unit Test



  • Hallo,

    man hört ja schlimme Sachen über das Singleton. Aber warum sollte es dazu führen dass man Unit Tests schlechter ausführen kann ? Wenn man die Unit Tests sequentiell ausführt sollte es doch kein problem sein oder ? Nur wenn man was parallelisieren möchte ?


  • Mod

    Kommt wohl stark auf die Sprache an, in den meisten Sprachen werden Unit-Tests modulweise ausgeführt. D.h. für manche Tests ist das Singleton bereits instanziert, für andere Tests nicht. Du kannst den State den das Singleton bearbeitet nicht wieder zurücksetzen. Ich schreibe inzwischen eigentlich sehr sehr selten Singletons, wenn ich der Meinung bin es darf nur eine Instanz geben regele ich das meistens über meinen DI-Container und nicht über das Singleton-Pattern. XYZManager-Singletons versuche ich ebenfalls zu vermeiden. Aber es gibt natürlich fallweise sicherlich Einsatzbereiche.

    Parallelisierung sehe ich da nicht einmal als größtes Problem, sollten die Tests parallelisiert werden muss eben auch das Singelton thread-safe sein.

    Nachtrag: hat die Klasse absolut keinen State (stateless service) bringt die Singleton-Registrierung kaum etwas, auch wenn es problemlos möglich wäre. Hat die Klasse State ist ein Singleton meist ein Hinweis auf eine versteckte globale Variable die die Abhängigkeit zwischen Modulen erhöht und die ich als schlechtes Design ansehen würde. Bleiben also wirklich nur noch rare Fälle wo externer State tatsächlich über ein Singleton angesprochen werden muss.

    MfG SideWinder



  • CanIDoIt schrieb:

    Hallo,
    man hört ja schlimme Sachen über das Singleton.

    Hängt anscheinend stark von der verwendeten Sprache ab. Und scheint mir ein akademisches Problem zu sein.



  • weil man sie schlecht durch mocks ersetzen kann



  • Es scheint Übermenschen zu geben, die bei impliziten Abhängigkeiten zwischen globalen Variablen den Überblick behalten können. Für alle anderen ist es sehr wertvoll beim Lesen und Debuggen zu wissen, dass das Verhalten einer Funktion in der Regel nur von den Argumenten abhängt und nicht von globalen Zuständen. Voneinander unabhängige Unit Tests sind mit globalen Variablen kaum möglich. Alle Tests verschwimmen zu einem einzigen Integrationstest. Die Übermenschen brauchen überhaupt keine Tests, also ist das auch egal.


Log in to reply