Jakich ram testów jednostkowych mogę użyć do projektu mcu opartego na ac?

15

Zastanawiam się, jak mogę wykorzystać testy jednostkowe w moim projekcie mcu i jakich strukturach mogę użyć, aby to uprościć.

Dzisiaj używam stm32 z OpenOCD-jtag z komputera z systemem Linux, gdzie wszystko jest kontrolowane z klasycznego pliku Makefile i kompilowane krzyżowo z gcc.

Mógłbym sam coś stworzyć, ale jeśli istnieje struktura, której mogę użyć, byłoby miło. (Jest to premia, jeśli środowisko może wyświetlać wynik w formacie, który Jenkins / Hudson może odczytać).

Czy istnieje sposób na użycie szkieletu testu jednostkowego z STM32?

Johan
źródło
3
Nie mam czasu na napisanie pełnej odpowiedzi, ale skorzystałem z wielu narzędzi i technik zawartych w tych artykułach i tym blogu . Jednym słowem: CMock!
Kevin Vermeer

Odpowiedzi:

4

Sprawdź CppUTest i znakomity http://pragprog.com/book/jgade/test-driven-development-for-embedded-c Jamesa Grenninga

CppUTest obsługuje C i C ++, i ma ładny zestaw szablonów Makefile, który bardzo szybko mnie uruchomił.

blalor
źródło
Kupiłem wersję ePub, zobaczmy, czy będzie dobra :)
Johan
Książka jest dobra, ale myślę, że jedność (inne ramy tej książki) lepiej zaspokoi moją potrzebę.
Johan
Zaakceptowano, ponieważ książka popchnęła mnie we właściwym kierunku.
Johan
5

Istnieje wiele zmiennych, które określą najlepsze ramy testów jednostkowych do zastosowania w twojej sytuacji. Niektóre elementy, które mogą wpłynąć na twój wybór to:

  • Język docelowy.
  • Jaka obsługa bibliotek jest dostępna. np. libc lub jego obniżona wersja.
  • System operacyjny celu. np. Brak, FreeRTOS, niestandardowy.

Większość ram typu xUnit zapewnia pewien podstawowy poziom funkcjonalności, który może być przydatny. W przeszłości korzystałem z Cunit . (pakiet libcunit1-dev na Ubuntu / Debian). Większość frameworków będzie wymagać libc, niektóre będą wymagały dodatkowej obsługi systemu operacyjnego.

Kolejną alternatywą, która ma tylko 3 linie, jest Minunit .

Odkryłem, że testowanie jednostkowe przy użyciu mikrokontrolera jako celu jest dość kłopotliwe, ponieważ musisz być w stanie przedstawić środowisko odpowiednie do pobierania testów, uruchamiania ich, a następnie odzyskiwania wyników. Przygotowanie platformy, która pozwoli ci to zrobić, jest dużym zadaniem.

Innym podejściem, które zadziałało dla mnie, jest testowanie jednostkowe na hoście, implementowanie warstwy abstrakcji między sterownikami a kodem aplikacji. Ponieważ używasz gcc jako celu, kod powinien również zostać skompilowany na hoście.

Testowanie na hoście kompilującym jest ogólnie o wiele łatwiejsze, ponieważ masz pełną obsługę systemu operacyjnego hosta i wszystkich jego narzędzi. Na przykład podczas testowania na hoście mam wyśmiewaną wersję mojego sterownika bezprzewodowego z tym samym interfejsem, co prawdziwy sterownik działający na celu. Wersja hosta używa pakietów UDP do symulacji bezprzewodowego transferu pakietów, a fałszywy sterownik obsługuje możliwość odrzucania pakietów, dzięki czemu mogę przetestować moje protokoły.

W produkcie, nad którym pracowałem, używany był wątkowy system operacyjny, więc warstwa abstrakcji do testowania na systemie hosta używała zamiast tego wątków.

Chociaż nie jest to idealne, im łatwiej jest pisać i uruchamiać testy, tym bardziej prawdopodobne jest, że zaimplementujesz więcej przypadków testowych. Kolejną zaletą uruchamiania kodu na różnych platformach jest testowanie, czy kod jest przenośny. Szybko wychwycisz błędy Endiana, jeśli architektura docelowa i hosta będą się różnić.

Teraz jestem trochę poza tematem, ale uważam, że te pomysły mogą pomóc w wyborze ramy testowej i metod testowych.

Austin Phillips
źródło
Rozwiązałem sposób, w jaki otrzymuję kod na celu i mogę używać gdb w trybie skryptowym, aby zatrzymać się w innym punkcie przerwania, takim jak test_ok lub test_fail ( fun-tech.se/stm32/TestSuite/index.php ). Więc jestem w połowie drogi. To raczej pytanie, jak zbudować różne „testy”. Moje dzisiejsze pomysły są trochę nieelastyczne, dlatego zacząłem szukać jakiegoś frameworka.
Johan
1

Sprawdź embUnit http://embunit.sourceforge.net/embunit/index.html . Jest to wbudowana platforma testowa dla jednostek C o niewielkiej powierzchni.

Z powodzeniem wykorzystaliśmy go w kilku wbudowanych projektach mikrokontrolerów. Nie spodziewaj się opcji i funkcji, które uzyskasz dzięki platformie testowania jednostek komputerowych. Ale jest zdecydowanie wystarczająco potężny.

Ma zdefiniowaną alokację dla ciebie, więc nie musisz tracić czasu na pisanie niestandardowych asercji, jak w przypadku minUnit.

sillevl
źródło
1

Jakiś czas temu napisałem dokładny samouczek na ten temat: Testowanie jednostkowe (wbudowane) aplikacje C z Ceedling ; Używam tych technik w wielu projektach i do tej pory jestem całkiem szczęśliwy.

Dmitry Frank
źródło
2
To jest odpowiedź tylko do linku i jako taka stanie się bezwartościowa, jeśli zmieni się adres URL lub link się zepsuje. Powinieneś wyjaśnić odpowiednie informacje w odpowiedzi , a następnie możesz dodać link jako odniesienie.
rura
2
@pipe Tak, ale pytanie (w zasadzie zalecenie produktu) wymaga odpowiedzi takich jak ta.
Dmitrij Grigoryev,
-2

Spróbuj kłaczków, ale nie sądzę, że jest to do testowania jednostkowego, do analizy kodu.

LEMUEL ADANE
źródło
2
Analiza kodu statycznego nie może pomóc w uruchomieniu i przetestowaniu kodu, więc nie jest to zbyt pomocne.
Johan
1
Być może nie jest to pomocne w kontekście testów jednostkowych, ale każdy powinien używać jakiegoś narzędzia do analizy statycznej.
Tim