Skąd mam wiedzieć, czy mam wystarczającą liczbę testów jednostkowych, aby usunąć test integracyjny?

15

Pracuję nad starszym systemem (to znaczy, że został napisany bez testów). Próbowaliśmy przetestować część systemu, pisząc testy integracyjne, które testują funkcjonalność z zewnątrz.

Daje mi to pewne zaufanie do refaktoryzacji części kodu bez obawy o jego uszkodzenie. Problem polega jednak na tym, że testy integracyjne wymagają wdrożenia (ponad 2 minuty) i uruchomienia przez wiele minut. Ponadto są trudne do utrzymania. Każdy z nich obejmuje tysiące linii kodu, a gdy jeden z nich się zepsuje, debugowanie przyczyny może potrwać kilka godzin.

Ostatnio piszę wiele testów jednostkowych dla tych zmian funkcjonalnych, które wprowadziłem, ale zanim się zgodzę, zawsze przeprowadzam nowe wdrożenie i uruchamiam wszystkie testy integracyjne, aby upewnić się, że niczego nie przegapiłem. W tym momencie wiem, że moje testy jednostkowe i niektóre testy integracyjne pokrywają się z tym, co testują.

Skąd mam wiedzieć, kiedy moje dobre testy jednostkowe odpowiednio pokrywają zły test integracji, aby móc usunąć ten test integracji?

Daniel Kaplan
źródło

Odpowiedzi:

18

Najłatwiejszą miarą jest pytanie: „kiedy ostatni raz test integracji legalnie nie powiódł się?” Jeśli minęło dużo czasu (było wiele zmian) od czasu niepowodzenia testu integracji, to testy jednostkowe prawdopodobnie wykonują wystarczająco dobrą pracę. Jeśli test integracji niedawno zakończył się niepowodzeniem, oznacza to wadę, która nie została wykryta przez testy jednostkowe.

Na ogół wolę zwiększać niezawodność testów integracyjnych do tego stopnia, że ​​można je niezawodnie uruchamiać bez nadzoru. Jeśli biegną długo, uruchom je przez noc. Są nadal cenne, nawet jeśli są uruchamiane tylko okazjonalnie. Jeśli testy te są zbyt delikatne lub wymagają ręcznej interwencji, może nie być warto poświęcić czasu na ich utrzymanie i możesz rozważyć odrzucenie tych, które najczęściej się udają.

Greg Hewgill
źródło
3
+1 za zalecenie zautomatyzowania testów, ponieważ prowadzi to do oczywistego pytania „Po co zabijać test automatyczny?”
1
Tak, zgadzam się z tym. Oczywiście nawet to cię gryzie, jeśli nie masz wystarczająco dobrego zasięgu testu jednostkowego. Na przykład obecnie mamy pakiet testów integracyjnych, których uruchomienie zajmuje około 6 godzin ... ale nie sądzę, aby test został NIGDY usunięty z powodu koncentracji mojej firmy na kompatybilności
Earlz
2
Być może powinienem zacząć od tego nowe pytanie, ale czy sugerujesz, że za każdym razem, gdy test integracyjny jest uzasadniony, powinienem wymyślić, jak napisać test jednostkowy, który również się nie powiedzie, i sprawić, by obaj zdali?
Daniel Kaplan
2
@tieTYT: Tak, to absolutnie brzmi jak dobry pomysł. Testy jednostkowe są dobre; testy jednostkowe dla rzeczy, o których wiesz, że już się zepsuły, są jeszcze lepsze.
Greg Hewgill
7

Testy jednostek nie są świętym Graalem testowania, są tylko jednym z wielu narzędzi do testowania bazy kodu. Dlatego żadna liczba testów jednostkowych nie powinna być nigdy uważana za bezpieczną zamiast innych testów. Jeśli masz zły test integracyjny, powinieneś pracować, aby był to dobry test integracyjny, a nie zamieniać go na coś innego, to jest jak zastąpienie drzwi wejściowych ogrodzeniem obwodowym i bramą.

Ryathal
źródło
Gdyby ten projekt zaczął się od zera, miałoby to dla mnie większy sens. Ale moim pierwszym testem integracyjnym było „sprawdzenie, czy możesz się zalogować” i ostatecznie wykonałem wiele testów jednostkowych, które „sprawdzają, czy możesz się zalogować”. Test integracji cały czas ulega awarii, jeśli zmienisz HTML. Ten przykład jest całkowicie wymyślony, ale czy nie jest to dobry przypadek do usunięcia testu integracji?
Daniel Kaplan
3
@tieTYT: testowanie czegoś za pomocą interfejsu użytkownika często prowadzi do bardzo niestabilnego rozwiązania. Niemniej jednak testowanie za pomocą interfejsu użytkownika jest ważne, czasami zdarza się, że testy ręczne powodują tutaj mniej wysiłku niż próba zautomatyzowania tego testu i utrzymania go w stanie stabilnym. Więc jeśli uważasz, że tak jest w tym przypadku, możesz usunąć ten „test integracji” z listy testów automatycznych i dodać go do planu testów testów ręcznych.
Doc Brown
@DanielKaplan czy można zaktualizować test integracji, aby był bardziej stabilny? Jeśli się nie udaje, ponieważ czasami HTML się zmienia, to prawdopodobnie przetestuj coś takiego jak „nazwa użytkownika pojawia się na stronie po zalogowaniu”, a nie coś bardziej szczegółowego, jak „nazwa użytkownika pojawia się w tym div po zalogowaniu”
Jen