Jak można automatycznie testować kod źródłowy Arduino (ciągła integracja)?

17

Chciałbym zarządzać moim kodem źródłowym Arduino (projektami i bibliotekami) pod kontrolą źródła przy ciągłym testowaniu. Jak mogę automatycznie skompilować kod za pomocą narzędzi do ciągłej integracji, aby mieć pewność, że każda wersja kompiluje się czysto? W najlepszym przypadku powinno być możliwe skonfigurowanie kompilacji dla wielu procesorów, opcjonalne uruchomienie testów jednostkowych i sprawdzenie maksymalnego rozmiaru pliku binarnego.

Jakob
źródło
Poza przekazywaniem go przez Ino i avr-size?
Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams Nie przeszkadza mi, jakich narzędzi użyć, ale powinien działać automatycznie na niektórych usługach hostingowych w chmurze lub ciągłej integracji.
Jakob
1
Kompilacja rozmiaru binarnego nie jest trudna, ale aby wykonać testy jednostkowe, musiałbyś tak ustrukturyzować swój kod, aby można go było testować jednostkowo, co jest wystarczająco trudne, jeśli chcesz zachować mały rozmiar. Poza tym musisz uruchomić te testy na chipie lub w emulatorze, aby uzyskać test, który jest mniej lub bardziej niezawodny.
GolezTrol
Znalazłem github.com/kyab/travis-test-arduino, ale jego eksperymentalna i wyczerpująca odpowiedź / tutorial jako odpowiedź byłyby lepsze.
Jakob
3
Problem polega na tym, że jest to sprzeczne z pierwotnym celem ciągłej integracji: ma na celu wprowadzanie zmian, a następnie automatyczne kompilowanie i wdrażanie w ciągu kilku minut. Dzięki temu klienci mogą otrzymywać najnowsze funkcje i poprawki w miarę ich działania, zamiast co dwa miesiące. Dla Arduino jest to po prostu „chmura, która się upewnia”. W przypadku testów jednostkowych może być konieczne ominięcie bibliotek Arduino w celu zbudowania funkcji i przesłania przykładowych danych przez „piny”.
Anonimowy pingwin

Odpowiedzi:

6

Najnowsza wersja Arduino ide ma interfejs wiersza poleceń do budowania i przesyłania kodu. Ale możesz oczywiście to zrobić przez makefile i avrdude. Teraz skompilowałeś swój kod, ALE potrzebujesz testowania. Ponieważ symulator jest złożony, niekompletny, ekspansywny i ... Po prostu symulacja, a ponieważ układ scalony jest stosunkowo tani, zbudowanie planszy sprawi, że interakcja HW ORAZ sprawdzenie wyników w najszybszy i najłatwiejszy sposób. Na tej „specjalnej” płycie możesz wgrać coś w rodzaju tłumacza, który bierze test z komputera i wykonuje go, coś podobnego do firmata dla arduino. Przynajmniej tak bym to zbudował. I o ile wiem, nie jest to znane, nawet jeśli jestem pewien, że wiele branż powinno i prawdopodobnie to robi.

Lesto
źródło
4

Jako twórca PlatformIO , polecam przyjrzeć się temu. Jest to wieloplatformowy konstruktor kodów i brakujący menedżer bibliotek. Może zbudować ten sam kod dla wielu popularnych wbudowanych platform programistycznych i płyt.

PlatformIO można zintegrować z wieloma popularnymi systemami ciągłej integracji (CI) (lub własnymi). Zobacz dokumentację z przykładami .

Spójrzmy na .travis.ymlconfig / template dla Travis CI:

language: python
python:
    - "2.7"

env:
    - PLATFORMIO_CI_SRC=path/to/source/file.c
    - PLATFORMIO_CI_SRC=path/to/source/file.ino
    - PLATFORMIO_CI_SRC=path/to/source/directory

install:
    - python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)"

script:
    - platformio ci --board=TYPE_1 --board=TYPE_2 --board=TYPE_N

Przykład

Integracja dla USB_Host_Shield_2.0projektu. Plik .travis.ymlkonfiguracyjny:

language: python
python:
    - "2.7"

env:
    - PLATFORMIO_CI_SRC=examples/acm/acm_terminal
    - PLATFORMIO_CI_SRC=examples/Bluetooth/WiiIRCamera PLATFORMIO_BUILD_FLAGS="-DWIICAMERA"
    - PLATFORMIO_CI_SRC=examples/ftdi/USBFTDILoopback
    - PLATFORMIO_CI_SRC=examples/Xbox/XBOXUSB
    # - ...

install:
    - python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)"

    # Libraries from PlatformIO Library Registry
    # http://platformio.org/#!/lib/show/416/TinyGPS
    # http://platformio.org/#!/lib/show/417/SPI4Teensy3
    - platformio lib install 416 417

script:
    - platformio ci --board=uno --board=teensy31 --board=due --lib="."
ikravets
źródło
3
Jeśli jesteś powiązany lub związany z PlatformIO, powinieneś ujawnić to w swojej odpowiedzi, lub może to zostać oznaczone i usunięte jako spam. Dzięki!
Nick Gammon
3

Jeden przykład konfiguracji ciągłej integracji Jenkins dla projektu Arduino można znaleźć tutaj: Ciągła integracja dla systemów wbudowanych

Przykład pokazuje, jak zbudować i przesłać obraz do Arduino i wykonać testy sieciowe Selenium (testowany system to serwer WWW oparty na Arduino).

jperala
źródło
miło, ponieważ korzysta z istniejącego oprogramowania, które jest bogate w funkcje. ale wydaje się, że wykonuje tylko testy internetowe; czy możesz rozwinąć odpowiedź? również odpowiedzi oparte na linkach są złe.
Lesto
3

Napisałem ten test jako najbardziej nietrafny framework dla Arduino, ponieważ nie mogłem znaleźć właściwego istniejącego. Chociaż nie napisałem tego dla CI, byłoby dobrze dopasowane do zadania CI, ponieważ nie wymaga sprzętu, ale można go uruchomić na komputerze.

Uruchamianie zadań CI bez sprzętu ma dobre i złe strony, dobre strony

  • Nie wymaga flashowania, nie wymaga sprzętu -> można uruchomić równolegle -> szybko, aby sprawdzić na przykład dla każdego zatwierdzenia
  • Brak problemów sprzętowych wpływających na testy -> nie musisz się martwić, czy ten test po prostu się nie udał, ponieważ mój komponent sprzętowy XYZ nie jest stabilny

Minusem jest:

  • Nie testuje rzeczywistego kodu docelowego, na przykład twoja „int” ma 32 bity w komputerze i 16 bitów w AVR.
Susundberg
źródło
Twoja int” to 64 bity na twoim komputerze ”: prawdopodobnie masz na myśli„ 32 bity ”lub używasz jakiegoś egzotycznego systemu operacyjnego.
Edgar Bonet
Oczywiście masz rację, dzięki. Zredagowałem swoją odpowiedź, aby to naprawić.
susundberg
pamiętaj, że możesz skonfigurować domowy serwer CI z tanim komputerem, takim jak malina, podłączonym do płyty sprzętowej, a tym samym mieć część infrastruktury CI działającą na prawdziwym sprzęcie komputerowym (przy jednoczesnym zachowaniu domyślnego CI serwera w chmurze dla wszystkiego, co jest oprogramowaniem )
Lesto
3

Właśnie stworzyłem odpowiedni rozmiar jako odpowiedź na to pokrewne pytanie o Arduino CI / testowanie jednostek napisane przeze mnie, które w końcu jest wystarczająco dojrzałe, aby zacząć publicznie mówić.

arduino_ciRuby gem obsługuje zarówno lokalnego testowania i integracji Travis CI (np ten build pracę dla biblioteki Adafruit fona ).

Kilka przykładów tego, jak się integruje:

Mam problem utworzony za zgłoszenie szkic rozmiaru ale żadna praca nie zostało zrobione w tej sprawie. Możliwe też, że kiedyś uda mi się zrównoleglić wersje, ale w tej chwili nie jestem pewien, jak to zrobię. W tej chwili najbardziej czasochłonnym krokiem kompilacji na Travis CI jest pobranie Arduino IDE ... równoległe testowanie nie zaszkodzi, jeśli każde zadanie wymaga wykonania tego kroku.

Ian
źródło
1

Radziłbym użyć wtyczki arduino eclipse o nazwie sloeber sloeber.io, której jestem szefem projektu.
Integruje się z kontrolą wersji i pozwala budować na wielu platformach, ponieważ obsługuje wiele konfiguracji.
Chociaż nie jest to jeszcze idiotyczny dowód, udokumentowałem i zademonstrowałem za pomocą testowania jednostkowego kodu arduino na lokalnym komputerze za pomocą szkieletu testowego Google.
Oto link do bloga zawierający prezentację tego, jak możesz to zrobić. http://blog.baeyens.it/#post25

jantje
źródło