← Назад к вопросам

Какие библиотеки для тестов использовал?

1.2 Junior🔥 192 комментариев
#Сборка и инструменты

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какие библиотеки для тестов использовал?

В своей практике я использовал несколько популярных фреймворков для C/C++. Выбор зависит от типа проекта, требований и требуемого функционала.

Google Test (gtest/googletest)

Это самая популярная и мощная библиотека для unit-тестирования в C/C++. Разработана Google, используется в многих крупных проектах.

Особенности:

  • Простой синтаксис: TEST() и TEST_F() макросы
  • Фикстуры: SetUp() и TearDown() для подготовки
  • Параметризованные тесты: тестирование с разными параметрами
  • Моки: встроенная поддержка через gmock
  • Ассерции: подробные сообщения об ошибках
  • Быстрые тесты: параллельное выполнение
#include <gtest/gtest.h>

class CalculatorTest : public ::testing::Test {
public:
    Calculator calc;
};

TEST_F(CalculatorTest, AddPositiveNumbers) {
    EXPECT_EQ(calc.Add(2, 3), 5);
    EXPECT_GT(calc.Add(5, 5), 9);
}

TEST_F(CalculatorTest, AddNegativeNumbers) {
    EXPECT_EQ(calc.Add(-2, -3), -5);
}

// Параметризованный тест
class CalculatorParamTest : public ::testing::TestWithParam<std::pair<int, int>> {};

TEST_P(CalculatorParamTest, Add) {
    auto [a, b] = GetParam();
    EXPECT_EQ(calc.Add(a, b), a + b);
}

INSTANTIATE_TEST_SUITE_P(
    AddTests,
    CalculatorParamTest,
    ::testing::Values(
        std::make_pair(1, 2),
        std::make_pair(-1, -2),
        std::make_pair(0, 0)
    )
);

int main(int argc, char** argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

Компиляция

g++ test.cpp -o test $(pkg-config --cflags --libs gtest gtest_main)
./test --gtest_repeat=10 --gtest_shuffle

Google Mock (gmock)

Встроенная в Google Test система мокирования для создания фальшивых объектов.

#include <gmock/gmock.h>

class MockDatabase : public Database {
public:
    MOCK_METHOD(bool, Save, (const Data&), (override));
    MOCK_METHOD(Data, Load, (int), (override));
};

TEST(UserServiceTest, SaveUserCallsDatabase) {
    MockDatabase mockDb;
    UserService service(&mockDb);
    
    Data userData = {1, "John", "john@email.com"};
    
    // Ожидаем, что Save будет вызван с userData
    EXPECT_CALL(mockDb, Save(userData))
        .WillOnce(::testing::Return(true));
    
    EXPECT_TRUE(service.CreateUser(userData));
}

Catch2

Модерная альтернатива Google Test, более гибкая в плане синтаксиса.

#include <catch2/catch_test_macros.hpp>

TEST_CASE("String operations", "[strings]") {
    std::string str = "hello world";
    
    REQUIRE(str.find("world") != std::string::npos);
    REQUIRE(str.length() == 11);
}

TEST_CASE("Vector operations with BDD", "[vectors]") {
    std::vector<int> vec = {1, 2, 3};
    
    GIVEN("a vector with 3 elements") {
        WHEN("we add an element") {
            vec.push_back(4);
            
            THEN("the size should be 4") {
                REQUIRE(vec.size() == 4);
                REQUIRE(vec.back() == 4);
            }
        }
    }
}

Boost.Test

Часть библиотеки Boost, предоставляет мощный фреймворк для тестирования.

#define BOOST_TEST_MODULE Calculator Test
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(AddTest) {
    Calculator calc;
    BOOST_CHECK_EQUAL(calc.Add(2, 3), 5);
    BOOST_REQUIRE(calc.Add(5, 5) == 10);
}

BOOST_AUTO_TEST_SUITE(MathTests)

BOOST_AUTO_TEST_CASE(MultiplicationTest) {
    Calculator calc;
    BOOST_CHECK_EQUAL(calc.Multiply(3, 4), 12);
}

BOOST_AUTO_TEST_SUITE_END()

Doctest

Очень лёгкая библиотека, одиночный заголовочный файл, быстрая компиляция.

#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
#include <doctest/doctest.h>

TEST_CASE("Addition") {
    SUBCASE("Positive numbers") {
        CHECK(2 + 3 == 5);
    }
    
    SUBCASE("Negative numbers") {
        CHECK(-2 + (-3) == -5);
    }
}

CppUnit

Портированиe из JUnit для C++, старая, но проверенная библиотека.

#include <cppunit/TestCase.h>
#include <cppunit/TestFixture.h>
#include <cppunit/ui/text/TextTestRunner.h>

class CalculatorTest : public CppUnit::TestFixture {
public:
    CPPUNIT_TEST_SUITE(CalculatorTest);
    CPPUNIT_TEST(testAdd);
    CPPUNIT_TEST(testSubtract);
    CPPUNIT_TEST_SUITE_END();
    
private:
    void testAdd() {
        Calculator calc;
        CPPUNIT_ASSERT_EQUAL(5, calc.Add(2, 3));
    }
    
    void testSubtract() {
        Calculator calc;
        CPPUNIT_ASSERT_EQUAL(1, calc.Subtract(3, 2));
    }
};

Мои предпочтения для разных сценариев

Google Test (рекомендуется для большинства проектов)

// Лучший выбор для:
// + Серьёзные enterprise проекты
// + Нужны моки и параметризованные тесты
// + Большая кодовая база
// + Часто используется в Open Source

Catch2 (рекомендуется для новых проектов)

// Лучший выбор для:
// + Современный синтаксис
// + Простота использования
// + Быстрая разработка
// + Гибкие фикстуры

Doctest (рекомендуется для небольших проектов)

// Лучший выбор для:
// + Минимальные зависимости
// + Быстрая компиляция
// + Простые тесты
// + Заголовочный файл

Сравнение

ФреймворкСложностьСкорость компиляцииФункционалПоддержка
Google TestСредняяМедленнаяПолныйОтличная
Catch2НизкаяБыстраяПолныйХорошая
DoctestНизкаяОчень быстраяБазовыйАктивно развивается
Boost.TestВысокаяМедленнаяПолныйХорошая
CppUnitВысокаяМедленнаяСреднийНеактивно

Интеграция в CMake

# Google Test
find_package(GTest REQUIRED)
add_executable(tests test.cpp)
target_link_libraries(tests GTest::GTest GTest::Main)

# Catch2
find_package(Catch2 3 REQUIRED)
add_executable(tests test.cpp)
target_link_libraries(tests Catch2::Catch2WithMain)

# Doctest (заголовочный файл)
include_directories(${CMAKE_SOURCE_DIR}/include)
add_executable(tests test.cpp)

Best Practices

// 1. Используй фикстуры для подготовки
class FileTest : public ::testing::Test {
protected:
    void SetUp() override {
        file.open("test.txt");
    }
    
    void TearDown() override {
        file.close();
        std::filesystem::remove("test.txt");
    }
    
    std::fstream file;
};

// 2. Проверяй граничные случаи
TEST(StringTest, EmptyString) {
    EXPECT_TRUE(isEmpty(""));
}

// 3. Используй параметризованные тесты для вариаций
TEST_P(SortTest, Sort) {
    auto input = GetParam();
    auto expected = input;
    std::sort(expected.begin(), expected.end());
    EXPECT_EQ(MySort(input), expected);
}

// 4. Пиши независимые тесты
// Каждый тест должен работать отдельно

// 5. Используй моки для зависимостей
MockFileSystem mockFS;
EXPECT_CALL(mockFS, Read("file.txt")).WillOnce(Return("content"));

Мой выбор в большинстве проектов — Google Test за его мощность и надёжность, но для новых проектов я рассматриваю Catch2 за лучшую современную архитектуру.

Какие библиотеки для тестов использовал? | PrepBro