Sie sind auf Seite 1von 11

UnitTests mit CppUnit FH-Hagenberg

CppUnit
Projekteinstellungen
im Visual Studio

Dieses Dokument beschreibt den Aufbau eines Testprojektes für CppUnit 1).

Für ein MFC-Testrunner-Projekt mit graphischer Oberfläche sind Projekteinstellungen für


die Microsoft Foundation Classes (MFC) nötig.
Wird eine Ausgabe auf Konsole gewünscht, dann ist eine Win32 Konsolen Applikation als
Basis erforderlich.

Hier wird ein MFC-Testrunner-Projekt mit Oberfläche gezeigt, Für die Variante mit Konsole
wird auf die CppUnit-Doku verwiesen (HTML-Dokumentation, Beispielprojekt „Money“).

Aufbau eines MFC-Testrunner-Projektes:

File -> New -> Project... MFC Application auswählen

Location + Name vergeben, -> OK


-> Finish (ohne weitere Einstellungen im angezeigten Dialog)
1) Version 1.9.14
-1-
UnitTests mit CppUnit FH-Hagenberg

Im Solution Explorer sämtliche Dateien entfernen (Source Files, Header Files, Resourcen,
ReadMe, Manifest). Dateien auch aus dem Projektverzeichnis löschen. Es werden nur die
Project Properties benötigt, die nun noch angepasst werden.

Zu testende Dateien aufnehmen ( -> Add... -> Add Existing Item)

Es empfiehlt sich einen eigenen Folder im Solution Explorer für zu testende Klassen und den
Testklassen anzulegen.

Project Properties anpassen:

Die nachfolgenden Einstellungen beziehen sich auf folgende Arbeits-Verzeichnisstruktur:

Framework ... CppUnit Package


Projects ... Verzeichnis der Testprojekte

Anzupassen sind (siehe nachfolgende Screenshots):

- Additional Include directories ( Zugriff auf Header-Dateien der CppUnit)


- Windows-Version entspr. Betriebssystem setzen (WINVER)
- MultiThreaded DLL (debug/release)
- RTTI aktivieren
- pre compiled header deaktivieren
- Libraries cppunit.lib, cppunitd.lib, testrunner.lib, testrunnerd.lib aufnehmen

-2-
UnitTests mit CppUnit FH-Hagenberg

-3-
UnitTests mit CppUnit FH-Hagenberg

-4-
UnitTests mit CppUnit FH-Hagenberg

Linker -> Input : Additional Dependencies:


(alternativ die Libraries direkt in den Solution Explorer ziehen)

-5-
UnitTests mit CppUnit FH-Hagenberg

Der Zugriff auf die CppUnit-Header-Dateien erfolgt im eigenen Programmcode der Test-
klassen mittels relativen Pfad zum Framework-Verzeichnis:

// CppUnit Header Files


// ——————————
#include "./cppunit/TestCaller.h"
#include "./cppunit/TestCase.h"
#include "./cppunit/TestSuite.h"
#include "./cppunit/extensions/HelperMacros.h"
#include "./cppunit/extensions/Orthodox.h"

using CppUnit::Orthodox;
using CppUnit::Test;
using CppUnit::TestCaller;
using CppUnit::TestCase;
using CppUnit::TestSuite;

-6-
UnitTests mit CppUnit FH-Hagenberg

Beispiel einer zu testenden Klasse:


Die nachfolgende Klasse SimpleClass soll mittels Unit-Test getestet werden.

Header: SimpleClass.h

#ifndef SIMPLE_CLASS_INCLUDED
#define SIMPLE_CLASS_INCLUDED

#include <vector>

class SimpleClass {
public:
void AddElem(int const val);
int GetElem(size_t const idx) const;
void Clear();
size_t GetSize() const;
void Sort(bool ascending);

private:
std::vector<int> v;
};

#endif

Implementierung: SimpleClass.cpp

#include <algorithm>
#include "SimpleClass.h"

using namespace std;

void SimpleClass::AddElem(int const val) {


v.push_back(val);
}

int SimpleClass::GetElem(size_t const idx) const {


if (idx < v.size()) {
return v.at(idx);
}
throw ("Index out of range");
}

void SimpleClass::Clear() {
v.clear();
}

void SimpleClass::Sort(bool ascending) {


sort(v.begin(), v.end());
if (!ascending) {
reverse(v.begin(), v.end());
}
}

size_t SimpleClass::GetSize() const {


return v.size();
}

-7-
UnitTests mit CppUnit FH-Hagenberg

TestClasses:
Typischer Aufbau einer Testklasse für SimpleClass:

Header: SimpleClassTest.h

#ifndef SIMPLE_CLASS_TEST_INCLUDED
#define SIMPLE_CLASS_TEST_INCLUDED

// System Header Files


// —————————-
#include <cassert>

// CppUnit Header Files


// ——————————
#include "./cppunit/TestCaller.h"
#include "./cppunit/TestCase.h"
#include "./cppunit/TestSuite.h"
#include "./cppunit/extensions/HelperMacros.h"
#include "./cppunit/extensions/Orthodox.h"

using CppUnit::Orthodox;
using CppUnit::Test;
using CppUnit::TestCaller;
using CppUnit::TestCase;
using CppUnit::TestSuite;

// Project Header Files


// ——————————
#include "SimpleClass.h"

class SimpleClassTest : public CppUnit::TestFixture


{
CPPUNIT_TEST_SUITE( SimpleClassTest );
CPPUNIT_TEST( testGetSize );
CPPUNIT_TEST( testSort );
CPPUNIT_TEST( testGetElem );
CPPUNIT_TEST_SUITE_END();

public:
void setUp();
void tearDown();

void testGetSize();
void testSort();
void testGetElem();

private:
SimpleClass * mpObj;

};

#endif // SIMPLE_CLASS_TEST_INCLUDED

-8-
UnitTests mit CppUnit FH-Hagenberg

Implementierung: SimpleClassTest.cpp

#include "SimpleClassTest.h"

// Register the fixture into the ‘registry’


CPPUNIT_TEST_SUITE_REGISTRATION( SimpleClassTest );

// automatically called before each test case


void SimpleClassTest::setUp() {
mpObj = new SimpleClass;
}

// automatically called after each test case


void SimpleClassTest::tearDown() {
delete mpObj; mpObj = 0;
}

// the test methods


void SimpleClassTest::testGetSize() {

// add your unit test code for method 'GetSize()' here

// empty vector
// ——————
mpObj->Clear();
CPPUNIT_ASSERT (mpObj->GetSize() == 0);

// insertion + length
// —————————
for (int i = 0; i < 100000; i++) {
mpObj->AddElem(i);
CPPUNIT_ASSERT (mpObj->GetSize() == (size_t)i + 1);
}
}

void SimpleClassTest::testSort() {

// add your unit test code for method 'Sort()' here

void SimpleClassTest::testGetElem() {

// add your unit test code for method 'GetElem()' here

-9-
UnitTests mit CppUnit FH-Hagenberg

TestRunner:
Das Grundgerüst des MFC-Hauptprogrammes hat folgenden Aufbau:

TestMain.h
============

#ifndef TestMain_INCLUDED
#define TestMain_INCLUDED

// System Defines and Header Files


// ———————————————-
#define STRICT
#define VC_EXTRALEAN
#define WIN32_LEAN_AND_MEAN

#include <afxext.h>

// CppUnit Header Files


// ——————————
#include "cppunit/extensions/TestFactoryRegistry.h"
#include "msvc6/testrunner/TestRunner.h"

using CppUnit::MfcTestRunner;
using CppUnit::TestFactoryRegistry;

// Class Declarations
// —————————
class TestMain : public CWinApp {
private:

BOOL InitInstance () {
MfcTestRunner runner;

runner.addTest (TestFactoryRegistry::getRegistry().makeTest ());


runner.run ();

return FALSE;
}
};

#endif // TestMain_INCLUDED

TestMain.cpp:
===============

// Project Header Files


// ——————————
#include „TestMain.h“

// Global Variables
// ————————

TestMain gApplication;

- 10 -
UnitTests mit CppUnit FH-Hagenberg
Typische Ausgabe für einen erfolgreichen Testlauf:

Ausgabe für einen fehlgeschlagenen Testlauf:

- 11 -

Das könnte Ihnen auch gefallen