Dodanie testów jednostkowych do starszego, prostego projektu C.

12

Tytuł mówi wszystko. Moja firma ponownie używa starszego projektu oprogramowania układowego dla urządzenia mikrokontrolera, napisanego całkowicie zwykłym C.

Są części, które są oczywiście błędne i wymagają zmiany, a pochodzące z tła C # / TDD Nie podoba mi się pomysł losowego refaktoryzowania rzeczy bez testów, które zapewniłyby nas, że funkcjonalność pozostaje niezmieniona. Widziałem też, że trudne do znalezienia błędy były wprowadzane przy wielu okazjach poprzez najmniejsze zmiany (co, moim zdaniem, zostałoby naprawione, gdyby zastosowano testy regresji). Należy bardzo uważać, aby uniknąć tych błędów: ciężko jest śledzić kilka globali wokół kodu.

Podsumowując:

  • Jak dodać testy jednostkowe do istniejącego ściśle powiązanego kodu przed refaktoryzacją?
  • Jakie narzędzia polecasz? (mniej ważne, ale wciąż miło wiedzieć)

Nie jestem bezpośrednio zaangażowany w pisanie tego kodu (moja odpowiedzialność to aplikacja, która będzie współdziałać z urządzeniem na różne sposoby), ale byłoby źle, gdyby pozostawiono dobre zasady programowania, gdyby istniała szansa na ich wykorzystanie.

Groo
źródło

Odpowiedzi:

7

Zdobądź kopię Efektywnie współpracując ze starszym kodem autorstwa Michaela Feathersa. Ma poradzić sobie z takimi sytuacjami. Mimo że koncentruje się bardziej na językach OO, takich jak C ++ i Java, uważam, że może ci to bardzo pomóc.

Wygląda na to, że część (lub wczesny szkic artykułu) jest nawet dostępna tutaj za darmo .

Péter Török
źródło
+1, dzięki. Ale wierzę, że jestem całkiem dobry w refaktoryzacji kodu OO z większym kodem OO. Nie wiem, jak testować kod proceduralny i refaktoryzować kod proceduralny za pomocą mniej sprzężonego kodu proceduralnego.
Groo,
@Groo, książka nie dotyczy samego refaktoryzacji. Chodzi o to, jak przekształcić wiązkę kodu spaghetti bez żadnych testów jednostkowych w wiązkę (nieco mniej spaghetti) kodu dobrze objętego testami jednostkowymi. Taki kod jest trudny do przetestowania, dlatego najpierw trzeba go przefiltrować, aby można go było przetestować; jednak, jak już wspomniałeś, refaktoryzacja bez testów jednostkowych jest ryzykowna, więc jest to sytuacja catch 22. Książka zawiera wskazówki, jak wprowadzać najmniejsze i najbezpieczniejsze zmiany w kodzie, które umożliwiają objęcie go testami jednostkowymi, a tym samym rozpoczęcie na nowo jego refaktoryzacji.
Péter Török,
Ta książka jest dobrą sugestią i obejmuje C wraz z językami OO.
ThomasW
7

Jeśli chodzi o techniki, prawdopodobnie książka Michaela Feathersa w odpowiedzi Pétera Töröka będzie dość wyczerpująca. Jeśli nie chcesz iść do książki, proponuję trzystopniowy proces:

  1. sprawdź kod, który nie jest testowalny, i skopiuj małe części funkcjonalności tego kodu do funkcji testowalnych. Ważne jest, aby nowe funkcje zachowywały się w sposób oczywisty w stosunku do funkcji, którą próbujesz powielić - tak naprawdę nie zalecam pisania testów jednostkowych wokół starszego kodu, więc musisz być bardzo ostrożny i ograniczyć swój zakres w w celu utrzymania zaufania do refaktoryzacji.
  2. napisz testy jednostkowe wokół tych nowych funkcji.
  3. zmodyfikuj oryginalny kod, aby wywoływać nowe funkcje.

Powtórz ten proces kilka razy i powinieneś przekonać się, że jakość starszej bazy kodu znacznie wzrosła.

Jeśli chodzi o narzędzia, pamiętaj, że C ++ może wywoływać C, więc do testowania kodu C można użyć dowolnej struktury testowania jednostek C ++. Na przykład używamy CPPUnit do testowania jednostkowego wiązki kodu C w naszym projekcie.

Aidan Cully
źródło
+1 dzięki za wskazówki i link CPPUnit .
Groo,