Effizientes und effektives Testen von Embedded SW mit Google Test. Michael Bernhard

Ähnliche Dokumente
TDD für iphone OS. xpdays Tammo Freese

Fortgeschrittenes Programmieren mit Java. Test Driven Development

Code verifizieren mittels

Testen mit JUnit. Motivation

JUnit - Test Driven Development. Bernhard Frey, Thorsten Stratmann, Jackson Takam, Michel Müller 1

Eclipse Equinox als Basis für Smart Client Anwendungen. Christian Campo, compeople AG, Java Forum Stuttgart 2007

Android Testautomatisierung mit dem Framework Robotium

Albert HAYR Linux, IT and Open Source Expert and Solution Architect. Open Source professionell einsetzen

Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen. Alexander Schunk Marcel Teuber Henry Trobisch

Test-Driven Design: Ein einfaches Beispiel

Unit Tests mit Junit 4. Dario Borchers

Das Test-Framework JUnit ETIS SS04

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Unit Testing, SUnit & You

How To: Wie entwickle ich mit SharpDevelop Anwendungen für die PocketPC-Platform

Komponententest. Testen von Software Systemen. Übung 02 SS 2009 Version:

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Installation und Inbetriebnahme von Microsoft Visual C Express

1. Einführung und Unit Testing Programmieren / Algorithmen und Datenstrukturen 2

JPC Visualisierung in Java

Unit Testing mit NUnit

Übungen zu Softwaretechnik

Testen und Testautomatisierung in agilen Projekten

Unit Tests. Programmiermethodik. Eva Zangerle Universität Innsbruck

Integrierte und automatisierte GUI-Tests in Java

Einführung in die Programmierung (EPR)

Continuous Delivery. für Java Anwendungen. Axel Fontaine Software Development Expert

Einführung in die Programmierung

An integrated total solution for automatic job scheduling without user interaction

Objektbasierte Entwicklung

Einführung in die Informatik Tools

Java Entwicklung für Embedded Devices Best & Worst Practices!

Qt-Projekte mit Visual Studio 2005

Einführung in das Scrum Framework & welche 10 Praktiken helfen, Scrum wirklich gut zu machen

Beispiel 2a Die eigenen ersten Schritte mit dem Gnu-Debugger GDB für Remote-Debugging

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Testplan. Hochschule Luzern Technik & Architektur. Software Komponenten FS13. Gruppe 03 Horw,

Wir können alles außer Testen Andreas Zeller Universität des Saarlandes

Zählen von Objekten einer bestimmten Klasse

MPI-Programmierung unter Windows mit MPICH2. Installieren von MPICH2, Übersetzen, Ausführen und Debuggen von MPI-Programmen. Christian Terboven

Lokale Installation von DotNetNuke 4 ohne IIS

Programmiertechnik II

Virtual PBX Installationsanleitung für X-Lite

Was ist LDAP. Aufbau einer LDAP-Injection. Sicherheitsmaßnahmen. Agenda. LDAP-Injection. ITSB2006 WS 09/10 Netzwerkkonfiguration und Security

Software Engineering in der Praxis

Swp08-6 Verantwortliche: Yundensuren, Baigalmaa. Testkonzept

Praktikum Betriebssysteme 1. Aufgabe (1)

Android-Testautomatisierung mit Robotium

Perceptive Document Composition

Source Code Konverter Online: (VB.net <-> C#) Kommerzielle Produkte (VB, C#, C++, Java) Code Nachbearbeitung in der Praxis...

Mocha. Ein Ruby Mocking und Stubbing Framework. von Thilo Utke. Werd ich drüber reden Erst was zu mit.

Test Driven Development

Praktische Übung 'JUnit-Test'

Java Kurs für Anfänger Einheit 5 Methoden

Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn. Testen. Tutorial im Rahmen des Software(technik)praktikums SS 2012

WPF Steuerelemente Listbox, ComboBox, ListView,

Application Note. Anbindung von Kunden-Software an SpiderControl Web Visualisierung

PHP & Windows. Jan Burkl System Engineer, Zend Technologies. All rights reserved. Zend Technologies, Inc.

Programmierkurs Java

The Art of Unit Testing

Java Einführung Collections

1 Native C Code in C# Umgebung mit Visual Studio 2010

Perceptive Document Composition

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff

Installation & Konfiguration AddOn CopyObjects

SEP 114. Design by Contract

BTD Antivirus Evasion: Von der Idee zum PoC. Daniel Sauder SySS GmbH

Lösungsvorschlag zum Übungsblatt 1 zur Vorlesung Informatik II / WS2001/02

Die Welt der SW-Qualität Ein Streifzug in 30 Minuten! Johannes Bergsmann Eigentümer

VAX2go ein Projekt der Gruppe Damn small VAX

Algorithmen & Datenstrukturen 1. Klausur

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

DIE SCHRITTE ZUR KORREKTEN LIZENZIERUNG

Installation & Konfiguration AddOn AD-Password Changer

Design Patterns 2. Model-View-Controller in der Praxis

Software-Engineering Software-Management

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

Oracle Database Backup Service - DR mit der Cloud

Praktikum IKT 3. Semester

Automatisiertes Testen von Java EE-Applikationen mit Arquillian

Windows Server 2008 (R2): Anwendungsplattform

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

Starthilfe für C# Inhaltsverzeichnis. Medien- und Kommunikationsinformatik (B.Sc.) Alexander Paharukov. Informatik 3 Praktikum

Zum Abschluss wird gezeigt, wie aus einem C++ Quell-Programm ein ausführbares Programm erzeugt wird. 1. Installation von NetBeans...

Anleitung Grundsetup C3 Mail & SMS Gateway V

Unit Testing mit JUnit. Dr. Andreas Schroeder

Unit Tests und Fehlersuche

U08 Entwurfsmuster (II)

Übersicht. Eclipse Foundation. Eclipse Plugins & Projects. Eclipse Ganymede Simultaneous Release. Web Tools Platform Projekt. WSDL Editor.

Unit-Test Theorie und Praxis. Stephan Seefeld, INGTES AG

Installation der SAS Foundation Software auf Windows

Java-Tutorium WS 09/10

IBM SPSS Modeler Server Adapter Installation

DLLs (dynamic loaded libraries) mit MingW erstellen

FB Informatik. Fehler. Testplan

Konzept zur Push Notification/GCM für das LP System (vormals BDS System)

SharePoint Demonstration

Klausur in Programmieren

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Transkript:

Effizientes und effektives Testen von Embedded SW mit Google Test Michael Bernhard 1

Agenda Warum testen? Wie testen? Google Test und Google Mock Toolintegration Schlussfolgerung 2

Die Norm fordert es Warum testen? Es braucht Sicherheit, dass ein Release genügend stabil und möglichst fehlerfrei ist Regressionen auffinden Debuggen Test-driven development Refactoring 3

Wie testen? Test-Framework Host, Simulator oder Target? Unit Test Was ist ein Unit? Codeabdeckung Testautomation Integration in IDE 4

Google Test Eine Bibliothek zum Schreiben von C++ Tests Open-Source, BSD Lizenz xunit Architektur Portabel und konfigurierbar Einfach zu erlernen, ausdruckstarkes Konzept Erweiterbar 5

Der Building Block cmp Building Blocks BuildingBlock:: Serv ice BuildingBlock «interface» BuildingBlock:: Adapter Adapter Service * BuildingBlock:: InternalClass AdaptedClass 6

Applikation mit Building Blocks cmp Clock SetDisplaState SetDisplaState «BuildingBlock» Controller DisplayTime DisplayTime «buildingblock» Display StartTimer BlinkTimerEvent SecondTick KeyEvent StartBlinkTimer GetBitmap DisplayString DisplayBitmap GetDimension «blocking» KeyEvent StartTimer TimerExpired Start Stop GetBitmap TimerElapsed «BuildingBlock» KeyDecoder «BuildingBlock» Timer «BuildingBlock» ResourceRepository GpioInterrupt KeyInterrupt Start StartTimerTick Stop StopTimerTick TimerTick TimerTick Read Read DisplayString DisplayBitmap GetDimension «driver» GpioDriv er «driver» TimerDriv er «driver» FlashPartition «driver» DisplayDriv er 7

Google Test: Ein kleines Beispiel cmp Building Blocks MMI Serv ice + Setup(AdapterBase&) : void + GetModeSwitch() : Mode + SetPowerLamp(boolean) : void + SetWarnLamp(boolean) : void «interface» AdapterBase + ReadSwitches() : int + SetLamps(int) : void 8

Google Test: Ein Testcase #include "mmi.h" #include <gtest/gtest.h> class AdapterStub : public MMI::AdapterBase public: int ReadSwitches() return 1; } void SetLamps(int state) } }; TEST(MMITest, GetModeSwitch) AdapterStub a; MMI::Service s; s.setup(a); TEST(MMITest, SetPowerLampOn) AdapterStub a; MMI::Service s; s.setup(a); } EXPECT_EQ(MMI::MODE_A, s.getmodeswitch()); } s.setpowerlamp(true); 9

#include "mmi.h" #include <gtest/gtest.h> Google Test: Test-Fixture class AdapterStub : public MMI::AdapterBase public: int ReadSwitches() return 1; } void SetLamps(int state) } }; class MMITest : public ::testing::test protected: void SetUp() s.setup(a); } }; AdapterStub a; MMI::Service s; TEST_F(MMITest, GetModeSwitch) EXPECT_EQ(MMI::MODE_A, s.getmodeswitch()); } TEST_F(MMITest, SetPowerLampOn) s.setpowerlamp(true); } 10

Google Test: Testrunner #include <gtest/gtest.h> int main(int argc, char **argv) testing::initgoogletest(&argc, argv); return RUN_ALL_TESTS(); } 11

Google Test: Test Makros EXPECT vs. ASSERT ASSERT_TRUE(fp = fopen(path, "r")); ASSERT_EQ(10, fread(buffer, 1, 10, fp)); EXPECT_STREQ("123456789", buffer); Zusätzlicher Fehlerbeschrieb ASSERT_TRUE(fp = fopen(path, "r")) << "Failed to open the data file."; ASSERT_EQ(10, fread(buffer, 1, 10, fp)) << "The data file is smaller than expected."; EXPECT_STREQ("123456789", buffer) << "The data file is corrupted."; expect_assert.cpp:24: Failure Value of: (fp = fopen(path, "r")) Actual: false Expected: true Failed to open the data file. 12

Google Test: Predicates bool MutuallyPrime(int m, int n)... } int a = 4, b = 10; EXPECT_TRUE(MutuallyPrime(a, b)); predicate.cpp:11: Failure Value of: MutuallyPrime(a, b) Actual: false Expected: true EXPECT_PRED2(MutuallyPrime, a, b); predicate.cpp:12: Failure MutuallyPrime(a, b) evaluates to false, where a evaluates to 4 b evaluates to 10 13

Der Building Block cmp Building Blocks BuildingBlock:: Serv ice BuildingBlock «interface» BuildingBlock:: Adapter Adapter Service * BuildingBlock:: InternalClass AdaptedClass 14

Stubs, Fakes oder Google Mock? Stubs oder Fakes Notwendig, da das Unit isoliert getestet werden soll Oft verschiedene Implementation notwendig Wie sieht man, was alles zu einem Test gehört? Google Mock Eine Implementation Konfiguration zur Laufzeit direkt im jeweiligen Test Beliebiges Verhalten Verifikation der Funktionsparameter Abhängigkeit der Funktionsaufrufe spezifizierbar 15

Google Mock: Die Mock Klasse class AdapterBase public: virtual int ReadSwitches() = 0; virtual void SetLamps(int state) = 0; }; #include "mmi.h" #include <gmock/gmock.h> class AdapterMock : public MMI::AdapterBase public: MOCK_METHOD0(ReadSwitches, int()); MOCk_METHOD1(SetLamps, void(int)); }; 16

Google Mock: Erwartungen formulieren #include "mmi.h" #include <gmock/gmock.h> using ::testing::return; using ::testing::eq; class MMITest : public ::testing::test protected: TEST_F(MMITest, GetModeSwitch) void SetUp() s.setup(a); EXPECT_CALL(a, ReadSwitches()).WillOnce(Return(1)); } AdapterMock a; EXPECT_EQ(MMI::MODE_A, s.getmodeswitch()); MMI::Service s; } }; TEST_F(MMITest, SetPowerLampOn) EXPECT_CALL(a, SetLamps(Eq(1))); } s.setpowerlamp(true); 17

Google Mock: Fehlerbeschrieb TEST_F(MMITest, SetPowerLampOn) EXPECT_CALL(a, SetLamps(Eq(1))); } s.setpowerlamp(true); Unexpected mock function call - returning directly. Function call: SetLamps(4) Google Mock tried the following 1 expectation, but it didn't match: mmi_test.cpp:34: EXPECT_CALL(a, SetLamps(Eq(1)))... Expected arg #0: is equal to 1 Actual: 4 Expected: to be called once Actual: never called - unsatisfied and active mmi_test.cpp:34: Failure Actual function call count doesn't match EXPECT_CALL(a, SetLamps(Eq(1)))... Expected: to be called once Actual: never called - unsatisfied and active 18

Eclipse Error Marker bei Fehler Unit Test Support in CDT Toolintegration 19

Toolintegration: Eclipse 20

Eclipse Error Marker bei Fehler Unit Test Support in CDT Toolintegration Einfaches Debuggen (--gtest_break_on_failure) Hudson/Jenkins Integration via XML Ausgabe 21

Toolintegration: Hudson/Jenkins 22

Eclipse Error Marker bei Fehler Unit Test Support in CDT Toolintegration Einfaches Debuggen (--gtest_break_on_failure) Hudson/Jenkins Integration via XML Ausgabe Testabdeckung mit GCC und LCOV einfach möglich 23

Toolintegration: LCOV 24

Schlussfolgerung Entwickeln und Testen in derselben Umgebung Jeder Testfall ist in sich abgeschlossen Schnelle Ausführung auf dem Host Einfaches Debugging Open-Source Gute Dokumentation Google Test und Google Mock sind hervorragende Frameworks um effizient C/C++ Code zu testen 25

Google Test code.google.com/p/googletest Google Mock code.google.com/p/googlemock Referenzen BSD Lizenz opensource.org/licenses/bsd-3-clause Effective C++ Testing Using Google Test docs.google.com/present/view?id=dfsbxvm5_0f5s4pvf9 Framework für Embedded SW www.embeddedcomputingconference.ch/pdf_2011/4c3-ziegler.pdf LCOV ltp.sourceforge.net/coverage/lcov.php 26