In Python, wie Schreibe ich unit-tests, die Zugriff auf private Attribute, ohne dass diese?
Ich versuche zu verbessern, wie Schreibe ich meine Testfälle für meine Python-Programme. Ich bin zu bemerken, in einigen Fällen, es wäre wirklich hilfreich, wenn Sie Zugriff auf private member, um sicherzustellen, dass eine Methode funktioniert. Ein Beispiel wäre, wenn Sie versuchen zu testen, Sie eine Methode für das richtige Verhalten, die keine erwartete Rendite anderen Wert als "None". Ich weiß, die einfachen und falschen Weg, dies zu tun wäre, nur machen die privaten Attribute in den protected-Attribute statt, und testen Sie Sie direkt. Allerdings würde ich gerne einen Weg finden, dass doesn ' T setzen Sie die Schnittstelle so viel.
So, wie kann ich testen, private Attribute innerhalb der Klassen, ohne dass diese in die Schnittstelle, oder, falls zutreffend, eine bessere Möglichkeit zum testen ein solches Szenario, so dass der private Attribut-Zugriff ist nicht unbedingt nötig für eine korrekte unit-Tests?
Dies ist ein heikles Thema; einige Richtlinien, die sagen, wenn es privat ist, es muss nicht getestet werden!
was
_var1
und __var2
als protected und private, jeweils?Ich bin einverstanden mit @glowcoder, Ihre unit-tests sollen nur test ausgesetzt Funktionalität Ihrer Objekte. Also, wenn etwas versteckt ist, nur die interne Methoden verwenden sollten. Alles, was Sie (und Ihre tests auch) müssen wissen (und testen) über Ihr Objekt sind öffentliche Eigenschaften.
Manchmal ist es sinnvoll, in der Lage sein, um Tests der internen Methoden der Klasse, da alle Pfade richtig zu testen wäre auch dadurch erschwert, wenn der Aufruf von öffentlichen Methoden. Aber das bedeutet in der Regel muss Ihre Klasse split-refactoring in mehrere kleinere Teile, so würde ich gehen mit allen anderen: privaten, nicht testen. Es sollte abgedeckt werden durch Ihre Prüfungen der öffentlichen Methoden.
InformationsquelleAutor grg-n-sox | 2011-11-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin gonna go off in eine andere Richtung...
Versuchen zu schreiben unit-tests, die behaupten, Verhalten in der öffentlichkeit gegenüber den privaten Zustand. Können sagen, Sie rufen Ihre void Methode A (), das ändert den internen Zustand. Nun, wenn die Methode aufgerufen wird und der Staat nicht ändern, wird es einige beobachtbare Veränderung in Ihrem kleinen code-Universum. Vielleicht B() verhält sich jetzt anders. Also mein test wäre... (trivialisierung Beispiel)
Vermeiden Unangebrachte Intimität zwischen dem test und dem SUT.
command-Klasse wirkt auf einen Befehl Ziel. Man könnte also erstellen Sie ein command-Objekt übergeben, in der Ziel-als ctor-parameter. Anruf Ausführen und dann behaupten, auf die erwartete Veränderung auf den Befehl target. ODER Sie könnten isolieren Sie den Gegner von der Kommandozeile durch das erstellen einer Ziel-interface / Rolle zwischen Ihnen. Dann übergeben Sie in einem mock-Befehl als ctor-parameter & einfach behaupten, dass der Befehl ruft die passenden Methoden an der Schnittstelle.
Danke für die Antwort!
Ich bin mir nicht sicher, dass unangemessene Intimität ist eine gute Sache, 100% der Zeit für unit-tests. Wenn Ihre tests Einbettung eine komplexe Logik, wenn Sie wollen, dass Sie unit tests ist es besser, zu testen, die kleiner Bestandteil dieser Logik.
InformationsquelleAutor Gishu
Nichts ist privat in Python. Wenn Sie mit dem doppelten Unterstrich Präfix auf member-Variablen, der name ist einfach entstellt. Sie können darauf zugreifen, indem die Qualifizierung der Namen in der form
_Class__member
. Dies wird Zugriff auf die__member
variable in der KlasseClass
.Siehe auch diese Frage: Warum sind Python 's" private " Methoden, die nicht eigentlich privat?
_Class__member
Es ist nicht privat, nur entstellt. Es in keiner Weise verhindert, dass Sie Zugriff auf die member, die es einfach erfordert, dass Sie springen durch einen Reifen, um auf Sie zuzugreifen.
InformationsquelleAutor Fred Larson