Z mojego doświadczenia design-by-umowy jest warte zrobienia, nawet bez wsparcia językowego.W przypadku metod, które nie są przesłonięte asercje, wraz z docstrings są wystarczające zarówno dla warunków wstępnych i post. W przypadku nadpisywanych metod dzielimy metodę na dwie: metodę publiczną, która sprawdza warunki przed i po, oraz metodę chronioną, która zapewnia implementację, i może być nadpisana przez podklasy. Oto przykład tego ostatniego:
class Math:
def square_root(self, number)
"""
Calculate the square-root of C{number}
@precondition: C{number >= 0}
@postcondition: C{abs(result * result - number) < 0.01}
"""
assert number >= 0
result = self._square_root(number)
assert abs(result * result - number) < 0.01
return result
def _square_root(self, number):
"""
Abstract method for implementing L{square_root()}
"""
raise NotImplementedError()
mam pierwiastkowania jako ogólny przykład wzornictwa-by-umowy z epizodu na design-by-umowy w radiu oprogramowania inżynierskiego (http://www.se-radio.net/2007/03/episode-51-design-by-contract/). Wspomnieli również o potrzebie wsparcia językowego, ponieważ twierdzenia nie były pomocne w zapewnieniu zasady substytucji Liskova, chociaż mój przykład powyżej ma na celu wykazanie, że jest inaczej. Powinienem również wspomnieć o idiomie C++ pimpl (implementacja prywatna) jako źródle inspiracji, choć ma on zupełnie inny cel.
W mojej pracy niedawno refaktoryzowałem ten rodzaj sprawdzania kontraktów w większej hierarchii klas (umowa była już udokumentowana, ale nie została systematycznie przetestowana). Istniejące testy jednostkowe wykazały, że umowy były wielokrotnie naruszane. Mogę tylko dojść do wniosku, że powinno to być zrobione dawno temu, a zakres testów jednostkowych opłaca się jeszcze bardziej, gdy zastosuje się projekt na podstawie umowy. Oczekuję, że każdy, kto spróbuje tej kombinacji technik, wykona te same obserwacje.
Lepsze wsparcie narzędziowe może zaoferować nam jeszcze większą moc w przyszłości, z zadowoleniem przyjmuję to.
Należy pamiętać, że można po prostu dziedziczyć z TestCase i obejmować testy jednostkowe w dowolnej klasie. – Marcin
W porządku, ale DBC jest nieco inny, ponieważ uruchamia kontrole produkcji i wszystkich danych wejściowych. Z tego co rozumiem Testy Jednostek są zachowywane w środowisku wykonawczym z predefiniowanym zbiorem danych, podczas gdy DBC jest poziomem powyżej, który zapewnia wszystkie dane wejściowe. W szczególności, myślę, że sensowne jest używanie DBC w moim przypadku, ponieważ znaczna część kodu jest naprawdę ciężka i często musi uzyskać stan z zewnętrznego DB z często zmieniającym się schematem i dość złożonymi relacjami, które są bardzo kłopotliwe w makrofotografii. . – ipartola
Projektowanie za pomocą umowy to miejsce, w którym wyraźnie określa się specyfikację, z którą odpowiada każdy kod. Nie musisz go testować w pełnym czasie pracy. Testy jednostkowe mogą być tą specyfikacją tak samo jak cokolwiek innego. TDD to inny sposób korzystania z testów jednostkowych, w tym przypadku do modelowania oczekiwanego zestawu zachowań. – Marcin