Załóżmy, że używam TDD do stworzenia klasy A. Po tym jak skończyłem i mam "zielony" pasek, postanawiam, że chcę wyodrębnić niektóre klasy B tylko statycznymi metodami z klasy A za pomocą jakiegoś narzędzia do refaktoryzacji. Teraz mam klasę A i klasę B zarówno w pełni testowaną jednostkowo, ale tylko poprzez klasę testów dla klasy A. Czy powinienem teraz również stworzyć klasę testową specyficzną dla funkcjonalności klasy B, mimo że byłby to test duplikowania?Testowanie jednostek za pomocą innych klas testowych
Odpowiedz
Jak zawsze, to zależy od kontekstu. Na czym ci zależy?
Ogólnie zachowanie
Jeśli budujesz system do użytku wewnętrznego, a nawet publicznych (WWW) usługa, gdzie oprogramowanie jesteś dostarczane jest cały system, nie trzeba zbyt wiele dbać o jedną klasę. Jeśli budujesz system, przetestuj system.
Dopóki jest objęty testami, wiesz, że Twój system zachowuje się prawidłowo. Może się jednak zdarzyć, że po kilku miesiącach zdasz sobie sprawę, że nie potrzebujesz już oryginalnej klasy A
, więc usuń ją i odpowiadające jej testy jednostkowe. Może to spowodować zmniejszenie zasięgu testu o B
, więc dobrze jest mieć oko na trendy w zakresie pokrycia kodu.
zachowanie Jednostka
Jeśli budujesz (klasa) biblioteki lub ramy, jesteś dostarczane każdą klasę publiczną jako część produktu. Jeśli masz wielu użytkowników swojej biblioteki, musisz zacząć myśleć o tym, jak unikać łamania zmian.
Jednym z najbardziej skutecznych sposobów uniknięcia łamania zmian jest objęcie każdej klasy testami jednostkowymi. Tak długo, jak jesteś don't change the tests, wiesz, że zmiany łamania są mało prawdopodobne, jeśli wszystkie testy są zielone. Wymaga to jednak przetestowania wszystkich publicznych klas i członków.
Tak więc, jeśli wydasz B
na klasę publiczną, teraz jest to klasa, na której mogą polegać inni konsumenci, a zmiana ta byłaby przełomowa. Dlatego powinieneś pokryć go nowymi testami. Jeśli budujesz jednostkę, przetestuj urządzenie.
Oprócz odpowiedzi Marksa chciałbym dodać, że stworzenie takiej klasy jak B jest dla mnie zapachem kodu. Oczywiście nie musi tak być, ale jest prawdopodobne, że jego cel będzie niejasny i prawdopodobnie narusza zasady SOLID. Jeśli masz problemy z nazwaniem klasy, prawdopodobnie tak jest. – spacedoom
@spacedoom Czy to nie jest takie trudne? Wyodrębnienie klasy z innej klasy może być całkowicie poprawnym Refaktoryzacją. Fakt, że w tym przypadku jest statyczny może być zapachem kodu, ale ponieważ wiem, że jesteś fanem F #, być może klasa statyczna jest tylko modułem funkcjonalnym, czekającym na zmaterializowanie. Jednak SOLID to nie jest, zgadzam się z tym :) –
Z pewnością nie zamierzałem być szorstkim, tylko komentarzem skierowanym do obiektu i skierowanym obiektowo na pytanie oznaczone tagiem OC.Nie wybierałem ogólnie klas, tylko klasy takie jak B. Jestem prawie pewien, że jego nazwa będzie czymś w rodzaju Akaelki, a my tego nie chcemy, prawda? W każdym razie, jesteś cholernie dobry, byłoby lepiej, gdyby został napisany jako moduły funkcjonalne w F #! :) – spacedoom
Z opisanej odpowiedzi wynika, że należy utworzyć nowy test. W przypadku zmiany przez ciebie (lub kogoś, kto nie jest zaznajomiony z "testem wspólnym"), druga klasa nie będzie już testowana.
Jeśli wydaje się marnotrawstwem, umieścić wspólny kod testowy w trzeciej klasie ...
duplikatu: http://stackoverflow.com/questions/21482602/should-i-write-tests-for-class-a-if-its-covered-from-class-b/21482748#21482748 – Mik378
Nicea znajdź, dziękuję – jordan