Co to jest normalny stosunek „linii funkcjonalnych kodu” do „linii testowych kodu”?

27

Jestem całkiem nowy w podejściu TDD i moje pierwsze eksperymenty mówią, że napisanie 1 linii kodu funkcjonalnego oznacza napisanie około 2-3 linii kodu testowego. Tak więc, na wypadek, gdy mam zamiar napisać 1000 LOC, cała baza kodu wraz z testami będzie około 3500 LOC.

Czy to jest uważane za normalne? Jaki jest stosunek w pisanym kodzie?

Andrey Agibalov
źródło
8
Tak, TDD ma kosztowną metkę!
EL Yusubov
6
twoja liczba 2-3X jest w najlepszym razie konserwatywna, w rzeczywistości jest bliższa 4-5X dla takich rzeczy jak C # / Java, Python / Ruby może być bliższa 2-3X, z czymś zwięzłym jak Erlang bliżej 1: 1. Zależy od tego, jak dogmatycznie podchodzisz do TDD, im bardziej dogmatyczny, tym większe są te stosunki!
6
@tomwrong: W książce Kenta cytuje Warda, że ​​należy pisać testy, dopóki strach nie przerodzi się w nudę.
herby
4
@ElYusubov: Nie zgadzam się, że to w ogóle „drogie”. Wydaje się, że tak jest dla tych, którzy nadal liczą ilość pracy w LOC. Ale cena nie jest podana w LOC, dotyczy pieniędzy i czasu wprowadzenia na rynek. I tam TDD nie jest droższe niż jakikolwiek inny rozsądny proces rozwoju.
herby
5
Ludzie, dlaczego komentujecie zamiast publikować odpowiedzi? To, co piszesz, ma sens.
Andrey Agibalov

Odpowiedzi:

18

1: 3 jest normalne w przypadku TDD.

Z mojego doświadczenia, a także z innych cytatów, które pamiętam.

herby
źródło
12
... jakie cytaty?
TehShrike,
... niejasno pamiętam ... Już nie pamiętam, gdzie to było (może w TDD Kent Becka na przykład, może gdzieś w c2.com). Pamiętam jednak, że trzy razy więcej kodu testowego niż kodu produkcyjnego jest w porządku.
herby
Wow, dokładnie tak samo z mojego doświadczenia. (Patrzę teraz na wyniki z cloc i szukałem google, aby znaleźć posty na ten stosunek)
Nikolay Tsenkov
9

Istnieją odmiany oparte na różnych stylach i językach kodowania. Jednak niezależnie od używanego języka największą odmianą jest Ty.

Robert Martin powiedział kiedyś:

„Gdy testy stają się bardziej szczegółowe, kod staje się bardziej ogólny.”

To sprawiło, że pomyślałem. Bardziej szczegółowe testy oznaczają więcej kodów testowych. Bardziej ogólny kod produkcyjny oznacza mniej kodu, więc stosunek test / kod powinien rosnąć w miarę ewolucji kodu.

Ale czekaj, to też nie jest dobre. W niektórych szczególnych przypadkach, na przykład podczas definiowania określonego algorytmu, możesz mieć tylko 6-10 wierszy kodu zawierających kilka „jeśli”, chwilę i może 2-3 rekurencje. Mogę powiedzieć, że ten kod będzie prawdopodobnie zawierał więcej 100 linii kodu testowego.

W prawdziwym projekcie, czymś większym niż kilka algorytmów, stosunek test / kod powinien wynosić od 1: 1 do 2: 1. Jeśli wzrośnie powyżej 2: 1, to zapach, że masz testy, które powinny być refaktoryzowane lub usunięte (lub może kod, który jest trudny do przetestowania). Zawsze powinieneś inwestować tyle samo uwagi i refaktoryzacji w swoje testy, co w kod produkcyjny.

W każdym razie najlepszą odpowiedzią na twoje pytanie może być „cykliczność złożoności” . Im wyższa cykliczność złożoności Twojej metody, tym wykładniczo więcej testu musisz napisać, aby objąć wszystkie przypadki.

Patkos Csaba
źródło
3

Proporcje będą się różnić w zależności od wielkości twoich metod. Rozmiar twoich metod będzie się różnić w zależności od stylu programowania, języka i dziedziny problemów.

Jeśli twoje metody są krótkie, 3: 1 jest rozsądne. Jeśli twoje metody są długie, 3: 1 jest na wysokim poziomie.

Tak więc, aby odpowiedzieć na twoje pytanie, to zależy. :-)

Jon Strayer
źródło
To zależy od tego, co rozumiesz przez „metody są długie”. To, co stworzyło w mojej głowie, to to, że metody są niepotrzebnie długie, wykonują zbyt dużo pracy i mają zbyt wiele obowiązków (często mają zbyt wiele parametrów). W takim przypadku taka metoda wymaga proporcjonalnie więcej kombinacji do pokrycia testami, więc nie sądzę, aby stosunek zmieniłby się znacznie ...
herby
Załóżmy, że możesz skonfigurować test, wywołaj testowaną metodę i sprawdź wynik w trzech liniach kodu. Jeśli testowana metoda ma długość jednego wiersza (jak ma to miejsce w Scali), wówczas stosunek do kodu produkcyjnego wynosi 3: 1. Jeśli metoda ma sześć linii, to 1: 2. Sześć linii nie jest aż tak długie.
Jon Strayer
2

W przypadku aplikacji o znaczeniu krytycznym zwykle stosuje się jeden dzień testów na każde 10 funkcjonalnych LoC.

I to nie liczy TDD, która nie dotyczy testu, ale specyfikacji.

mouviciel
źródło
1

Rozmiar mojego kodu testowego jest o połowę mniejszy niż „rzeczywisty” kod. Postępowanie w inny sposób wskazuje, że twoje testy są zbyt złożone i / lub twój kod jest zbyt trudny do przetestowania i / lub twój kod jest zbyt gęsty / złożony.

Albo po prostu testujesz za dużo i marnujesz czas na malejące zyski.

Zobacz także „kiedy testowanie jednostek jest nieodpowiednie lub niepotrzebne?”

Telastyn
źródło
-1

Mój stosunek wynosi około 2-1 do 10-1 (kod do przetestowania). Upewnij się, że testowanie dotyczy wartości / zachowania, a nie implementacji.

Erez A. Korn
źródło