Podejście „test pisemny + refaktor do zaliczenia” wygląda niesamowicie antyinżynieryjnie.
Wygląda na to, że masz błędne przekonanie dotyczące zarówno refaktoryzacji, jak i TDD.
Refaktoryzacja kodu to proces zmiany kodu źródłowego programu komputerowego bez modyfikowania jego zewnętrznego zachowania funkcjonalnego w celu poprawy niektórych niefunkcjonalnych atrybutów oprogramowania.
Dlatego nie można refaktoryzować kodu, dopóki nie przejdzie.
A TDD, a konkretnie testowanie jednostkowe (które uważam za usprawnienie rdzenia, ponieważ inne testy wydają mi się prawdopodobne), nie polega na przeprojektowaniu komponentu, dopóki nie zadziała. Chodzi o zaprojektowanie komponentu i pracę nad implementacją, aż komponent będzie działał zgodnie z przeznaczeniem.
Ważne jest również, aby naprawdę zrozumieć, że testy jednostkowe dotyczą testowania jednostek . Ze względu na tendencję do pisania wielu rzeczy od zera ważne jest, aby testować takie jednostki. Inżynier budownictwa zna już specyfikacje jednostek, których używa (różne materiały) i może oczekiwać, że będą działać. Są to dwie rzeczy, które często nie dotyczą inżynierów oprogramowania i bardzo pro-inżynierskie jest testowanie jednostek przed ich użyciem, ponieważ oznacza to stosowanie przetestowanych, wysokiej jakości komponentów.
Gdyby inżynier budownictwa wpadł na pomysł, aby wykorzystać nową tkankę z włókien do wykonania dachu na pokrycie stadionu, można by się spodziewać, że przetestuje go jako jednostkę, tj. Zdefiniuje potrzebne specyfikacje (np. Wagę, przepuszczalność, stabilność itp.) Oraz następnie przetestuj i dopracuj go, aż się spełni.
Właśnie dlatego działa TDD. Ponieważ jeśli zbudujesz oprogramowanie testowanych urządzeń, szanse są znacznie lepsze, gdy połączysz je ze sobą, a jeśli nie, możesz spodziewać się, że problem znajdzie się w kodzie kleju, zakładając, że twoje testy mają dobry zasięg.
edycja:
Refaktoryzacja oznacza: brak zmian w funkcjonalności. Jednym z punktów pisania testu jednostkowego jest upewnienie się, że refaktoryzacja nie złamie kodu. TDD ma więc na celu zapewnienie, że refaktoryzacja nie ma skutków ubocznych.
Ziarnistość nie jest przedmiotem perspektywy, ponieważ, jak powiedziałem, testy jednostkowe testują jednostki, a nie systemy, dzięki czemu ziarnistość jest dokładnie zdefiniowana.
TDD zachęca do dobrej architektury. Wymaga to zdefiniowania i wdrożenia specyfikacji dla wszystkich jednostek, co zmusi cię do zaprojektowania ich przed wdrożeniem, co jest zupełnie sprzeczne z tym, co myślisz. TDD dyktuje tworzenie jednostek, które mogą być testowane indywidualnie, a zatem są całkowicie oddzielone.
TDD nie oznacza, że rzucam test oprogramowania na kod spaghetti i mieszam makaron, aż przejdzie.
W przeciwieństwie do inżynierii lądowej, w inżynierii oprogramowania projekt zwykle stale ewoluuje. W inżynierii lądowej musisz zbudować most w pozycji A, który może unieść x ton i jest wystarczająco szeroki dla n pojazdów na godzinę.
W inżynierii oprogramowania klient może w zasadzie zdecydować w dowolnym momencie (być może po ukończeniu), chce mostu dwupiętrowego i że chce go połączyć z najbliższą autostradą, i że chciałby, aby był to most podnoszony, ponieważ jego firma niedawno zaczął korzystać ze statków żaglowych.
Inżynierowie oprogramowania mają za zadanie zmieniać projekty. Nie dlatego, że ich projekty są wadliwe, ale dlatego, że taki jest sposób działania. Jeśli oprogramowanie jest dobrze zaprojektowane, można je przeprojektować na wysokim poziomie, bez konieczności przepisywania wszystkich komponentów niskiego poziomu.
TDD polega na tworzeniu oprogramowania z indywidualnie testowanymi, wysoce odsprzężonymi komponentami. Dobrze wykonany, pomoże ci reagować na zmiany wymagań znacznie szybciej i bezpieczniej niż bez niego.
TDD dodaje wymagania do procesu rozwoju, ale nie zabrania innych metod zapewniania jakości. To prawda, że TDD nie zapewnia takiego samego bezpieczeństwa jak weryfikacja formalna, ale z drugiej strony weryfikacja formalna jest niezwykle kosztowna i niemożliwa do zastosowania na poziomie systemu. A jednak, jeśli chcesz, możesz połączyć oba.
TDD obejmuje również testy inne niż testy jednostkowe, które są przeprowadzane na poziomie systemu. Uważam je za łatwe do wyjaśnienia, ale trudne do wykonania i trudne do zmierzenia. Są również całkiem prawdopodobne. Choć absolutnie widzę ich konieczność, tak naprawdę nie cenię ich jako pomysłów.
W końcu żadne narzędzie nie rozwiązuje problemu. Narzędzia ułatwiają jedynie rozwiązywanie problemu. Możesz zapytać: W jaki sposób dłuto pomoże mi w świetnej architekturze? Cóż, jeśli planujesz robić proste ściany, proste cegły są pomocne. I tak, oczywiście, jeśli dasz to narzędzie idiocie, prawdopodobnie w końcu przebije go stopą, ale to nie wina dłuta, ponieważ nie jest to wada TDD, że daje fałszywe bezpieczeństwo nowicjuszom, którzy nie piszą dobrych testów.
Podsumowując, można powiedzieć, że TDD działa znacznie lepiej niż brak TDD.