Zakładam, że mój projekt jest wystarczająco oddzielony, aby umożliwić testy jednostkowe. Ale ile dokładnie, jeśli chodzi o klauzule i funkcje, mój projekt musi być, aby opłacalne były testy jednostkowe?
Wszyscy popełniamy błędy i nikt nie jest doskonały, ale uważam się za przyzwoitego programistę, który radziłby sobie z błędami małych projektów podczas przechodzenia. Czy testowanie jednostkowe jest trudną koniecznością bez względu na rozmiar projektu?
Odpowiedzi:
Twój projekt jest już wystarczająco duży.
Z mojego doświadczenia wynika, że jedna klasa i jedna funkcja były wystarczające do rozważenia potrzeby testów jednostkowych.
źródło
Nigdy nie kupiłem pomysłu „musisz wszystko przetestować”, choć z pewnością są ludzie, którzy mają (patrz odpowiedź komara !).
Moim zdaniem główne zalety testów jednostkowych to:
Zasadniczo musisz zastanowić się, ile czasu zajmie Ci napisanie i przeprowadzenie testów w odniesieniu do tych czynników.
Liczba 1 zwykle wystarcza, aby warto pisać testy. Z mojego doświadczenia wynika, że> 95% kodu zostanie zmodyfikowane prędzej czy później.
źródło
To proste: nie potrzebujesz testów jednostkowych, jeśli odrzucisz program po jego uruchomieniu.
Jeśli wydaje ci się to nadmierne, zastanów się, co oznaczałoby alternatywa. Gdyby istniała jakaś wielkość, poniżej której testy jednostkowe się nie opłaca, musiałbyś nadal oceniać: „Czy osiągnąłem już magiczny rozmiar? Czy powinienem zacząć pisać testy?” Teraz programiści notorycznie źle przewidują przyszłość i notorycznie źle oceniają własne umiejętności. Kod, który wydaje się teraz dla ciebie krystalicznie czysty, stanie się niezrozumiały, nawet dla ciebie, nawet przez miesiąc oczekiwania. Projekt, w którym jesteś absolutnie, pozytywnie pewien, nigdy nie zostanie ponownie użyty, i że trzymasz się przy sobie tylko na odległość, że możesz chcieć sprawdzić, jak coś wcześniej rozwiązałeś, zostaniesz ponownie poproszony i otrzymasz prośby o zmianę.
Jest zatem bardzo prawdopodobne, że źle ocenisz, czy testowanie jest pomocne, a kiedy zaczniesz potrzebować testów, nie jesteś już w 100% pewien, jaka jest dokładna semantyka do przetestowania. Ponieważ uważam, że wszystkie poza trywialnymi programami jednorazowymi korzystają z testów jednostkowych, uważam, że koszt poświęcenia wysiłku na testy, które nigdy nie zostaną ponownie uruchomione, jest nieistotny w stosunku do ryzyka rozszerzenia nieprzetestowanego i niezrozumiałego kodu.
źródło
Jakiś czas temu znalazłem fajny post: Dlaczego testowanie jednostkowe przyspiesza rozwój . Może pomóc ci odpowiedzieć na pytanie.
Michael Feathers przedstawił w jednej ze swoich książek dwa sposoby pracy ze zmianami w kodzie:
Nie ma znaczenia, jak duża jest baza kodu.
źródło
Według Kenta Becka w odpowiedzi na pytanie Przepełnienie stosu Jak głębokie są twoje testy jednostkowe? , powinieneś przetestować kod, który często się myli.
źródło
Testy jednostkowe są wdrażane w celu zaoszczędzenia czasu i poprawy:
Konieczne jest napisanie testów jednostkowych dla stosunkowo skomplikowanych części programu.
Jeśli masz pewność, że pisanie testów jednostkowych nie zaoszczędzi czasu w przyszłości, możesz go pominąć. Jednak nigdy nie wiadomo i osobiście nie mogę wymyślić przypadku, w którym taniej (pod względem czasu, pieniędzy i nerwów) nie jest pisanie testów jednostkowych, a zamiast tego wszystkie testy wykonuje się ręcznie.
źródło
„Czy powinienem to przetestować za pomocą urządzenia?” Zazwyczaj można odpowiedzieć, odpowiadając na następujące pytanie: „Czy ważne jest, aby ta funkcja działała poprawnie i czy muszę wiedzieć, kiedy przestanie działać?”
Oczywiście jest to o wiele bardziej skomplikowane, ale to dobry początek. W końcu będziesz również oceniać, czy kod jest już testowany pod kątem użycia go w innej funkcji, czy lepiej poświęcić czas na inną funkcję itp.
źródło
O ile nie napiszesz kodu bez testowania go, zawsze poniesiesz koszty testowania.
Różnica między posiadaniem testów jednostkowych a ich brakiem to różnica między kosztem napisania testu a kosztem jego przeprowadzenia w porównaniu z kosztem ręcznego testowania.
Jeśli koszt napisania testu jednostkowego wynosi 2 minuty, a koszt przeprowadzenia testu jednostkowego wynosi praktycznie 0, ale koszt ręcznego przetestowania kodu wynosi 1 minutę, to łamiesz się nawet po dwukrotnym uruchomieniu testu.
Przez wiele lat nie rozumiałem, że nie mam wystarczająco dużo czasu na napisanie testów jednostkowych dla mojego kodu. Kiedy pisałem testy, były rozdęte, ciężkie rzeczy, które tylko zachęciły mnie do myślenia, że powinienem pisać testy jednostkowe tylko wtedy, gdy wiedziałem, że są potrzebne.
Ostatnio zachęciłem mnie do korzystania z Test Driven Development i uznałem, że jest to kompletna rewelacja. Jestem teraz głęboko przekonany, że nie mam czasu, aby nie pisać testów jednostkowych .
Z mojego doświadczenia wynika, że rozwijając się z myślą o testowaniu, otrzymujesz czystsze interfejsy, bardziej skoncentrowane klasy i moduły oraz ogólnie bardziej SOLIDNY , testowalny kod.
Za każdym razem, gdy pracuję ze starszym kodem, który nie ma testów jednostkowych i muszę coś ręcznie przetestować, ciągle myślę „byłoby to o wiele szybsze, gdyby ten kod miał już testy jednostkowe”. Za każdym razem, gdy próbuję dodać funkcjonalność testu jednostkowego do kodu z wysokim sprzężeniem, ciągle myślę „byłoby to o wiele łatwiejsze, gdyby zostało napisane w sposób oddzielony”.
Wersja TL; DR :
Napisz test, gdy koszt napisania testu plus koszt jego przeprowadzenia tyle razy, ile potrzebujesz, będzie prawdopodobnie mniejszy niż koszt ręcznego przetestowania go tyle razy, ile potrzebujesz.
Pamiętaj jednak, że jeśli korzystasz z TDD, koszty pisania testów prawdopodobnie spadną, gdy będziesz w tym lepszy, i chyba że kod jest absolutnie trywialny, prawdopodobnie skończysz przeprowadzanie testów częściej niż się spodziewasz.
źródło
Przetestuj, gdy tylko zauważysz regresje lub strach wywołuje pewne zmiany i nie zauważasz.
Rozwiń ten strach, pozwól mu osiągnąć odpowiedni rozmiar: im wcześniej przetestujesz, tym lepiej.
Uwaga: w zależności od roli w projekcie testy jednostkowe mogą nie być jedynym rodzajem testów, które chcesz napisać.
Wszyscy mają słuszną obsesję na punkcie testów jednostkowych z powodu złych praktyk testowania głównego nurtu w przeszłości; ale jeśli nigdy wcześniej nie testowałeś, naprawdę powinieneś skupić się na testowaniu , samo testowanie jednostkowe nie rozwiąże problemów świata.
źródło
Uważam, że to nie wielkość projektu, ale rodzaj projektu decyduje o tym, czy należy użyć testowania, czy nie.
Jeśli pracujesz nad próbą koncepcji lub nad jakimś innym projektem, którego celem jest nauczenie się kodowania, testowanie nie jest wymagane. Jeśli projekt ma być wykorzystany, a może nawet wysłany do produkcji, należy go przetestować.
Cytat z „Czystego kodu” Roberta C. Martina : „Jeśli pisanie jest trywialne, testowanie jest trywialne”, więc nie ma usprawiedliwienia dla pominięcia testowania krótkich i trywialnych programów.
źródło
To naprawdę nie jest kwestia rozmiaru - chodzi o to, co z nim zrobisz (i ile ma lat). Jeśli mam ochotę dowiedzieć się, jak działa technologia i planuję ją wyrzucić (nazywamy to skokiem w Scrumie), po prostu koduję bez przeprowadzania wielu testów. Jeśli planujesz dalej go rozwijać (nawet jeśli po prostu masz ochotę), powinieneś napisać testy wokół kodu. TDD jest techniką projektową, nawet zanim była techniką testową. Chcesz mieć jasny obraz tego, co chcesz zrobić w kodzie, zanim związasz się szczegółami wykonania. Ja też NIEzalecamy próbę napisania obszernych testów jednostkowych wokół dużych ilości starszego kodu. Spróbuj zidentyfikować te części, które są złożone (mają wysoką cykliczność / wyczuwalny kod spaghetti) i te części, które często zawodzą (często będą takie same). Jak sugerują inni, przeczytam książkę Kenta Becka na temat TDD i zdecydowanie przeczytam książkę Michaela Feather. To, czego nie obejmują bardzo, to polityczny aspekt pisania testów jednostkowych wokół kodu. Wielu programistów nie lubi modyfikować kodu, aby był testowalny, a wielu programistów wcale nie odczuwa potrzeby testowania kodu. Jest to coś, nad czym musimy pracować jako zawód. Każda inna dyscyplina inżynierska musi udowodnić (często matematycznie), że ich praca jest zgodna ze specyfikacją. Powinniśmy zrobić to samo.
źródło
Powiązanie projektów w granicach klas lub funkcjonalności, a następnie ocena, czy jest to odpowiednie do testów jednostkowych, może być błędne. Testowanie jednostkowe aplikacji ma wiele zalet, ale prawdziwe piękno zaczyna się, gdy trzeba utrzymać aplikację lub pracować w środowisku rozproszonym. Tak więc wybór jest tutaj. Nawet niewielka zmiana w kodzie może powodować katastrofy.
Nie tylko sugerowałbym „Testowanie jednostkowe”, ale również zaleciłbym sprawdzenie zasięgu kodu, upewniając się, że maksimum kodu jest pokryte Testem jednostkowym. Próg pokrycia kodu nie może być mniejszy niż 95%, a cel musi wynosić około 100% . Możesz wybrać narzędzia do śledzenia zasięgu kodu i wygenerowania raportu.
Visual Studio zapewnia dane pokrycia -http://msdn.microsoft.com/en-us/library/ms182496(v=vs.80).aspx
Można również użyć NCover lub dotCover.
źródło