Установка Google Test
▸Через CMake
1include(FetchContent)2FetchContent_Declare(3 googletest4 GIT_REPOSITORY https://github.com/google/googletest.git5 GIT_TAG v1.14.06)7FetchContent_MakeAvailable(googletest)89enable_testing()10add_executable(tests test_main.cpp)11target_link_libraries(tests PRIVATE GTest::gtest_main gtest_main)
Основы тестирования
▸Простой тест
1#include <gtest/gtest.h>2#include "calculator.h"34TEST(CalculatorTest, Addition) {5 Calculator calc;6 EXPECT_EQ(calc.add(2, 3), 5);7 EXPECT_EQ(calc.add(-1, 1), 0);8}910TEST(CalculatorTest, Division) {11 Calculator calc;12 EXPECT_DOUBLE_EQ(calc.divide(10, 3), 3.3333333333333335);13 EXPECT_THROW(calc.divide(1, 0), std::runtime_error);14}
▸Макросы проверки
| Макрос | Описание |
|--------|----------|
| EXPECT_EQ | Проверка равенства |
| EXPECT_NE | Проверка неравенства |
| EXPECT_TRUE | Проверка истинности |
| EXPECT_FALSE | Проверка ложности |
| EXPECT_THROW | Проверка исключения |
| EXPECT_NO_THROW | Отсутствие исключения |
| ASSERT_* | Аналог EXPECT, но останавливает тест |
Test Fixtures
Фикстуры позволяют настроить общее окружение для группы тестов.
1class StackTest : public ::testing::Test {2protected:3 void SetUp() override {4 stack.push(1);5 stack.push(2);6 stack.push(3);7 }89 std::stack<int> stack;10};1112TEST_F(StackTest, TopReturnsLastPushed) {13 EXPECT_EQ(stack.top(), 3);14}1516TEST_F(StackTest, PopRemovesElement) {17 stack.pop();18 EXPECT_EQ(stack.top(), 2);19}2021TEST_F(StackTest, SizeIsCorrect) {22 EXPECT_EQ(stack.size(), 3);23}
Параметризованные тесты
1class PrimeTest : public ::testing::TestWithParam<int> {};23TEST_P(PrimeTest, IsPrime) {4 int n = GetParam();5 EXPECT_TRUE(isPrime(n)) << n << " is not prime";6}78INSTANTIATE_TEST_SUITE_P(9 PrimeNumbers,10 PrimeTest,11 ::testing::Values(2, 3, 5, 7, 11, 13, 17, 19, 23, 29)12);
Мокирование
▸Google Mock
1#include <gmock/gmock.h>23class Database {4public:5 virtual ~Database() = default;6 virtual bool connect(const std::string& url) = 0;7 virtual std::vector<User> getUsers() = 0;8 virtual void saveUser(const User& user) = 0;9};1011class MockDatabase : public Database {12public:13 MOCK_METHOD(bool, connect, (const std::string&), (override));14 MOCK_METHOD(std::vector<User>, getUsers, (), (override));15 MOCK_METHOD(void, saveUser, (const User&), (override));16};1718TEST(ServiceTest, SaveUser) {19 MockDatabase db;20 EXPECT_CALL(db, saveUser(testing::_))21 .Times(1);2223 Service service(db);24 service.createUser("John");25}
Тестирование исключений
1TEST(ExceptionTest, HandlesInvalidInput) {2 Parser parser;3 EXPECT_THROW(parser.parse("invalid"), ParseException);4}56TEST(ExceptionTest, ExceptionMessage) {7 try {8 Parser parser;9 parser.parse("");10 } catch (const ParseException& e) {11 EXPECT_STREQ(e.what(), "Empty input");12 }13}
Интеграция с CMake
1enable_testing()2find_package(GTest REQUIRED)34add_executable(unit_tests5 tests/test_calculator.cpp6 tests/test_parser.cpp7)89target_link_libraries(unit_tests PRIVATE10 GTest::gtest11 GTest::gtest_main12 mylib13)1415include(GoogleTest)16gtest_discover_tests(unit_tests)
Запуск тестов
1# Сборка2cmake -B build -DCMAKE_BUILD_TYPE=Debug3cmake --build build45# Запуск всех тестов6cd build && ctest --output-on-failure78# Запуск конкретного теста9./build/unit_tests --gtest_filter="CalculatorTest.*"
Заключение
Google Test — это стандарт unit-тестирования в C++. Онпредоставляет fixtures, параметризованные тесты, мокирование и интеграцию с CMake. Регулярное тестирование повышает надёжность кода и упрощает рефакторинг.