Unit Testing framework based on http://cpputest.github.io/

CppUTest

Where to find more information

Getting test reports on the console

You may need to tailor the file src/Platforms/mbed/UtestPlatform.cpp to your needs. In particular, if you want console output, you might want to look at the function PlatformSpecificPutchar().

Quick introduction (some code!)

To write your first test, all you need is a new cpp file with a TEST_GROUP and a TEST, like:

#include "CppUTest/TestHarness.h"

TEST_GROUP(FirstTestGroup)
{
};

TEST(FirstTestGroup, FirstTest)
{
   FAIL("Fail me!");
}

This test will fail.

You can add new tests to the test group by just writing more tests in the file, like this:

TEST(FirstTestGroup, SecondTest)
{
   STRCMP_EQUAL("hello", "world");
   LONGS_EQUAL(1, 2);
   CHECK(false);
}

You do need to trigger the tests from somewhere in your program. It could look something like:

#include "CppUTest/TestRegistry.h"
#include "CppUTest/CommandLineTestRunner.h"

int main(int ac, char** av)
{
    ....
    unsigned failureCount = 0;
    {
        ConsoleTestOutput output;
        CommandLineTestRunner runner(ac, av, &output, TestRegistry::getCurrentRegistry());
        failureCount = runner.runAllTestsMain();
    }

    if (failureCount == 0) {
        console.printf("PASSED\r\n");
    }
    ...
}

For more information, We’d recommend to read the manual or, even better, check some existing tests such as SimpleStringTest or (a bit more complicated) MemoryLeakDetectorTest or the mocking tests or just check out the Cheat Sheet.

Committer:
Rohit Grover
Date:
Thu Jun 19 08:24:31 2014 +0100
Revision:
2:82161d9e7b36
Parent:
1:4769360130ed
uncomment the code in CommandLineTestRunner::RunAllTests() having to do with MemoryLeakWarningPlugin

Bas Vodde, from the CppUTest development team has suggested an alternate way to run tests.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 0:0b799af9d58e 1 /*
rgrover1 0:0b799af9d58e 2 * Copyright (c) 2007, Michael Feathers, James Grenning and Bas Vodde
rgrover1 0:0b799af9d58e 3 * All rights reserved.
rgrover1 0:0b799af9d58e 4 *
rgrover1 0:0b799af9d58e 5 * Redistribution and use in source and binary forms, with or without
rgrover1 0:0b799af9d58e 6 * modification, are permitted provided that the following conditions are met:
rgrover1 0:0b799af9d58e 7 * * Redistributions of source code must retain the above copyright
rgrover1 0:0b799af9d58e 8 * notice, this list of conditions and the following disclaimer.
rgrover1 0:0b799af9d58e 9 * * Redistributions in binary form must reproduce the above copyright
rgrover1 0:0b799af9d58e 10 * notice, this list of conditions and the following disclaimer in the
rgrover1 0:0b799af9d58e 11 * documentation and/or other materials provided with the distribution.
rgrover1 0:0b799af9d58e 12 * * Neither the name of the <organization> nor the
rgrover1 0:0b799af9d58e 13 * names of its contributors may be used to endorse or promote products
rgrover1 0:0b799af9d58e 14 * derived from this software without specific prior written permission.
rgrover1 0:0b799af9d58e 15 *
rgrover1 0:0b799af9d58e 16 * THIS SOFTWARE IS PROVIDED BY THE EARLIER MENTIONED AUTHORS ``AS IS'' AND ANY
rgrover1 0:0b799af9d58e 17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
rgrover1 0:0b799af9d58e 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
rgrover1 0:0b799af9d58e 19 * DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
rgrover1 0:0b799af9d58e 20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
rgrover1 0:0b799af9d58e 21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
rgrover1 0:0b799af9d58e 22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
rgrover1 0:0b799af9d58e 23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
rgrover1 0:0b799af9d58e 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
rgrover1 0:0b799af9d58e 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
rgrover1 0:0b799af9d58e 26 */
rgrover1 0:0b799af9d58e 27
rgrover1 0:0b799af9d58e 28 ///////////////////////////////////////////////////////////////////////////////
rgrover1 0:0b799af9d58e 29 //
rgrover1 0:0b799af9d58e 30 // Failure is a class which holds information for a specific
rgrover1 0:0b799af9d58e 31 // test failure. It can be overriden for more complex failure messages
rgrover1 0:0b799af9d58e 32 //
rgrover1 0:0b799af9d58e 33 ///////////////////////////////////////////////////////////////////////////////
rgrover1 0:0b799af9d58e 34
rgrover1 0:0b799af9d58e 35
rgrover1 0:0b799af9d58e 36 #ifndef D_TestFailure_H
rgrover1 0:0b799af9d58e 37 #define D_TestFailure_H
rgrover1 0:0b799af9d58e 38
rgrover1 0:0b799af9d58e 39 #include "SimpleString.h"
rgrover1 0:0b799af9d58e 40
rgrover1 0:0b799af9d58e 41 class UtestShell;
rgrover1 0:0b799af9d58e 42 class TestOutput;
rgrover1 0:0b799af9d58e 43
rgrover1 0:0b799af9d58e 44 class TestFailure
rgrover1 0:0b799af9d58e 45 {
rgrover1 0:0b799af9d58e 46
rgrover1 0:0b799af9d58e 47 public:
rgrover1 0:0b799af9d58e 48 TestFailure(UtestShell*, const char* fileName, int lineNumber,
rgrover1 0:0b799af9d58e 49 const SimpleString& theMessage);
rgrover1 0:0b799af9d58e 50 TestFailure(UtestShell*, const SimpleString& theMessage);
rgrover1 0:0b799af9d58e 51 TestFailure(UtestShell*, const char* fileName, int lineNumber);
rgrover1 0:0b799af9d58e 52 TestFailure(const TestFailure&);
rgrover1 0:0b799af9d58e 53 virtual ~TestFailure();
rgrover1 0:0b799af9d58e 54
rgrover1 0:0b799af9d58e 55 virtual SimpleString getFileName() const;
rgrover1 0:0b799af9d58e 56 virtual SimpleString getTestName() const;
rgrover1 0:0b799af9d58e 57 virtual int getFailureLineNumber() const;
rgrover1 0:0b799af9d58e 58 virtual SimpleString getMessage() const;
rgrover1 0:0b799af9d58e 59 virtual SimpleString getTestFileName() const;
rgrover1 0:0b799af9d58e 60 virtual int getTestLineNumber() const;
rgrover1 0:0b799af9d58e 61 bool isOutsideTestFile() const;
rgrover1 0:0b799af9d58e 62 bool isInHelperFunction() const;
rgrover1 0:0b799af9d58e 63
rgrover1 0:0b799af9d58e 64
rgrover1 0:0b799af9d58e 65 protected:
rgrover1 0:0b799af9d58e 66
rgrover1 0:0b799af9d58e 67 SimpleString createButWasString(const SimpleString& expected, const SimpleString& actual);
rgrover1 0:0b799af9d58e 68 SimpleString createDifferenceAtPosString(const SimpleString& actual, size_t position);
rgrover1 0:0b799af9d58e 69
rgrover1 0:0b799af9d58e 70 SimpleString testName_;
rgrover1 0:0b799af9d58e 71 SimpleString fileName_;
rgrover1 0:0b799af9d58e 72 int lineNumber_;
rgrover1 0:0b799af9d58e 73 SimpleString testFileName_;
rgrover1 0:0b799af9d58e 74 int testLineNumber_;
rgrover1 0:0b799af9d58e 75 SimpleString message_;
rgrover1 0:0b799af9d58e 76
rgrover1 0:0b799af9d58e 77 TestFailure& operator=(const TestFailure&);
rgrover1 0:0b799af9d58e 78
rgrover1 0:0b799af9d58e 79 };
rgrover1 0:0b799af9d58e 80
rgrover1 0:0b799af9d58e 81 class EqualsFailure: public TestFailure
rgrover1 0:0b799af9d58e 82 {
rgrover1 0:0b799af9d58e 83 public:
rgrover1 0:0b799af9d58e 84 EqualsFailure(UtestShell*, const char* fileName, int lineNumber, const char* expected, const char* actual);
rgrover1 0:0b799af9d58e 85 EqualsFailure(UtestShell*, const char* fileName, int lineNumber, const SimpleString& expected, const SimpleString& actual);
rgrover1 0:0b799af9d58e 86 };
rgrover1 0:0b799af9d58e 87
rgrover1 0:0b799af9d58e 88 class DoublesEqualFailure: public TestFailure
rgrover1 0:0b799af9d58e 89 {
rgrover1 0:0b799af9d58e 90 public:
rgrover1 0:0b799af9d58e 91 DoublesEqualFailure(UtestShell*, const char* fileName, int lineNumber, double expected, double actual, double threshold);
rgrover1 0:0b799af9d58e 92 };
rgrover1 0:0b799af9d58e 93
rgrover1 0:0b799af9d58e 94 class CheckEqualFailure : public TestFailure
rgrover1 0:0b799af9d58e 95 {
rgrover1 0:0b799af9d58e 96 public:
rgrover1 0:0b799af9d58e 97 CheckEqualFailure(UtestShell* test, const char* fileName, int lineNumber, const SimpleString& expected, const SimpleString& actual);
rgrover1 0:0b799af9d58e 98 };
rgrover1 0:0b799af9d58e 99
rgrover1 0:0b799af9d58e 100 class ContainsFailure: public TestFailure
rgrover1 0:0b799af9d58e 101 {
rgrover1 0:0b799af9d58e 102 public:
rgrover1 0:0b799af9d58e 103 ContainsFailure(UtestShell*, const char* fileName, int lineNumber, const SimpleString& expected, const SimpleString& actual);
rgrover1 0:0b799af9d58e 104
rgrover1 0:0b799af9d58e 105 };
rgrover1 0:0b799af9d58e 106
rgrover1 0:0b799af9d58e 107 class CheckFailure : public TestFailure
rgrover1 0:0b799af9d58e 108 {
rgrover1 0:0b799af9d58e 109 public:
rgrover1 0:0b799af9d58e 110 CheckFailure(UtestShell* test, const char* fileName, int lineNumber, const SimpleString& checkString, const SimpleString& conditionString, const SimpleString& textString = "");
rgrover1 0:0b799af9d58e 111 };
rgrover1 0:0b799af9d58e 112
rgrover1 0:0b799af9d58e 113 class FailFailure : public TestFailure
rgrover1 0:0b799af9d58e 114 {
rgrover1 0:0b799af9d58e 115 public:
rgrover1 0:0b799af9d58e 116 FailFailure(UtestShell* test, const char* fileName, int lineNumber, const SimpleString& message);
rgrover1 0:0b799af9d58e 117 };
rgrover1 0:0b799af9d58e 118
rgrover1 0:0b799af9d58e 119 class LongsEqualFailure : public TestFailure
rgrover1 0:0b799af9d58e 120 {
rgrover1 0:0b799af9d58e 121 public:
rgrover1 0:0b799af9d58e 122 LongsEqualFailure(UtestShell* test, const char* fileName, int lineNumber, long expected, long actual);
rgrover1 0:0b799af9d58e 123 };
rgrover1 0:0b799af9d58e 124
Rohit Grover 1:4769360130ed 125 class UnsignedLongsEqualFailure : public TestFailure
Rohit Grover 1:4769360130ed 126 {
Rohit Grover 1:4769360130ed 127 public:
Rohit Grover 1:4769360130ed 128 UnsignedLongsEqualFailure(UtestShell* test, const char* fileName, int lineNumber, unsigned long expected, unsigned long actual);
Rohit Grover 1:4769360130ed 129 };
Rohit Grover 1:4769360130ed 130
rgrover1 0:0b799af9d58e 131 class StringEqualFailure : public TestFailure
rgrover1 0:0b799af9d58e 132 {
rgrover1 0:0b799af9d58e 133 public:
rgrover1 0:0b799af9d58e 134 StringEqualFailure(UtestShell* test, const char* fileName, int lineNumber, const char* expected, const char* actual);
rgrover1 0:0b799af9d58e 135 };
rgrover1 0:0b799af9d58e 136
rgrover1 0:0b799af9d58e 137 class StringEqualNoCaseFailure : public TestFailure
rgrover1 0:0b799af9d58e 138 {
rgrover1 0:0b799af9d58e 139 public:
rgrover1 0:0b799af9d58e 140 StringEqualNoCaseFailure(UtestShell* test, const char* fileName, int lineNumber, const char* expected, const char* actual);
rgrover1 0:0b799af9d58e 141 };
rgrover1 0:0b799af9d58e 142
rgrover1 0:0b799af9d58e 143 #endif