Jakie znaczenie ma testowanie jednostkowe w środowisku „Często wypuszczaj wczesne wersje”?

10

W ciągu ostatniego roku poprowadziłem mój zespół w kierunku rozwoju wersji często wczesnej wersji (AKA: Rapid Application Development, a nie Agile). Aby uzyskać więcej informacji o sposobie, w jaki zamykamy kompilację, zobacz moją odpowiedź tutaj: Proste sposoby poprawy jakości wydania w środowisku RAD

Kiedy przyjęliśmy RAD, ludzie byli dość niezależni i najpierw wykonywali testy jednostkowe; zintegrowane testy miały miejsce znacznie później. Był to dla nich naturalny proces bez formalnego egzekwowania. Teraz sytuacja jest zupełnie inna:

  1. Cała platforma jest dobrze zintegrowana z ustalonymi kompilacjami / wydaniami działającymi po stronie klienta bez żadnych gorących punktów.

  2. Nadal pojawiają się nowe wymagania dotyczące funkcjonalności i stopniowo je budujemy.

  3. Ogólna dynamika systemu jest bardzo ważna, ponieważ chociaż niezależne grupy programistyczne mogą właściwie postępować zgodnie z procesami, poważne awarie powstały z powodu skomplikowanych, nieoczywistych okoliczności.

  4. Wiele części systemu wymaga nowych algorytmów i wkładów badawczych, więc wyzwania (a zatem i mechanizm testowania) nie zawsze są poprawnie przewidywane, jak testowanie funkcji w dobrze zdefiniowanym oprogramowaniu.

Ostatnio starałem się uzyskać lepszy ogólny obraz, aby zobaczyć, czy potrzebujemy poprawy procesu. Kiedy usiadłem ze swoim zespołem, wielu z nich dręczyło: „Nie przeprowadzamy już testów jednostkowych!” podczas gdy inni uważali, że nie powinniśmy zacząć teraz, ponieważ nigdy nie będzie skuteczny.

Czy testy jednostkowe są przydatne w stosunkowo dojrzałym systemie? Czy powinniśmy przynajmniej rozważyć ważenie zakresu testowego w zależności od dojrzałości jednostek? Czy testy jednostkowe spowolnią tempo rozwoju? Czy istnieje potrzeba oceny testów jednostkowych w inny sposób?

Jakie są najlepsze praktyki testowania dojrzałej platformy w środowisku często wydawanym na początku?

Dipan Mehta
źródło
Myślę, że pomysł polega na wczesnym i częstym wypuszczaniu półdziałającego kodu, ale część „półdziałająca” jest niejawna. Pomagają w tym testy jednostkowe. Ale testy jednostkowe mogą być niewystarczające. Być może potrzebujesz strony testów integracyjnych.
ccoakley,

Odpowiedzi:

15

Testy jednostkowe nie służą przede wszystkim do wykrywania błędów - mają na celu upewnienie się, że następne wydanie twojego systemu jest tak samo stabilne jak poprzednie. Im krótszy jest cykl wydawania, tym ważniejsze jest to, że możesz uruchamiać te testy automatycznie zamiast wykonywać je ręcznie.

Oczywiście, jeśli masz system z niektórymi niezależnymi częściami i pracujesz między dwoma wydaniami tylko w niewielkiej części systemu, prawdopodobnie możesz pominąć niektóre testy jednostkowe, które dotyczą innych części systemu. Ale zdecydowanie powinieneś użyć (i rozszerzyć) testy jednostkowe dla części, nad którymi pracujesz.

Kolejną rzeczą jest to, że gdy system rośnie, będzie coraz więcej potrzebnych dodatkowych testów integracyjnych - ale to nie znaczy, że będziesz potrzebował mniej testów jednostkowych.

Prawdziwe pytanie może być inne. Czy pisanie testów jednostkowych stało się trudniejsze, odkąd Twój system jest coraz większy? Czy twoje testy „jednostkowe” są tak naprawdę testami jednostkowymi, czy też nie testują już rzeczy w izolacji? Może to wynikać z tego, że opierają się na niższych częściach systemu, które ustabilizowały się w czasie.

Dzieje się tak, ponieważ programiści często wykorzystują istniejące biblioteki i kod, bezpośrednio je odwołując. Często powoduje to, że pisanie testów jednostkowych staje się trudniejsze, ponieważ często muszą zapewniać bardziej złożone środowisko i więcej danych testowych. Jeśli to jest twój problem, powinieneś zapoznać się z podstawowymi pojęciami Zasada wtrysku zależności i segregacji interfejsu , które mogą pomóc ci uczynić kod bardziej testowalnym jednostkowo.

Doktor Brown
źródło
„Często powoduje to, że pisanie testów jednostkowych staje się trudniejsze, ponieważ często muszą zapewniać bardziej złożone środowisko i więcej danych testowych”. <- Test jednostkowy powinien być tak samo prosty dla systemu prostego, jak złożony. Nie powinieneś potrzebować więcej niż pół tuzina ustawień dla każdej klasy. W przeciwnym razie oznacza to po prostu, że twoja klasa stała się zbyt duża. Ponadto test jednostkowy nie powinien być powiązany z żadnym środowiskiem. (Ale prawdopodobnie już je znasz, mówiąc tylko ...)
Sleeper Smith
@SleeperSmith: tak, i aby umożliwić pisanie tak prostych testów jednostkowych, dobrym pomysłem może być zastosowanie DI i ISP - dokładnie to napisałem powyżej. Przepraszam, jeśli nie byłem wystarczająco jasny.
Doc Brown
4

Powinieneś rozważyć przyjrzenie się rozwojowi opartemu na testach, w którym testy są najpierw projektowane i opisać, jak nowy kod będzie działał po napisaniu. Następnie sprawdzisz testy.

Z mojego doświadczenia wynika, że ​​tworzy on bardziej przejrzysty i lepiej przemyślany kod, szczególnie dla bibliotek, i jest to wykonalna część specyfikacji (co oznacza, że ​​zawsze będzie to poprawna dokumentacja).

To powiedziawszy, stosowane są istniejące testy, aby upewnić się, że kod nadal działa zgodnie z oczekiwaniami. Może wychwycić złamanie kodu i pozwolić upewnić się, że kod innej firmy nadal działa zgodnie z oczekiwaniami podczas aktualizacji.


źródło
3

Jak sugeruje Doc Brown i Thorbjørn Ravn Andersen , o prawach do wcześniejszego zwolnienia często środowisko może skorzystać jeszcze z dobrych testów jednostkowych i Test-Driven Development niż jednej z długich cykli uwalnianiu.

Jeśli masz dobry system ciągłej integracji i testy, które dobrze reprezentują funkcjonalność, masz dobry pomysł w dowolnym momencie, co działa (ponieważ testy dla tej funkcji przechodzą) i co jeszcze nie zostało zaimplementowane ( ponieważ nie ma testów dla tej funkcjonalności).

Mark Booth
źródło