thetalkingwalnut pyta:
Jakie są dobre sposoby przekonania sceptycznych programistów do zespołu o wartości testów jednostkowych?
Każdy z nas będzie miał wiele powodów, dla których testowanie jednostkowe jest dobre. Uważam jednak, że często najlepszym sposobem przekonania kogoś do czegoś jest wysłuchanie jego argumentacji i zajęcie się nim punkt po punkcie. Jeśli słuchasz i pomagasz im wyrazić swoje obawy, możesz zająć się każdym z nich i być może przekonwertować je na swój punkt widzenia (a przynajmniej zostawić je bez nogi). Kto wie? Być może przekonają cię, dlaczego testy jednostkowe nie są odpowiednie dla twojej sytuacji. Mało prawdopodobne, ale możliwe. Być może, jeśli opublikujesz ich argumenty przeciwko testom jednostkowym, pomożemy zidentyfikować kontrargumenty.
Ważne jest, aby wysłuchać i zrozumieć obie strony argumentu. Jeśli spróbujesz zbyt gorliwie przeprowadzać testy jednostkowe bez względu na obawy ludzi, zakończysz wojnę religijną (i prawdopodobnie naprawdę bezwartościowe testy jednostkowe). Jeśli zastosujesz go powoli i zaczniesz od zastosowania go tam, gdzie zobaczysz najwięcej korzyści przy najniższych kosztach, możesz być w stanie wykazać wartość testów jednostkowych i mieć większą szansę przekonania ludzi. Zdaję sobie sprawę, że to nie jest tak proste, jak się wydaje - zwykle wymaga trochę czasu i dokładnych wskaźników, aby stworzyć przekonujący argument.
Testy jednostkowe są narzędziem, jak każde inne, i powinny być stosowane w taki sposób, aby korzyści (wyłapywanie błędów) przewyższały koszty (wysiłek związany z ich pisaniem). Nie używaj ich, jeśli nie mają sensu i pamiętaj, że są one tylko częścią Twojego arsenału narzędzi (np. Inspekcje, stwierdzenia, analizatory kodu, metody formalne itp.). Mówię moim programistom:
Mogą pominąć pisanie testu dla metody, jeśli mają dobry argument, dlaczego nie jest to konieczne (np. Zbyt proste, aby było tego warte lub zbyt trudne, aby było tego warte) oraz w jaki sposób metoda zostanie zweryfikowana w inny sposób (np. Kontrola, stwierdzenia , metody formalne, testy interaktywne / integracyjne). Muszą wziąć pod uwagę, że niektóre weryfikacje, takie jak kontrole i formalne dowody, są przeprowadzane w danym momencie, a następnie muszą być powtarzane za każdym razem, gdy zmienia się kod produkcyjny, podczas gdy testy jednostkowe i stwierdzenia mogą być użyte jako testy regresji (napisane raz, a następnie wykonywane wielokrotnie ). Czasami się z nimi zgadzam, ale częściej będę debatować, czy metoda jest naprawdę zbyt prosta czy zbyt trudna do przetestowania jednostkowego.
Jeśli deweloper twierdzi, że metoda wydaje się zbyt prosta, by upaść, czy nie warto poświęcić 60 sekund na napisanie prostego testu z 5 liniami? Te 5 wierszy kodu będzie się uruchamiać każdej nocy (robisz nocne kompilacje, prawda?) Przez następny rok lub dłużej i będzie wart wysiłku, nawet jeśli tylko raz zdarzy się złapać problem, który mógł zająć 15 minut lub dłużej i debuguj. Poza tym napisanie łatwych testów jednostkowych zwiększa liczbę testów jednostkowych, dzięki czemu deweloper wygląda dobrze.
Z drugiej strony, jeśli programista twierdzi, że metoda wydaje się zbyt trudna do przetestowania jednostkowego (nie warta znacznego wysiłku), być może jest to dobra wskazówka, że metoda musi zostać podzielona lub ponownie opracowana, aby przetestować łatwe części. Zazwyczaj są to metody polegające na nietypowych zasobach, takich jak singletony, bieżący czas lub zasoby zewnętrzne, takie jak zestaw wyników bazy danych. Metody te zwykle wymagają przekształcenia w metodę, która pobiera zasób (np. Wywołuje getTime ()) i metodę, która przyjmuje zasób jako argument (np. Przyjmuje znacznik czasu jako parametr). Pozwalam im pominąć testowanie metody, która pobiera zasób, i zamiast tego piszą test jednostkowy dla metody, która teraz bierze zasób za argument. Zwykle sprawia to, że pisanie testu jednostkowego jest znacznie prostsze i dlatego warto pisać.
Deweloper musi narysować „linię w piasku” w zakresie kompleksowości testów jednostkowych. Później w fazie rozwoju, gdy tylko znajdziemy błąd, powinni ustalić, czy bardziej kompleksowe testy jednostkowe wykryłyby problem. Jeśli tak, i jeśli takie błędy pojawiają się wielokrotnie, muszą przesunąć „linię” w stronę pisania bardziej kompleksowych testów jednostkowych w przyszłości (zaczynając od dodania lub rozszerzenia testu jednostkowego dla bieżącego błędu). Muszą znaleźć właściwą równowagę.
Ważne, aby uświadomić sobie, testy jednostkowe nie są panaceum i nie ma czegoś takiego jak zbyt wiele testów jednostkowych. W moim miejscu pracy, ilekroć robimy lekcje, nieuchronnie słyszę „musimy napisać więcej testów jednostkowych”. Zarząd kiwa głową, ponieważ „uderzyło ich w głowę, że„ testy jednostkowe ”==„ dobre ”.
Musimy jednak zrozumieć wpływ „większej liczby testów jednostkowych”. Deweloper może pisać ~ N wierszy kodu tygodniowo i musisz dowiedzieć się, jaki procent tego kodu powinien być kodem testu jednostkowego a kodem produkcyjnym. Luźne miejsce pracy może mieć 10% kodu jako testy jednostkowe i 90% kodu jako kod produkcyjny, co daje produkt z wieloma (choć bardzo błędnymi) funkcjami (pomyśl MS Word). Z drugiej strony ścisły sklep z 90% testami jednostkowymi i 10% kodem produkcyjnym będzie miał solidny produkt o bardzo niewielu funkcjach (pomyśl „vi”). Możesz nigdy nie słyszeć raportów o awarii tego ostatniego produktu, ale prawdopodobnie ma to tyle samo wspólnego z tym, że produkt nie sprzedaje się tak dobrze, jak ma to związek z jakością kodu.
Co gorsza, być może jedyną pewnością w rozwoju oprogramowania jest to, że „zmiana jest nieunikniona”. Załóżmy, że ścisły sklep (90% testów jednostkowych / 10% kodu produkcyjnego) tworzy produkt, który ma dokładnie 2 cechy (zakładając, że 5% kodu produkcji == 1 cecha). Jeśli klient przyjdzie i zmieni 1 z funkcji, wówczas ta zmiana spowoduje usunięcie 50% kodu (45% testów jednostkowych i 5% kodu produkcyjnego). Sklep Lax (10% testów jednostkowych / 90% kodu produkcyjnego) ma produkt z 18 funkcjami, z których żadna nie działa bardzo dobrze. Ich klient całkowicie zmienia wymagania dotyczące 4 swoich funkcji. Mimo że zmiana jest 4 razy większa, tylko połowa bazy kodu zostaje zniszczona (~ 25% = ~ 4,4% testów jednostkowych + 20% kodu produkcyjnego).
Chodzi mi o to, że musisz poinformować, że rozumiesz równowagę między zbyt małą i zbyt dużą liczbą testów jednostkowych - zasadniczo że przemyślałeś obie strony problemu. Jeśli potrafisz przekonać swoich rówieśników i / lub zarządzanie tym, zyskujesz wiarygodność i być może masz większą szansę na ich pozyskanie.