Ceedling

Testy jednostkowe, które (częsciowo) piszą się same!

Ceedling to wszechstrone i kompleksowe środowisko do Unit Testów w języku C. Można uznać, że jest frameworkiem, a sami twórcy określają go jako "build system".

Łączy w sobie CMock, Unity i CException, więc instalując go dostajemy to wszystko odrazu skonfigurowane i gotowe do pracy, a wszystkimi UT zarządzamy z jednego miejsca. Co ciekawe sam Ceedling napisany jest w Ruby.

Narzędzie to naprawdę prosty w obsłudze i instalacji, a jednocześnie oferuje dużo możliwości. Przejdźmy przez wszystkie kroki niezbędne do uruchomienia Unit Testów w Ceedling:

  • Najpierw instalujemy środowisko Ruby. Jeśli pracujemy na linuxie - dobra wiadomość - Ruby już tu pewnie jest. Jeśli nasz system to Windows - musimy Ruby'ego zainstlowac samodzielnie (i dodać do systemowego PATH).
  • Następnie za pomocą komendy "gem" (dostarczanej przez Ruby) instalujemy ceedling wpisując w konsoli: gem install ceedling
  • W przypadku systemu Windows musimy zainstalować rówież gcc (np. instalując mingw lub cygwin).
  • W konsoli przechodzimy do katalogu projektu i dołączamy do niego Unit Testy wydając polecenie: ceedling new nazwa_katalogu_z_UT
  • Zmieniamy lokalizację na katalog z nowo dodanym Ceedlingiem i tworzymy pojedyńczy moduł z Unit Testami - dotyczyć będzie on jednego, konkretnego pliku który chcecmy przetestować:

    $ ceedling module:create[temp_sensor]
    File src/temp_sensor.c created
    File src/temp_sensor.h created
    File test/test_temp_sensor.c created
    Generate Complete

    W przypadku dodania testu do istniejącego kodu (a taki przypadek rozpatrujemy)kasujemy katalog "src" - ceedling zakłąda, że tworzymy projekt od zera i stworzył dla nas katalog gdzie według niego będziemy trzymali swój kod. My jednak mamy już pewną istniejącą strukturę projektu i nie musimy korzystać z tego katalogu. W nastepnym kroku wskażemy gdzie mamy swój kod.
  • Do pliku "project.yml" w sekcji :paths: dodajemy katalogi z plikami źródłowymi i nagłówkowymi kodu który chcemy przetestować:

    :paths:
    :test:
    - +:test/**
    - -:test/support
    :source:
    - src/**
    - ../my_proj/my_proj_src/
    - ../my_proj/my_proj_inc/
    :support:
    - test/support

    W ten sposób informujemy Ceedling o lokalizacji plików potrzebnych do wykonania testów. W tej lokalizacji Ceedling będzie szukał pliku z testowaną funkcją i plików z wołanymi przez nią innymi fuknkcjami. Testowana funkcja jest uzywana bezpośrednio w teście (wywołujemy ją i sprawdzamy, czy zachowanie jest zgodne z oczekiwaniami dla określonych danych wejściowych), nastomiast funkcje wołane zostaną zastąpione (automatycznie przez Ceedling!) odpowiednimi mockami.
  • Piszemy właściwy test. Dołączamy plik nagłówkowy interesującej nas funkcji (tu: temp_sensor.h) oraz informujemy Ceedling o plik nagłówkowywym na podstawie którego ma utworzyć mocki (tu: "mock_utilities.h"). I to jest jeden z najwżniejszych kroków - nazwę pliku nagłówkowego z którego mają powstać mocki poprzedzamy przedrostkiem "mock_". Na tej właśnie podstwie Ceedling odróżnia które funkcje ma używać bezpośrednio, a które ma stworzyć na potrzeby danego testu.

Przykładowy, najprostszy test zamieszczony został poniżej:

Test uruchamiamy za pomocą polecenia "ceedling test:all".

Oczywiście Unit Testy, jak każdy inny kawałek kodu można debugować. W tym celu należy wybrać typ debugowanej aplikacji jako program na PC i wskazać plik wynikowy programu (*.out)

how to debug unit test

TAGS: ceedling, unit testy stm32, testy jednostkowe ceedling , ceedling UT,