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.
unit-testing
manizzzz
źródło
źródło
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.
źródło
Istnieje wiele rzeczy, które utrudniają testowanie kodu. Przypadkowo wiele z nich utrudnia także utrzymanie kodu:
źródło
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:
źródło
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.
Źle napisany zaprojektowany kod
Reliance stanu w innym zakresie
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.
Stan zewnętrzny / systemowy
Konkurencja
źródło
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.
źródło
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.
źródło