Запускайте тесты Google для своих проектов C++

Тестирование программного обеспечения — это процесс оценки и подтверждения того, что программное приложение или продукт, использующий программные модули, работает должным образом. Тестирование имеет такие преимущества, как обнаружение ошибок, снижение затрат на разработку и, наконец, влияет на повышение производительности.

В следующей статье описаны простые шаги, позволяющие запустить GoogleTest в вашем проекте C++.

Исходный код этой статьи вы найдете на моем GitHub.

Я опишу метод, когда исходные файлы (googletest) находятся на вашей машине.

Для простоты я опишу настройку, которую вы можете найти на моем GitHub,

mkdir optimizer

Внутри оптимизированного репозитория клонов папок от Google,

cd optimizer
git clone https://github.com/google/googletest

Создайте дополнительные папки, которые будут включать ваши файлы C++,

mkdir -p build src lib tests

Создайте CMakeFiles.txt,

touch CMakeFiles.txt

Для лучшего понимания того, как настроить CMakeLists.txt, рекомендую выдающийся репозиторий,

Ваше окончательное дерево оптимизатора папок будет выглядеть следующим образом:

Теперь мы создадим простую программу на C++, которая умножает числа.

Внутри папки src выполните,

touch main.cpp product.cpp

Внутри папки lib выполнить,

touch product.h

В файле main.cpp мы создаем объект p и вызываем два метода.

#include <iostream>
#include "product.h"


int main (){

    Product p;

    auto c1 = p.computeA(10,20);
    auto c2 = p.computeB(10,20,30);
    std::cout << "c1=" << c1 << " c2=" << c2 << "\n";

}

Файлы product.cpp и product.h можно изобразить следующим образом:

//product.h
#pragma once

class Product
{

public:
    int computeA(int, int);
    int computeB(int, int, int);
};
//product.cpp
#include "product.h"

int Product::computeA(int a, int b)
{

    return a * b;
}

int Product::computeB(int a, int b, int c)
{

    return a * b * c;
}

Чтобы собрать наш проект (без GoogleTest), нам нужно подготовить простой файл CMakeList.txt, который мы создали ранее.

# $ cmake --version
cmake_minimum_required(VERSION 3.5)

# Set the project name
project (optimizer)

# add header files in the lib
include_directories(lib) 

# Create a sources variable with a link to all cpp files to compile
set(SOURCES
    src/main.cpp
    src/product.cpp
)

# Add an executable with the above sources
add_executable(run_opt ${SOURCES})

target_include_directories(run_opt
    PRIVATE 
        ${PROJECT_SOURCE_DIR}/lib
)

В вашем терминале

cd build
cmake ..
make ..

Вы можете запустить свою программу,

./run_opt

Теперь мы включим GoogleTest в наш проект и создадим простой тест, который проверяет нашу программу на C++.
Тесты, которые мы собираемся запустить для нашей программы, мы указываем в дополнительном файле, который мы можем создать в папке с тестами,

cd tests
touch utest-product.cpp

После создания файла мы можем создать тест, который проверит производительность нашего программного обеспечения. Все доступные тесты вы найдете здесь. Я ограничил тест логическим сравнением.

#include "product.h"
#include <gtest/gtest.h>

// https://google.github.io/googletest/reference/assertions.html

namespace
{
    TEST(PersonTestSuite, functionA)
    {
        Product p;
        EXPECT_EQ(p.computeA(10, 20), 200);
    }
    TEST(PersonTestSuite, functionB)
    {
        Product p;
        EXPECT_EQ(p.computeB(10, 20, 30), 6000);
    }

    TEST(PersonTestSuite, not_equal_functionB)
    {
        Product p;
        EXPECT_NE(p.computeB(10, 20, 30), 5000);
    }

    TEST(PersonTestSuite, fun_B_greater_funA)
    {
        Product p;
        EXPECT_GT(p.computeB(10, 20, 30), p.computeA(10, 10));
    }

}

Если вы рассмотрите содержимое файла, вы заметите, что тест сравнивает выходные данные методов, вызываемых программой GTest.

Чтобы создать программу, которая тестирует ваши файлы C++ (вашу программу), вам нужно будет добавить определенные флаги в ваш файл CMakeList.txt (который вы создали ранее — я добавил поясняющие комментарии).

# $ cmake --version
cmake_minimum_required(VERSION 3.5)

# Set the project name
project (optimizer)

# add googletest subdirectory
add_subdirectory(googletest)

# this is so we can #include <gtest/gtest.h> 
include_directories(googletest/include)

# add header files in the lib
include_directories(lib) 

# Create a sources variable with a link to all cpp files to compile
set(SOURCES
    src/main.cpp
    src/product.cpp
)

# Add an executable with the above sources
add_executable(run_opt ${SOURCES})


# Set the directories that should be included in the build command for this target

target_include_directories(run_opt
    PRIVATE 
        ${PROJECT_SOURCE_DIR}/lib
)

enable_testing()
add_executable(run_opt_test
  src/product.cpp tests/utest-product.cpp
)

target_link_libraries(run_opt_test GTest::gtest_main)

include(GoogleTest)
gtest_discover_tests(run_opt_test )

Вы можете выступать снова,

cd build
cmake ..
make ..

и запустите свой тест,

./run_opt_test

Ожидаемый результат,

Спасибо за чтение.