Setting Up Testing Frameworks (Google Test or Catch2) in C++


Unit testing is an essential part of the software development lifecycle. It allows developers to test individual components of a program in isolation, ensuring the correctness and reliability of the code. In C++, two popular testing frameworks are Google Test and Catch2. This article demonstrates how to set up both frameworks and write basic unit tests in C++.

Setting Up Google Test

Google Test is one of the most widely used C++ testing frameworks. It is part of the Google Test suite and provides a rich set of features for writing and running unit tests.

Step 1: Install Google Test

To install Google Test, you can either manually download and compile the source code or use a package manager like vcpkg or conan for easier installation.

Using vcpkg

To install Google Test using vcpkg, follow these steps:

  1. Install vcpkg on your system.
  2. Run the following command to install Google Test:
    vcpkg install gtest

Manual Installation

Alternatively, you can install Google Test manually:

  1. Clone the Google Test repository:
    git clone https://github.com/google/googletest.git
  2. Navigate to the directory where Google Test was cloned and build it using cmake:
        cd googletest
        mkdir build
        cd build
        cmake ..
        make
        sudo make install
                    

Step 2: Write Your First Test with Google Test

Once Google Test is set up, you can write your first unit test. Here’s an example of a simple unit test for a function that adds two integers:

Function to Test:

    // math_functions.h
    #ifndef MATH_FUNCTIONS_H
    #define MATH_FUNCTIONS_H

    int add(int a, int b);

    #endif
        
    // math_functions.cpp
    #include "math_functions.h"

    int add(int a, int b) {
        return a + b;
    }
        

Unit Test for the Function:

    // test_math_functions.cpp
    #include 
    #include "math_functions.h"

    // Test case for add function
    TEST(AdditionTest, HandlesPositiveInput) {
        EXPECT_EQ(add(1, 2), 3);  // Check if 1 + 2 equals 3
    }

    TEST(AdditionTest, HandlesNegativeInput) {
        EXPECT_EQ(add(-1, -2), -3);  // Check if -1 + (-2) equals -3
    }

    TEST(AdditionTest, HandlesZeroInput) {
        EXPECT_EQ(add(0, 0), 0);  // Check if 0 + 0 equals 0
    }
        

Step 3: Compile and Run the Tests

To compile and run the tests, use the following commands:

    g++ test_math_functions.cpp -lgtest -lgtest_main -pthread -o test_app
    ./test_app
        

If all tests pass, the output will indicate that the tests were successful. If any tests fail, you’ll see an error message showing which test failed.

Setting Up Catch2

Catch2 is another popular and easy-to-use unit testing framework for C++. It’s header-only, meaning you don’t need to worry about linking external libraries, and it’s very simple to set up.

Step 1: Install Catch2

Catch2 is header-only, so installing it is simple. You can either download the header file manually or use a package manager like vcpkg or conan.

Using vcpkg

To install Catch2 using vcpkg, run:

vcpkg install catch2

Manual Installation

To install Catch2 manually, you can download the latest version from the Catch2 GitHub repository:

git clone --branch v2.x https://github.com/catchorg/Catch2.git

Then, copy the single_include/catch2 directory to your project directory.

Step 2: Write Your First Test with Catch2

Here’s an example of a simple unit test using Catch2:

Function to Test:

    // math_functions.h
    #ifndef MATH_FUNCTIONS_H
    #define MATH_FUNCTIONS_H

    int add(int a, int b);

    #endif
        
    // math_functions.cpp
    #include "math_functions.h"

    int add(int a, int b) {
        return a + b;
    }
        

Unit Test for the Function:

    // test_math_functions.cpp
    #define CATCH_CONFIG_MAIN
    #include 
    #include "math_functions.h"

    TEST_CASE("Add function", "[add]") {
        SECTION("Handles positive input") {
            REQUIRE(add(1, 2) == 3);
        }

        SECTION("Handles negative input") {
            REQUIRE(add(-1, -2) == -3);
        }

        SECTION("Handles zero input") {
            REQUIRE(add(0, 0) == 0);
            REQUIRE(add(1, 0) == 1);
        }
    }
        

Step 3: Compile and Run the Tests

To compile and run the tests, use the following commands:

    g++ -std=c++11 test_math_functions.cpp -o test_app
    ./test_app
        

If the tests pass, you’ll see a message indicating that all tests were successful. If any test fails, Catch2 will provide detailed output about the failed test.

Conclusion

Setting up unit testing frameworks like Google Test or Catch2 in C++ is an essential step toward ensuring the correctness and stability of your code. Both frameworks provide easy-to-use tools for writing, running, and managing unit tests. Google Test is feature-rich and ideal for more complex testing needs, while Catch2 is lightweight and easy to set up for smaller projects. Regardless of the framework you choose, unit testing is a critical practice for improving code quality and maintaining the reliability of your C++ applications.





Advertisement