Какие библиотеки для тестов использовал?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Какие библиотеки для тестов использовал?
В своей практике я использовал несколько популярных фреймворков для 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 за лучшую современную архитектуру.