Chciałbym móc testować jednostkowo mój kod Arduino. Idealnie byłoby w stanie uruchomić dowolne testy bez konieczności przesyłania kodu do Arduino. Jakie narzędzia lub biblioteki mogą mi w tym pomóc?
Jest emulator Arduino w rozwoju , które mogą być przydatne, ale to jeszcze nie wydają się być gotowe do użycia.
AVR Studio firmy Atmel zawiera symulator układu, który może być przydatny, ale nie widzę, jak bym go używał w połączeniu z Arduino IDE.
Odpowiedzi:
Nie uruchamiaj testów jednostkowych na urządzeniu Arduino lub emulatorze
Sprawa przeciwko testom urządzeń / emulatorów / mikrokontrolerów
Celem testów jednostkowych jest przetestowanie jakości własnego kodu. Testy jednostkowe na ogół nigdy nie powinny sprawdzać funkcjonalności czynników pozostających poza twoją kontrolą.
Pomyśl o tym w ten sposób: Nawet jeśli były do funkcjonalności testowej biblioteki Arduino, sprzętu mikrokontrolerem lub emulatorze, jest to absolutnie niemożliwe, aby takie wyniki testów powiedzieć nic na temat jakości swojej pracy. Dlatego o wiele bardziej wartościowe i wydajne jest pisanie testów jednostkowych, które nie działają na urządzeniu docelowym (lub emulatorze).
Częste testowanie na docelowym sprzęcie ma boleśnie powolny cykl:
Krok 3 jest szczególnie paskudny, jeśli spodziewasz się otrzymywać komunikaty diagnostyczne przez port szeregowy, ale sam projekt musi korzystać z jedynego sprzętowego portu szeregowego w Arduino. Jeśli myślisz, że biblioteka SoftwareSerial może pomóc, powinieneś wiedzieć, że może to zakłócić funkcjonalność wymagającą dokładnego pomiaru czasu, np. Generowanie innych sygnałów w tym samym czasie. Ten problem mi się przytrafił.
Ponownie, jeśli miałbyś przetestować swój szkic za pomocą emulatora, a Twoje krytyczne pod względem czasu procedury działały idealnie, dopóki nie załadowałeś do rzeczywistego Arduino, jedyną lekcją, której się nauczysz, jest to, że emulator jest wadliwy - i wiedząc o tym nadal nie zdradza nic na temat jakości własnej pracy.
Jeśli głupio jest testować na urządzeniu lub emulatorze, co powinienem zrobić?
Prawdopodobnie używasz komputera do pracy nad projektem Arduino. Ten komputer jest o rząd wielkości szybszy niż mikrokontroler. Napisz testy, aby zbudować i uruchomić na swoim komputerze .
Pamiętaj, że zachowanie biblioteki Arduino i mikrokontrolera powinno być poprawne lub przynajmniej konsekwentnie niepoprawne .
Gdy testy generują dane wyjściowe niezgodnie z oczekiwaniami, prawdopodobnie masz wadę w testowanym kodzie. Jeśli wyniki testu są zgodne z oczekiwaniami, ale program nie działa poprawnie po przesłaniu go do Arduino, to wiesz, że twoje testy były oparte na niepoprawnych założeniach i prawdopodobnie masz wadliwy test. W obu przypadkach uzyskasz prawdziwy wgląd w to, jakie powinny być Twoje kolejne zmiany w kodzie. Poprawiono jakość opinii z „ coś jest zepsute” do „ten konkretny kod jest zepsuty” .
Jak zbudować i uruchomić testy na komputerze
Pierwszą rzeczą, którą musisz zrobić, to określić swoje cele testowe . Zastanów się, które części własnego kodu chcesz przetestować, a następnie upewnij się, że skonstruowałeś swój program w taki sposób, abyś mógł wyizolować dyskretne części do testowania.
Jeśli części, które chcesz przetestować, wywołują dowolne funkcje Arduino, musisz podać zastępcze zamienniki w swoim programie testowym. To znacznie mniej pracy, niż się wydaje. Twoje makiety nie muszą właściwie nic robić, ale zapewniają przewidywalne dane wejściowe i wyjściowe dla twoich testów.
Każdy własny kod, który zamierzasz przetestować, musi istnieć w plikach źródłowych innych niż szkic .pde. Nie martw się, szkic nadal będzie się kompilował, nawet z pewnym kodem źródłowym poza szkicem. Kiedy naprawdę do tego dojdziesz, w pliku szkicu powinno być zdefiniowane niewiele więcej niż normalny punkt wejścia programu.
Pozostaje tylko napisać aktualne testy, a następnie skompilować je przy użyciu ulubionego kompilatora C ++! Prawdopodobnie najlepiej to ilustruje przykład z prawdziwego świata.
Rzeczywisty przykład działania
Jeden z moich znalezionych tutaj projektów dla zwierząt domowych zawiera kilka prostych testów, które można uruchomić na komputerze. Aby odpowiedzieć na to pytanie, omówię sposób, w jaki wyszydziłem niektóre funkcje biblioteki Arduino i testy, które napisałem, aby przetestować te makiety. Nie jest to sprzeczne z tym, co powiedziałem wcześniej o nie testowaniu kodu innych osób, ponieważ to ja napisałem makiety. Chciałem mieć pewność, że moje makiety były prawidłowe.
Źródło mock_arduino.cpp, które zawiera kod powielający niektóre funkcje obsługi zapewniane przez bibliotekę Arduino:
Korzystam z następującej makiety, aby uzyskać czytelny wynik, gdy mój kod zapisuje dane binarne na sprzętowym urządzeniu szeregowym.
fake_serial.h
fake_serial.cpp
i wreszcie aktualny program testowy:
Ten post jest wystarczająco długi, więc zapoznaj się z moim projektem na GitHub, aby zobaczyć więcej przypadków testowych w akcji. Nadal pracuję w toku w gałęziach innych niż master, więc sprawdź te gałęzie również pod kątem dodatkowych testów.
Zdecydowałem się napisać własne lekkie procedury testowe, ale dostępne są również bardziej niezawodne frameworki testów jednostkowych, takie jak CppUnit.
źródło
Wobec braku wcześniejszych ram testowania jednostek dla Arduino, stworzyłem ArduinoUnit . Oto prosty szkic Arduino demonstrujący jego użycie:
źródło
Mam duży sukces w testowaniu mojego kodu PIC poprzez wyciąganie dostępu do sprzętu i wyśmiewanie go w moich testach.
Na przykład streszczenie PORTA
Następnie SetPortA można łatwo wyśmiewać, bez dodawania kodu nadmiarowego w wersji PIC.
Po przetestowaniu abstrakcji sprzętu wkrótce okazuje się, że ogólnie kod przechodzi z zestawu testowego do PIC i działa po raz pierwszy.
Aktualizacja:
Używam szwy #include dla kodu jednostki, # włączając kod jednostki w pliku C ++ dla zestawu testowego i pliku C dla kodu docelowego.
Jako przykład chcę zmultipleksować cztery wyświetlacze 7-segmentowe, jeden port sterujący segmentami, a drugi wybór wyświetlacza. Kod wyświetlacza łączy się z wyświetlaczami za pomocą
SetSegmentData(char)
iSetDisplay(char)
. Mogę kpić z nich na moim testowym C ++ i sprawdzać, czy otrzymuję oczekiwane dane. Dla celu używam,#define
aby uzyskać bezpośrednie przypisanie bez narzutu wywołania funkcjiźródło
Wygląda na to, że emulino wykonałby to zadanie idealnie.
Repozytorium GitHub
źródło
simavr to symulator AVR korzystający z avr-gcc.
Obsługuje już kilka mikrokontrolerów ATTiny i ATMega, i - zdaniem autora - łatwo dodać więcej.
W przykładach leży simduino, emulator Arduino. Obsługuje uruchamianie programu ładującego Arduino i może być programowany za pomocą avrdude poprzez Socat (zmodyfikowany Netcat ).
źródło
Możesz przeprowadzić test jednostkowy w Pythonie z moim projektem PySimAVR . Arscons służy do budowania i simavr do symulacji.
Przykład:
Rozpocznij test:
źródło
Nie znam żadnej platformy, która może testować kod Arduino.
Istnieje jednak platforma Fritzing , za pomocą której można modelować sprzęt, a później eksportować diagramy PCB i takie tam.
Warto sprawdzić.
źródło
Używamy tablic Arduino do akwizycji danych w dużym eksperymencie naukowym. Następnie musimy wesprzeć kilka płyt Arduino za pomocą różnych implementacji. Napisałem narzędzia Python do dynamicznego ładowania obrazów heksadecymalnych Arduino podczas testów jednostkowych. Kod znajdujący się w poniższym linku obsługuje systemy Windows i Mac OS X za pośrednictwem pliku konfiguracyjnego. Aby dowiedzieć się, gdzie Arduino IDE umieszcza twoje obrazy heksadecymalne, naciśnij klawisz Shift przed naciśnięciem przycisku kompilacji (odtwarzania). Naciśnij klawisz Shift podczas uruchamiania przesyłania, aby dowiedzieć się, gdzie znajduje się twoje avrdude (narzędzie do przesyłania z wiersza poleceń) w twoim systemie / wersji Arduino. Ewentualnie możesz przejrzeć dołączone pliki konfiguracyjne i użyć lokalizacji instalacji (obecnie w Arduino 0020).
http://github.com/toddstavish/Python-Arduino-Unit-Testing
źródło
Ten program umożliwia automatyczne uruchamianie kilku testów jednostkowych Arduino. Proces testowania jest uruchamiany na komputerze PC, ale testy są przeprowadzane na rzeczywistym sprzęcie Arduino. Jeden zestaw testów jednostkowych jest zwykle używany do testowania jednej biblioteki Arduino. (to
Forum Arduino: http://arduino.cc/forum/index.php?topic=140027.0
Strona projektu GitHub: http://jeroendoggen.github.com/Arduino-TestSuite
Strona w indeksie pakietów Python: http://pypi.python.org/pypi/arduino_testsuite
Testy jednostkowe są napisane w „Arduino Unit Testing Library”: http://code.google.com/p/arduinounit
Dla każdego zestawu testów jednostkowych wykonywane są następujące kroki:
źródło
Trzymaj kod specyficzny dla sprzętu oddzielnie lub abstrakcyjnie, abyś mógł przetestować i debugować ten większy „odpoczynek” na dowolnej platformie, dla której masz dobre narzędzia i którą znasz najlepiej.
Zasadniczo spróbuj zbudować jak najwięcej końcowego kodu z jak największej liczby znanych bloków konstrukcyjnych. Pozostała praca związana ze sprzętem będzie wtedy znacznie łatwiejsza i szybsza. Możesz go zakończyć, korzystając z istniejących emulatorów i / lub urządzeń emulujących. A potem oczywiście trzeba jakoś przetestować prawdziwą rzecz. W zależności od okoliczności może to być bardzo mało zautomatyzowane (tj. Kto lub co naciska przyciski i zapewnia inne dane wejściowe? Kto lub co będzie obserwował i interpretował różne wskaźniki i wyniki?).
źródło
James W. Grenning pisze wspaniałych książek i ten jest o testów jednostkowych osadzony kodu C Test-Driven Development dla wbudowanego C .
źródło
Używam Searduino podczas pisania kodu Arduino. Searduino to symulator Arduino i środowisko programistyczne (Makefiles, kod C ...), które ułatwia hakowanie w C / C ++ przy użyciu ulubionego edytora. Możesz importować szkice Arduino i uruchamiać je w symulatorze.
Zrzut ekranu z Searduino 0.8: http://searduino.files.wordpress.com/2014/01/jearduino-0-8.png
Searduino 0.9 zostanie wydane, a wideo zostanie nagrane, gdy tylko ostatnie testy zostaną wykonane .... za dzień lub dwa.
Testowania na symulatorze nie należy uważać za prawdziwe testy, ale z pewnością bardzo pomogło mi to w znalezieniu głupich / logicznych błędów (zapomnienie o zrobieniu
pinMode(xx, OUTPUT)
itp.).BTW: Jestem jedną z osób rozwijających Searduino.
źródło
Zbudowałem
arduino_ci
w tym celu. Chociaż ogranicza się do testowania bibliotek Arduino (a nie samodzielnych szkiców), umożliwia uruchamianie testów jednostkowych lokalnie lub w systemie CI (np. Travis CI lub Appveyor).Rozważmy bardzo prostą bibliotekę w katalogu biblioteki Arduino, zwany
DoSomething
zdo-something.cpp
:Testowałbyś go w następujący sposób (z wywołanym plikiem testowym
test/is_four.cpp
lub innym takim):To wszystko. Jeśli ta
assertEqual
składnia i struktura testu wygląda znajomo, to dlatego, że zaadaptowałem część biblioteki ArduinoUnit Matthew Murdocha , o której wspominał w swojej odpowiedzi .Zobacz Reference.md, aby uzyskać więcej informacji na temat testowania jednostek we / wy, zegara, portów szeregowych itp.
Te testy jednostkowe są kompilowane i uruchamiane przy użyciu skryptu zawartego w rubinie. Aby zapoznać się z przykładami konfiguracji, zobacz plik README.md lub po prostu skopiuj z jednego z tych przykładów:
źródło
Istnieje projekt o nazwie ncore , który zapewnia natywny rdzeń dla Arduino. I pozwala pisać testy dla kodu Arduino.
Z opisu projektu
Również w sekcji „Czego muszę używać”
źródło
Jeśli chcesz przetestować kod jednostki poza MCU (na komputerze), sprawdź libcheck: https://libcheck.github.io/check/
Użyłem go kilka razy do przetestowania własnego kodu osadzonego. To dość solidne środowisko.
źródło
Możesz użyć emulare - możesz przeciągnąć i upuścić mikrokontroler na diagramie i uruchomić swój kod w Eclipse. Dokumentacja na stronie internetowej informuje, jak ją skonfigurować.
źródło
Użyj Proteus VSM z biblioteką Arduino do debugowania kodu lub przetestowania go.
Jest to najlepsza praktyka przed wprowadzeniem kodu na pokład, ale pamiętaj o taktowaniu, ponieważ symulacja nie działa w czasie rzeczywistym, ponieważ działa na płycie.
źródło
Wypróbuj symulator obwodu Autodesk . Umożliwia testowanie kodu i obwodów Arduino z wieloma innymi komponentami sprzętowymi.
źródło
W podstawowym Arduino jest napisane w C i C ++, nawet biblioteki arduino są napisane w C i C ++. Tak więc w prostych słowach po prostu obsługuj kod jako C i C ++ i spróbuj przeprowadzić test jednostkowy. Tutaj przez słowo „uchwyt” mam na myśli zmianę wszystkich podstawowych składni, takich jak serial.println na sysout, pinmode na zmienne, void loop na while (), która psuje się po naciśnięciu klawisza lub po pewnej iteracji.
Wiem, że jest to trochę długi i nie tak prosty proces. Z mojego osobistego doświadczenia wynika, że kiedy już sobie z tym poradzisz, okazuje się, że jest bardziej niezawodny.
-Nandha_Frost
źródło
Jeśli jesteś zainteresowany uruchomieniem szkicu INO i sprawdzeniem wyjścia szeregowego, mam działającą implementację tego w mojej sumie kontrolnej Arduino NMEA projekcie .
Poniższy skrypt pobiera plik i używa Arduino CLI do skompilowania go do pliku HEX, który jest następnie ładowany do SimAVR, który ocenia go i drukuje wyjście szeregowe. Ponieważ wszystkie programy Arduino działają wiecznie bez możliwości samobójstwa (
exit(0)
nie działa), pozwalam na szkicowanie przez kilka sekund, a następnie różnicuję przechwycone wyjście z oczekiwanym wyjściem.Pobierz i rozpakuj Arduino CLI (w tym przypadku wersja 0.5.0 - najpóźniej w momencie pisania):
Teraz możesz zaktualizować indeks i zainstalować odpowiedni rdzeń:
Zakładając, że twój szkic ma nazwę
nmea-checksum.ino
, aby uzyskać ELF i HEX, uruchom:Następnie SimAVR do uruchomienia HEX (lub ELF) - buduję ze źródła, ponieważ najnowsze wydanie nie działało dla mnie:
Pomyślna kompilacja da ci
simavr/run_avr
możliwość uruchomienia szkicu. Jak powiedziałem,timeout
inaczej nigdy się nie skończy:Wygenerowany plik będzie zawierał znaki sterujące kodem koloru ANSI zawijające wyjście szeregowe, aby pozbyć się tych:
Teraz wszystko, co musisz zrobić, to porównać ten plik ze znanym dobrym plikiem:
Jeśli nie ma różnic,
diff
wyjdzie z kodem 0, w przeciwnym razie skrypt się nie powiedzie.źródło