Wenn die Testkonfiguration stark überlappt, kann DRY die Vererbung beibehalten. Aber dies führt zu Problemen mit unnötiger Doppeltestausführung:Warum führen Tests in abgeleiteten Klassen die Elternklasse-Tests erneut aus?
from unittest import TestCase
class TestPotato(TestCase):
def test_in_parent(self):
print 'in parent'
class TestSpud(TestPotato):
def test_in_child(self):
print 'in child'
Prüfung dieses Modul der test_in_parent
zweimal ausgeführt wird.
$ python -m unittest example
in parent
.in child
.in parent
.
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
Warum? Ist das Absicht? Kann es deaktiviert werden, indem der Test Runner auf eine bestimmte Art konfiguriert wird?
Ich kann das Problem umgehen, indem Sie Setup in eine nicht entdeckte Klasse verschieben, und dann mehrere Erben verwenden, aber es scheint ein bisschen hacky und unnötig.
Anmerkung: Das gleiche Problem tritt bei anderen Läufern wie Nase (nosetests -s example.py
) und pytest (py.test example.py
)
Weil sie die Testmethoden ihrer Eltern erben, also wenn 'unittest' durch ihre' dir' (oder '__dict__' aussieht oder was auch immer es tut) Für Methoden, die 'test_' starten, findet man auch die ererbten. Ich glaube nicht, dass das Lösen * multiple * Vererbung erfordert; abstract was beide zu einer dritten, nicht zu entdeckenden Klasse ohne 'test_' Methoden benötigen und sie beide erben lassen. – jonrsharpe
Das Einsehen einer Unterklasse mit einer Elternklasse, die Methoden enthält, denen test vorangestellt ist, zeigt die Unterklasse mit diesen Methoden an. Dies ist Python OOP. Ich denke nicht, dass das Verschieben von Setup-Methoden zum Mixen oder als separate Basisklasse überhaupt hacky ist und vielleicht DRYer – dm03514
Scheint wie ein großartiger Anwendungsfall für Mixins für verschiedene "Gruppen" von Tests, um den genauen Test dynamisch zu erstellen. ..Tree-Vererbung sieht hier nicht wie das richtige Modell aus. – Shashank