Ответ
В 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.