Какие библиотеки для тестирования вы использовали в проектах на C++?

«Какие библиотеки для тестирования вы использовали в проектах на C++?» — вопрос из категории Тестирование, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В C++ проектах я в основном работал со следующими библиотеками для модульного тестирования:

  • Google Test (gtest) с Google Mock (gmock): Это мой основной выбор для больших проектов. Фреймворк предоставляет богатый набор макросов для утверждений (ASSERT_*, EXPECT_*), поддержку фикстур, параметризованных тестов и мощную систему мок-объектов.

    #include <gtest/gtest.h>
    #include <gmock/gmock.h>
    
    TEST(CalculatorTest, AddsTwoNumbers) {
        EXPECT_EQ(Add(2, 3), 5);
    }
    
    class MockDatabase : public DatabaseInterface {
    public:
        MOCK_METHOD(std::string, FetchName, (int id), (override));
    };
    
    TEST(UserTest, GetsUserName) {
        MockDatabase db;
        EXPECT_CALL(db, FetchName(42))
            .WillOnce(Return("John Doe"));
        // Тестируемый код, использующий db
    }
  • Catch2: Отличный современный header-only фреймворк. Я использовал его в небольших проектах или библиотеках из-за простоты интеграции (просто добавить один заголовочный файл) и читаемого синтаксиса BDD-стиля.

    #define CATCH_CONFIG_MAIN
    #include <catch2/catch_all.hpp>
    
    TEST_CASE("Vector can be sized and resized", "[vector]") {
        std::vector<int> v(5);
        REQUIRE(v.size() == 5);
        REQUIRE(v.capacity() >= 5);
    
        SECTION("resizing bigger changes size and capacity") {
            v.resize(10);
            REQUIRE(v.size() == 10);
            REQUIRE(v.capacity() >= 10);
        }
    }

Для создания тестовых дублей (mocks/stubs) в проектах без gmock я иногда применял FakeIt или Trompeloeil (для C++14/17). Для интеграционного и системного тестирования часто писал собственные утилиты на основе Boost.Test или использовал скрипты на Python.