Jak duży musi być mój projekt, aby go przetestować w jednostce? [Zamknięte]

86

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?

Lamin Sanneh
źródło
26
Wielkim błędnym założeniem jest to, że projekt jest tylko dla ciebie i tylko na razie . Co jeśli zostawisz to na kilka miesięcy, zrób coś innego, a potem wrócisz? Czy będziesz mieć taką samą pewność siebie, że jesteś „porządnym programistą” (co nie ma nic wspólnego z testowaniem)? Co jeśli ktoś inny przejmie twój projekt ...? Świetny bloger (niestety już nie aktywny) napisał , że zawsze powinieneś „zadbać o czytnik kodów, a nie programistów”.
Amos M. Carpenter
6
Co powiesz na to (przeznaczone dla C # .NET): int x = 3 * (1/3); jaka wartość jest przechowywana w x po zakończeniu operacji? Chodzi mi o to, że nawet jeden kod linii może wymagać testowania, ponieważ może prowadzić do błędu, albo dlatego, że nie wiesz, albo dlatego, że wiesz, ale zrobiłeś zły kod.
NoChance,
2
@ aaamos, myślę, że tęsknisz za moim celem. Fakt, że zadano mi to pytanie, świadczy o tym, że rozważam także obsługę czytnika kodów.
Lamin Sanneh,
13
Po zrobieniu tego w obie strony mogę Ci powiedzieć, że o wiele łatwiej jest pisać testy podczas pracy (tj. Gdy projekt jest niewielki) niż wracać i pisać testy jednostkowe później, gdy poczujesz, że projekt spotkał się z dowolnymi „ powinniśmy pisać testy teraz ”.
Wonko the Sane
1
Zadajesz złe pytanie. Nie ma znaczenia, jak duży jest ten projekt. Pytanie brzmi: ile cię obchodzi, czy to prawda? Jeśli poprawność jest ważna, testy jednostkowe są skutecznym sposobem na poprawienie poprawności.
Mark E. Haase

Odpowiedzi:

206

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.

    class Simple {
        boolean reallySimple() {
            return true; // how do we make sure it doesn't change to false?
        }
    }


    class SimpleTest {
        void assertReallySimple() {
            // ensure reallySimple return value isn't changed unexpectedly
            UnitTestFramework.assertTrue(new Simple().reallySimple());
        }
    }
komar
źródło
24
Na pewno powinieneś zacząć wcześniej, w punkcie funkcji 0 klasa / 0 ... jeśli śledzisz TDD :)
Kaz Dragon
115
+1. Jeśli program jest wystarczająco duży, aby mieć błędy, jest wystarczająco duży, aby mieć testy jednostkowe.
Jason Orendorff,
9
@JasonOrendorff: Kpię z plakatu i umieszczam w moim biurze. Znakomity.
Justin ᚅᚔᚈᚄᚒᚔ
Dodatkowo pozwala na „bezpieczne” refaktoryzację.
Timo
7
Chociaż niekoniecznie nie zgadzam się z tym sentymentem, jeśli twój kod jest naprawdę tak prosty, prawdopodobnie możesz uciec od samych twierdzeń zamiast pełnych testów jednostkowych.
Chuu,
109

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:

  1. Pomagamy upewnić się, że zmiany nie psują rzeczy.
  2. Pomagamy zaprojektować rozsądne interfejsy do twoich klas (ponieważ zmusza cię do bycia klientem własnego kodu).
  3. Pomoc w udokumentowaniu sposobu użycia kodu.

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.

Vaughandroid
źródło
8
Zgadzam się z tym - pracując w jednym sklepie dla programistów, musisz znaleźć równowagę między jakością oprogramowania a testowaniem wszystkiego (co może zająć dużo czasu). Nie zapominaj, że za każdym razem, gdy wprowadzasz zmiany, może być konieczne zmodyfikowanie testów jednostkowych, aby pasowały
Matt Wilko
1
Nie powinieneś testować wszystkiego, ale powinieneś przetestować każde zachowanie, które jest narażone na świat zewnętrzny. Testowanie wiąże się z pewnymi kosztami utrzymania i, jak powiedział Kent Beck w odpowiedzi SO (myślę, że to SO) - wystarczy przetestować, aby mieć pewność, że kod jest poprawny.
Wayne Werner,
10
Dodam, że jeśli wykonujesz tylko minimalne testy automatyczne, testy jednostkowe są niewłaściwym poziomem docelowym. Zamiast tego przejdź do testów integracji / dymu na wysokim poziomie, które przepychają kilka zestawów danych przez całą aplikację bez wyśmiewania czegokolwiek. Chcesz, aby testy te wykonywały jak najwięcej bazy danych i obejmowały wszystkie normalne przypadki użycia i ścieżki wykonywania. 75% szansa, że ​​wiesz, że Twoje zmiany coś zepsuły, jest w aplikacji bardziej korzystne niż 5% szansa, że ​​wiesz, że złamałeś SomeClass.OneOfTheHandfulOfTestedFunctions ().
Dan Neely
3
Myślę, że przegapiłeś jeden: „Upewnij się, że kod działa tak, jak powinien!”
BlueRaja - Danny Pflughoeft
3
@ BlueRaja-DannyPflughoeft: Właściwie dokładniej byłoby powiedzieć: „Upewnij się, że kod pomyślnie przejdzie testy jednostkowe, które napisałeś!”
vaughandroid
34

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.

Kilian Foth
źródło
22
Programiści notorycznie źle oceniają własne umiejętności przewidywania przyszłości
superM
3
@ superM Zgadzam się z tobą. Program „uciekaj raz i wyrzuć”, który napisałem już podczas mojej krótkiej kariery, pozostał, był prowadzony co kilka dni i stał się krytyczny dla biznesu. Nazywam to „tymczasowym”, czyli tymczasowo-trwałym efektem .... westchnienie
Jalayn
@Jalayn Czy odpowiedź nie jest po prostu taka, że ​​należy wrócić i dodać testy jednostkowe, gdy tylko ta realizacja się pojawi?
Cornel Masson,
@CornelMasson Masz absolutną rację, spodziewaj się, że często trudno jest przekonać menedżerów, że „jeszcze nie jest skończony”, ponieważ brakuje testów :-)
Jalayn
@Jalayn: Too true!
Cornel Masson,
22

Jakiś czas temu znalazłem fajny post: Dlaczego testowanie jednostkowe przyspiesza rozwój . Może pomóc ci odpowiedzieć na pytanie.

... Co jeśli baza kodów ... została wyposażona w znaczny zestaw testów jednostkowych. Zestaw, który powiedziałby: „jeśli wszystkie testy zakończą się powodzeniem, gwarantuję, że kod nadal robi to, co powinien”, a jeśli test się nie powiedzie, dokładnie pokazuje, gdzie niektóre zachowanie jest zepsute. To wspaniale, mogłem zmienić kod, aby dodać rzeczy, które chcę, bez błąkania się, jeśli kod nadal robi to, co powinien, po prostu uruchamiam ... testy i mam wiarę. To świetny świat dla inżynierów oprogramowania. Zauważyłem, że mogę przejść znacznie szybciej ...

Wierzę".

Jest to prawdopodobnie najważniejszy powód, dla którego testy jednostkowe przyspieszają rozwój w kontekście przedsiębiorstwa.

Mogę ufać, że wszystko nadal działa, jeśli wszystkie testy zakończą się pomyślnie. Jeśli testy zakończą się niepowodzeniem, wskażą dokładnie, gdzie leży problem ...

... musisz mieć wysoki zasięg testów jednostkowych i dobre testy jednostkowe . Po spełnieniu tych warunków znajdziesz się w sytuacji, w której wysiłek dodania nowych funkcji jest prawie niezależny od wielkości aplikacji i że w dłuższej perspektywie przyspieszy rozwój .

Michael Feathers przedstawił w jednej ze swoich książek dwa sposoby pracy ze zmianami w kodzie:

  • edytuj i módl się,
  • przykryć i zmodyfikować.

Nie ma znaczenia, jak duża jest baza kodu.

Marcin Sanecki
źródło
18

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.

Jeśli zwykle nie popełniam błędu (np. Ustawienie niewłaściwych zmiennych w konstruktorze), nie testuję go.

Mansuro
źródło
4
Dobra uwaga, a to sugeruje, że pytanie PO jest błędne; czy test nie ma nic wspólnego z rozmiarem projektu. 5-liniowa baza kodowa może wymagać testów, a metoda 1-liniowa w dużej bazie kodowej może nie (choć inne rzeczy w tej bazie kodowej tak robią).
Nathan Long,
Może to działać w przypadku małych projektów, nad którymi pracujesz sam, ale w przypadku projektu, który jest wykonywany do pracy (gdzie nie masz kontroli, kto będzie nad nim pracował w przyszłości) lub cokolwiek, co może być open source, potrzebujesz przetestować wszystko. I trzeba rozpocząć natychmiast, ponieważ później będzie to „zbyt trudne, aby zasypywać cały kod, który jest już napisane”
xaxxon
@xaxxon: Kent faktycznie o tym mówi w tej samej odpowiedzi, do której podłączył Mansuro, mówiąc: „Kodując w zespole, modyfikuję strategię, aby dokładnie przetestować kod, który wspólnie popełniamy błąd”.
henko,
Nie, to wciąż niezwykle krótkowzroczność. Nie możesz wiedzieć, kto będzie pracował nad kodem w przyszłości. Jest to sposób myślenia, który dotyka młodszych programistów.
xaxxon
5

Testy jednostkowe są wdrażane w celu zaoszczędzenia czasu i poprawy:

  • śledzenie błędów
  • refaktoryzacja i / lub przepisywanie kodu
  • testy integracyjne
  • testy regresji itp.

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.

superM
źródło
Ogólnie dobra odpowiedź, więc +1. Myślę jednak, że w końcowym punkcie pomija się fakt, że nadal będziesz chciał / musisz ręcznie przetestować testy jednostkowe!
vaughandroid
@Baqueta, może nie brzmiałem wyraźnie, ale nie chciałem powiedzieć, że testy jednostkowe całkowicie zastępują testy ręczne
superM
4

„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.

Bryan Oakley
źródło
4

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.

Mark Booth
źródło
3

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.

ZJR
źródło
1
Widzę, że masz rację, ale to nie jednostka testuje podstawowy punkt wyjścia dla programistów startowych. A także czy mógłbyś bardziej szczegółowo wyjaśnić, co rozumiesz przez „testowanie ogólnie”. Dzięki.
Lamin Sanneh
1
Istnieją co najmniej dwa inne typy testów - test integracji i test akceptacyjny. Testy jednostkowe obejmują określoną jednostkę (np. Ta funkcja tej klasy ma Frab the Fizz). Wyśmiewasz / usuwasz wszystkie inne miejsca, w których ta klasa oddziałuje, przekazując jej fałszywe dane. Wykonując testy integracyjne, łączysz dwie (lub więcej) klasy, aby upewnić się, że Twoje klasy idą razem tak, jak powinny. W końcu tworzysz wystarczającą liczbę testów, aby przeprowadzić kompleksowe testy całego systemu, czasami nazywane „testami dymu”.
Wayne Werner,
Istnieje również regres testujący sąd. Testy regresji są zwykle większe niż testy jednostkowe, ich kompilacja może zająć dzień, może oznaczać dostęp do danych testowych i specjalnych środowisk testowych. W rzeczywistości testy jednostkowe są mniejszą, bardziej elegancką i łatwiejszą do utrzymania wersją (w starym stylu) testów regresji.
ZJR
1

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.

Eivind Eidheim Elseth
źródło
0

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.

John Dahle
źródło
-1

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.

Niks
źródło