Continuous Integration Schneller Testen mit MicroPython

Automatisierte Tests zügig mit MicroPython aufsetzen.
Automatisierte Tests zügig mit MicroPython aufsetzen.

Dank des jungen Open-Source-Projekts MicroPython gibt es Python-Implementierungen auch für Mikrocontroller. Damit lassen sich automatisierte Tests relativ zügig aufsetzen. Es gibt aber auch eine Einschränkung.

Die moderne Embedded-Software-Entwicklung erfordert zunehmend automatisierte Tests, die bereits im Entwicklungsprozess selbst fest integriert sind und nicht erst in späteren Projektphasen realisiert werden. Ziel ist es, den Entwicklern früh Feedback zu liefern und den Verantwortlichen einen stetigen Überblick über die Einhaltung von Systemschnittstellen zu gewährleisten. Durch das ständige Feedback wird es möglich, jede Veränderung am Systemverhalten auf eine konkrete Änderung am Quellcode zurückzuführen. Frühes, automatisiertes Testen trägt dazu bei, dass kostspielige Iterationen in Zusammenarbeit mit der Qualitätssicherungsabteilung reduziert werden können.

In Continuous Integration (CI) werden neben der entwickelten Anwendungs-Software zusätzlich die erforderlichen Testszenarien vom Entwickler selbst oder einem unabhängigen Tester der Codebasis hinzugefügt (Bild 1).

Jede Änderung wird von einem Build-Server automatisch registriert, der daraufhin die Anwendung kompiliert. Ist dies erfolgreich, so wird die Software auf die Ziel-Hardware geladen und die zugehörigen Tests werden durchgeführt. Die Ergebnisse werden anschließend erfasst und der Entwicklung zurückgemeldet.

Standard-Testgeräte sind oft „Overkill

Im Embedded-Bereich sind die Systemschnittstellen häufig auf Leitungsebene definiert, weshalb der Build-Server die Tests nicht selbst ausführen kann. Es werden typischerweise zusätzliche Testgeräte benötigt, die selbst Embedded-Geräte sind und so der technischen Natur des zu prüfenden Systems nahe kommen. Da die Entwicklung von Embedded Software aufwendig und teuer ist, gibt es z.B. im Bereich von Hardware-in-the-Loop (HiL) Standardlösungen, welche die Programmierung des Testgerätes auf die Definition von Testszenarien mit Anregung und Sollreaktion in einer Art Beschreibungssprache reduzieren.

Für Entwicklertests, funktionale Tests oder statische Messungen sind solche Lösungen häufig zu teuer oder zu komplex. Als Resultat wird daher häufig die Chance einer frühen Testautomatisierung abgelehnt oder die Entwickler- und Testteams greifen auf ihre Embedded-Systeme zurück und stehen somit vor der Aufgabe, ein Testgerät in der gleichen Weise wie das zu testende System entwickeln zu müssen. Letzteres kann aber ebenfalls eine Kostenfalle sein, denn es besteht die Gefahr, dass bei einer späteren Änderung an der Spezifikation der Aufwand für die Anpassung der Testfunktionen größer ist als der Änderungsaufwand am Zielsystem. Wünschenswert wäre ein Ansatz, bei dem die Testvorgaben einfach, aber auch flexibel getroffen werden, und zugleich Änderungen an der Spezifikation leichter umgesetzt werden können. Dabei muss das Testgerät unbedingt die domänenspezifischen Funktionen sowie die zeitliche Kritikalität des Systems beherrschen.

MicroPython in Continuous Integration

MicroPython ist ein junges, über Crowdfunding finanziertes Projekt, das 2013 mit dem Ziel startete, die komfortable und leicht zu erlernende Programmiersprache Python in einem komprimierten Umfang auf Mikrocontroller nutzbar zu machen. So entstand ein in C geschriebenes Software Framework, das den in Python geschriebenen Anwendungscode durch verschiedene Abstraktionsebenen von der Hardware trennt und gleichzeitig zusätzliche Bibliotheken zur Verfügung stellt. Vom MicroPython-Projekt selbst werden fertige Portierungen für diverse Zielplattformen angeboten (Tabelle 1).

AnwendersprachePython 3 (Cpython)
 ImplementierungsspracheC99
Benötigter  Programmspeicher256 KG
Benötigter RAM-Speicher 16 KB
LizenzMIT-Lizenz
Unterstützte Architekturen x86, x86-64, ARM, ARM Thumb, Xtensa
Unterstützte ControllerSTM32F401, STM32F405, STM32F411,  STM32F429,  STM32F746, CC3200, …
Webseite

 https://micropython.org

 

Tabelle 1. MicroPython in Zahlen und Fakten.

Der Einsatz von Python zum Programmieren der Tests ist zweifelsfrei verlockend. Python erfreut sich aufgrund seiner verständlichen und kompakten Syntax großer Beliebtheit. Gerade im Bereich des Software-Tests hat sich Python als Skriptsprache fest etabliert. Als Folge daraus sind Python-Kenntnisse weit verbreitet und vorhandene Testroutinen werden bereits in Python formuliert.

Möchte man ausprobieren, ob ein bestimmtes Konstrukt funktioniert, so muss man nicht erst ein Skript schreiben oder sogar etwas kompilieren, sondern gibt es in den Live-Interpreter von Python ein. Tritt bei der Ausführung einer Eingabe ein Fehler auf, so gibt Python einen vollständigen Stack-Trace und auch eine verständliche Fehlermeldung aus. Dies steht im Kontrast zur Embedded-Entwicklung, bei der jeder Code erst kompiliert und geladen werden muss und sich der Mikrocontroller im Falle eines unvorhergesehenen Fehlers „aufhängt“ und neu gestartet werden muss.

Mit MicroPython geht das viel komfortabler: Nachdem MicroPython einmalig auf den Mikrocontroller geladen wurde, öffnet das Programm eine serielle Konsole. Über diese Konsole agiert MicroPython ebenso wie Python als Interpreter. Eingehender Text wird im RAM gespeichert, von MicroPython interpretiert und direkt ausgeführt oder für einen späteren Aufruf zwischengespeichert. Auftretende Fehler bei der Interpretierung oder während der Laufzeit werden über die serielle Konsole in Form der aussagekräftigen Fehlermeldungen ausgegeben.