Port of schuchert.wikispaces.com


NotesOnCppULite

NotesOnCppULite

Using CppULite

There are three parts to using CppULite

Creating a main

This is a one-time thing in any project. This example runs a text runner and reports errors:

#include <CppUTest/CommandLineTestRunner.h>

int main(int argc, char* argv[]) {
   CommandLineTestRunner::RunAllTests(argc, argv);
}

Creating a test

Here’s part of a file to test code to validate logging in using the state pattern:

#include <CppUTest/TestHarness.h>

#include "Accounts.h"

#include "LoggingInState.h"
#include "StateBasedLoginValidator.h"
#include "WaitingForLoginState.h"
#include "FirstFailedLoginAttemptState.h"

TEST_GROUP(StateBasedLoginValidator) {
   Accounts *accounts;
   StateBasedLoginValidator *validator;

   TEST_SETUP() {
      accounts = buildAccounts();
      validator = new StateBasedLoginValidator(accounts, new WaitingForLoginState());
   }

   Accounts *buildAccounts() {
      Accounts *accounts = new Accounts();
      accounts->addAccount("brett", "foo");
      accounts->addAccount("bob", "bar");
      accounts->addAccount("cindy", "baz");
      return accounts;
   }
   TEST_TEARDOWN() {
      delete accounts;
      delete validator;
   }
};

TEST(StateBasedLoginValidator, firstLoginSuccessful) {
   validator->validateLogin("brett", "foo");
   Account *account = accounts->retrieveAccountFor("brett");
   CHECK(account->loggedIn);
}

TEST_GROUP

A test group is how you create a test fixture. This actually creates a class with CppUTestGroup as a prefix. So this creates the following definitions:

int externTestGroupStateBasedLoginValidator = 0;
struct CppUTestGroupStateBasedLoginValidator : public Utest

What follows is {};, which finish off the creation of the class

There are several things worth pointing out:

If you happen to use any classes that use things from std:: such as std::string std::vector, you’ll find out that you’ll want to use new and delete in the setup and teardown methods, or CppUTest will report some memory leaks.

Important, the “;” is necessary after the closing } on the definition of a test group.

TEST

A test is an individual, focused test. You first mention its test group and then its name. This actually creates a class prefixed with “testGroup” and suffixed with Test. So in this example, we end up with the following definition:

class testGroupfirstLoginSuccessfulTest : public CppUTestGroupfirstLoginSuccessful { /* ... */ };

Note:

CppUTest assertion methods:

Macro Parameters Description
CHECK condition Verify condition is true. If not, report the name and line of the file where the condition fails using the preprocessor-defined macros __FILE__, __LINE__.
CHECK_LOCATION condition,file,line Verify condition is true. If not, report the file and line provided to th macro.
CHECK_EQUAL expected,actual Check that actual is equal to expected and report if they are not. For this to work, expected and actual are compared using != and when an error is reported, there needs to be a function called StringFrom that converts the result to a SimpleString (see SimpleString.h) or a const char*.
STRCMP_EQUAL expected,actual Compare two char*’s using strcmp. If they are not equal, report the __FILE__and __LINE__ where the check was made.
STRCMP_EQUAL_LOCATION expected,actual,file,line Same as STRCMP_EQUAL, you provide the file and line information..
LONGS_EQUAL expected,actual Compare two integer values (long or smaller) for equality. If they are not equal, report the __FILE__ and __LINE__ where the check occurred.
LONGS_EQUAL_LOCATION expected,actual,file,line Same as LONGS_EQUAL, you define the file and line information.
DOUBLES_EQUAL expected,actual Same as LONGS_EQUAL but using doubles.
DOUBLES_EQUAL_LOCATION expected,actual,file,line Same as DOUBLES_EQUAL, you provide the file and line information.
FAIL text Fail at this line and report text as the reason.
FAIL_LOCATION text,file,line Same as FAIL, you provide the file and line information.
FAIL_TEST text,file,line Same as FAIL_LOCATION.
FAIL_TEST_LOCATION text,file,line Same as FAIL_LOCATION.

Comments

" Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.