Wie wichtig ist Ihnen fehlerfreie Funktionalität und Stabilität Ihrer Software?
Behavior Driven Development (BDD), Test Driven Development (TDD), Clean Code und der konsequente Einsatz von Unit Tests sind unsere Strategien für sicher funktionierende Software.
Hierfür setzen wir eine Reihe von Unit Test Frameworks ein.
Darüber hinaus führen wir individuelle manuelle oder automatisierte Softwaretests für bereits bestehende Softwareapplikationen und Bibliotheken durch.
Dinge funktionierend zusammenbringen
Bei komplexen Softwareentwicklungsprojekte müssen am Ende alle entwickelten Teilmodule eines Gesamtsystems reibungslos und fehlerfrei miteinander kommunizieren. Hierzu führen wir umfangreiche Integrationstests aus und prüfen, ob alle Schnittstellen und Komponenten sich ordnungsgemäß verhalten und stabil zusammenarbeiten. Integrationstests führen wir zum einen zur Qualitätssicherung unserer eigenen Softwareprojekte durch oder unterstützen Ihre Softwareentwicklung im Rahmen eines Dienstleistungsvertrages.
Für welche Plattform soll’s denn sein?
Build-Systeme und Cross Plattform Entwicklung ermöglichen eine Entwicklung und Distribution von Software-Applikationen für verschiedene Betriebssysteme und Plattformen. Große Teile oder sogar 100% des Quellcodes kann so unverändert für alle Plattformen genutzt werden.
Wir setzen Linux-Build-Systeme wie z.B. Yocto ein, um angepasste Linux-Distributionen zu erstellen und auf die konkrete Zielhardware von Embedded Systemen zu optimieren.
Aufsetzend auf diesen BSP’s (Board Support Packages) und SDK’s (Software Development Kist) implementieren wir dann (meist mit C++) die Geräte- und Messapplikationen für die Zielhardware.
So wird eine optimale Integration der Software Applikation in das bestehende Betriebssystem bzw. die Hardwareplattform erreicht.
Unit Test Frameworks
Für die Entwicklung von C++ Applikationen nutzen wir folgende Unit Test Frameworks:
- Boost Test Library
- Catch, Catch2
- Microsoft Unit Testing Framework (Visual Studio)
- QtTest
- Trompeloeil
Unter Windows C# Applikationen nutzen wir:
- Visual Studio Unit Testing Framework (MSTest und Microsoft.NET.Test.SDK)
Für die Entwicklung mit Delphi (RAD Studio) nutzen wir:
- DUnit, DUnit2
…
Unit Test, Test-Driven Development TDD
Unit Tests (Komponenten-Tests) dienen den Softwareentwicklern zur funktionellen Überprüfung ihrer geschriebenen Komponenten.
Unit Tests unterscheiden sich dabei maßgeblich von der klassischen Vorgehensweise bei manuellen Softwaretests.
Bei klassischen Softwaretests wird meistens eine fertige Software-Applikation auf Fehler geprüft.
Unit Tests hingegen dienen bereits während ihrer Erstellung dazu, eine zu entwickelnde Softwarekomponente bereits während der Entwicklungsphase regelmäßig zu überprüfen.
Aber das ist noch nicht alles. Insbesondere dann, wenn Unit Tests in der testgetriebenen Entwicklung (TDD) eingesetzt werden, dienen sie als Design- und Refactoring-Werkzeug bei der Entwicklung der Komponenten.
Testbetriebene Entwicklung (engl. Test-Driven Development, TDD) schreibt dazu die grundlegende Regel „Test-First“ vor und außerdem die Implementierung einer Softwarekomponente durch ein zyklisches Vorgehen in kleinen Schritten auszuführen.
Bei diesem sogenannten Red-Green-Refactor Zyklus wird (1) zuerst ein Test geschrieben. Erst im Schritt (2) wird der Produktivcode gegen den bestehenden Test entwickelt und geprüft. In einem finalen Zyklusschritt (3) wird versucht, den Code zu optimieren. Der Zyklus wird dann solange wiederholt, bis die Komponente den Spezifikationen entspricht und alle notwendigen Testfälle stabil und fehlerfrei besteht.
Auf Wunsch unserer Auftraggeber nutzen wir TDD als „Designstrategie“ in agilen und komplexen Softwareprojekten, um eine saubere und testbare Software-Architektur zur erstellen.
Yocto Build System, Cross-Platform
Das Yocto-Build-System ist ein großes und mächtiges Werkzeug, um Linux-basierte Distributionen hardwareunabhängig zusammenzustellen. Im Anschluss ist es möglich, diese Distribution für die Zielhardware (Target Platform) eines technisches Gerätes zu compilieren und dann als Linux-Betriebssystem auf diesem Gerät zu installieren.
Die einzelnen Teilfunktionen des Betriebssystems (SSH, Services, Applikationen, Bibliotheken, Netzwerkfunktionen usw.) werden dabei in Form sogenannter Rezepte so zusammengestellt, dass eine ausreichende und auf das Gerät zugeschnittene Version des Linux-Betriebssystems entsteht.
Das Yocto-Projekt, ein OpenSource Collaboration Project, stellt hierzu für verschieden Hardwarearchitekturen entsprechende Standardrezepte und Standarddistributionen bereit.
Die Hersteller von funktionellen Baugruppen wie z.B. SBC’s (Single Board Computer Module) und kompakten HMI-Boards nutzen diese Vorlagen des Yocto Projektes und erzeugen daraus eigene Boards Support Packages (BSP), welche ein optimal auf die Hardwareplatine zugeschnittenes Linux-Betriebssystem enthalten. Das Betriebssystem liegt hierbei meist nur in Form von Verweisen (Links) auf die Paketquelltexte vor. Entsprechende Yocto Rezepte steuern die Erzeugung des Betriebssystems aus den Quellen heraus. Das Yocto Projekt hat hierfür ein eigenes Buildsystem mit dem Namen bitbake.
Die BSP’s der Hardware-Hersteller beinhalten typischerweise neben den Yocto Rezepten noch eine geeignete Toolchain mit Compiler, Linker, Debugger Werkzeugen für die jeweilige Hardware-Architektur. Die in den Toolchains befindlichen Compiler werden häufig auch Cross-Compiler genannt. Der Begriff „Cross“ ergibt sich aus der Tatsache, dass eine Compiler-Architektur wie z.B. der GNU C/C++ Compiler verwendet wird, der auf einem Entwicklungs-PC (z.B. 64-Bit Debian Linux) lauffähig ist, dort aber als Compiler Maschinencode für eine andere Prozessorhardware passend zu Zielhardware generiert.