Główną wymówką dewelopera za brak dobrych testów jednostkowych jest „Kod nie został zaprojektowany w sposób testowany przez jednostkę”. Próbuję zrozumieć, jakiego typu projekt i kod nie mogą być testowane jednostkowo.
Główną wymówką dewelopera za brak dobrych testów jednostkowych jest „Kod nie został zaprojektowany w sposób testowany przez jednostkę”. Próbuję zrozumieć, jakiego typu projekt i kod nie mogą być testowane jednostkowo.
Odpowiedzi:
Kilka czynników może utrudniać testowanie kodu. W takim przypadku refaktoryzacja pomaga ulepszyć kod, aby był testowalny.
Kilka przykładów kodu, który prawdopodobnie byłby trudny do przetestowania:
function pGetDp_U(int i, int i2, string sText)
.Zauważ, że brak przejrzystej architektury nie sprawia, że kod jest trudny do testowania jednostkowego, ponieważ testy jednostkowe dotyczą małych części kodu. Niejasna architektura nadal miałaby negatywny wpływ na integrację i testowanie systemu.
Istnieje wiele rzeczy, które utrudniają testowanie kodu. Przypadkowo wiele z nich utrudnia także utrzymanie kodu:
Typowe przykłady kodu, który ludzie nie chcą testować jednostkowo:
Za pomocą fałszywego frameworka wszystkie te przykłady mogą być testowane jednostkowo. Wystarczy skonfigurować pozorne zamienniki wewnętrznych zależności.
Rzeczy, które naprawdę nie mogą być testowane jednostkowo:
Jest kilka obszarów, które mogą utrudnić pisanie testów jednostkowych. Chciałbym jednak podkreślić, że nie oznacza to, że należy odrzucić przydatne techniki po prostu dlatego, że mogą one zwiększyć złożoność testów. Podobnie jak w przypadku każdego kodowania , powinieneś zrobić własną analizę, aby ustalić, czy korzyści przewyższają koszty, i nie ślepo zaakceptować tego, co niektórzy przypadkowi faceci publikują w sieci.
Koszt większości z nich wymyka się spod kontroli, chyba że wiesz, co robisz. Niestety wielu często nie wie, jak korzystać z tych technik w celu złagodzenia takich rzeczy, jak testowanie złożoności.
Nie ma czegoś takiego jak kod, którego nie można przetestować. Istnieje jednak kilka przykładów kodu, który NAPRAWDĘ, NAPRAWDĘ trudny do przetestowania (do tego stopnia, że być może nie jest wart wysiłku):
Interakcje sprzętowe - Jeśli kod bezpośrednio manipuluje sprzętem (na przykład zapis do rejestru w celu przeniesienia urządzenia fizycznego), testowanie urządzenia może być zbyt trudne lub kosztowne. Jeśli użyjesz prawdziwego sprzętu do testu, może to być drogie, aby uzyskać odpowiednią informację zwrotną do uprzęży testowej (jeszcze więcej sprzętu!), A jeśli nie, musisz naśladować dokładne zachowanie obiektów fizycznych - nie jest to mała sztuczka w niektóre przypadki.
Interakcje z zegarem - jest to zwykle łatwiejsze, ponieważ prawie zawsze można kpić z funkcji zegara systemowego całkiem trywialnie. Ale kiedy nie możesz, testy te stają się niemożliwe do zarządzania - testy oparte na czasie rzeczywistym zwykle trwają długo, a z mojego doświadczenia wynika, że są bardzo kruche, ponieważ obciążenia systemu powodują, że rzeczy trwają dłużej niż powinny. , powodując niepowodzenia testu fantomowego.
Moje trzy główne grupy do tego to:
kod oparty na usługach zewnętrznych
systemy, które nie pozwalają testerom modyfikować stanu niezależnie od aplikacji.
środowiska testowe, które nie replikują konfiguracji produkcyjnej.
Tego najbardziej doświadczyłem jako programista, który został inżynierem ds. Kontroli jakości.