W dzisiejszym świecie inżynierii oprogramowania trudno jest sobie wyobrazić projekty bez testów. Lepsze bądź gorsze biblioteki wspomagające pisanie i uruchamianie testów istnieją praktycznie dla każdego współcześnie używanego języka programowania.
W przypadku pisania oprogramowania na hardware (do którego niewątpliwie zalicza się Arduino) z testami jest raczej pod górkę. O tyle o ile z samym napisaniem testów można sobie poradzić (jest do tego biblioteka, o której w dalszej części posta) to z uruchomieniem jest już problem. Ponieważ kod jest kompilowany a następnie uruchamiany w postaci binarnej na mikrokontrolerze, musimy fizycznie posiadać układ z mikrokontrolerem lub ewentualnie jakiś symulator. Jeżeli chodzi o Arduino niestety żadne z popularnych IDE (poza Atmel Studio z dodatkiem Visual Micro) nie oferuje opcji emulacji.
Przyjrzyjmy się zatem na początku jakie mamy możliwości emulacji Arduino (emulatorów znalazłem kilka, skupiam się jednak jedynie na rozwiązaniach darmowych i aktywnie rozwijanych):
Autodesk Circuits – jest fajną webową aplikacją, do całkiem profesjonalnej zabawy elektroniką. Poza możliwością projektowania PCB i rysowania obwodów mamy też tzw. laboratorium. W laboratorium, na wirtualnej płytce stykowej, możemy zestawić sobie obwód z dostępnych w bibliotece elementów, a potem ten obwód zasilić, uruchomić i pomierzyć (za pomocą wirtualnego multimetru i oscyloskopu). Dodatkowo, w bibliotece mamy dostępne Arduino, dla którego możemy napisać kod a następnie go uruchomić (z opcją pełnego debugu !) i zobaczyć jakie są efekty. Niestety, do kodu nie możemy dołączać bibliotek zewnętrznych – jeżeli chcemy skorzystać z biblioteki np. do testów pozostaje nam wkleić jej kompletny kod źródłowy wprost w szkic. Nie udało mi się tu jednak odpalić biblioteki do testów.
Aplikacja ta jest na tyle ciekawa, że zdecydowałem się jej poświęcić cały post na blogu i nagrać filmik. Prawdopodobnie będzie to w kolejnym poście – Zapraszam !
UnoArduSim – dość ciekawa aplikacja emulująca Arduino Uno. Działa pod Windows. Wygląda, że jest aktywnie rozwijana (ostatnia binarka pochodzi z 7 lutego 2017). Jest to samodzielna aplikacja, nie potrzebuje IDE Arduino do pracy. Co prawda GUI jest nieco siermiężne. Ale po przebrnięciu przez niedługą dokumentację (33 strony) można szybko zacząć pracę. Spora część składni Arduino jest wspierana. Po szczegóły odsyłam do dokumentacji, która znajduje się w PDF-ie wewnątrz archiwum z programem, pobieranym ze strony autora.
Polecam sobie ściągnąć i spróbować. Niestety jeżeli chodzi o testy, tutaj nie udało mi się odpalić biblioteki do testów. Emulator ten nie pozwala na dodanie bibliotek zewnętrznych (nie rozumie sporej części kodu w nich zawartych).
Reasumując tę część postu. Nie udało mi się znaleźć emulatora, który byłby w stanie odpalić bibliotekę testów jednostkowe kodu dla Arduino. Ani Atmel Studio, ani Autodesk Circuits ani UnoArduSim nie chciały współpracować w tej kwestii.
Teraz krótko o testach:
Warto sobie zadać pytanie, co tak na prawdę warto testować w kodzie dla Arduino. Arduino używamy przecież tak naprawdę do pobrania stanu wejść i na ich podstawie wysterowania wyjść. Najlepszymi narzędziami do testowania będą tutaj multimetr i oscyloskop 🙂 Sporadycznie może się jednak zdarzyć potrzeba przetestowania fragmentów kodu wykonujących np. jakieś obliczenia i tutaj z pomocą może nam przyjść biblioteka ArduinoUnit. Biblioteka ta jest dość dobrze udokumentowana na swojej stronie github. Minusem tego rozwiązania (z braku działającego z biblioteką emulatora) jest konieczność fizycznego posiadania Arduino i podłączenia go do komputera.
Przykładowy kod z testami wygląda bardzo prosto:
#include <ArduinoUnit.h> test(ok) { int x=3; int y=3; assertEqual(x,y); } test(bad) { int x=3; int y=3; assertNotEqual(x,y); } void setup() { Serial.begin(9600); while(!Serial); // for the Arduino Leonardo/Micro only } void loop() { Test::run(); }
Wynik testów otrzymamy w monitorze portu szeregowego. Odpowiedź będzie wyglądać mniej więcej tak:
Assertion failed: (x=3) != (y=3), file sketch.ino, line 17. Test bad failed. Test ok passed. Test summary: 1 passed, 1 failed, and 0 skipped, out of 2 test(s).
Zdecydowałem, że w moim projekcie nie będę używał testów jednostkowych dla kodu Arduino. Myślę, że jedną z ważniejszych umiejętności, jeżeli chodzi o pisanie testów jest umiejętność decyzji także kiedy ich NIE pisać. W tym przypadku uważam, że nie ma to sensu. Logowanie komunikatów na porcie szeregowym w zupełności tutaj wystarcza.
Ciekawy wpis. Co do testów jednostkowych przy Arduino mam podobne odczucia. Wydaje mi się, że to przerost formy nad treścią, przynajmniej w tych „mniejszych” projektach 🙂
W małych projektach, gdzie głównie wypracowuje się w prosty sposób wyjścia na podstawie wejść to rzeczywiście przerost formy nad treścią. Nie mniej jednak, przy bardziej skomplikowanej logice testy były by całkiem wskazane. Szkoda tylko, że nie ma (albo ja nie znalazłem) rozwiązania, które by było w stanie działać jak rzeczywisty emulator. Wiązałem spore nadzieje z symulatorem z Atmel Studio ale za nic w świecie nie udało mi się tego odpalić z tą biblioteką do testów – być może trzeba ten temat w przyszłości jeszcze głębiej przeanalizować.