Как написать ut для сложного алгоритма

Я думал написать ut для сложного алгоритма, который состоит из многих шагов. Например, класс алгоритма, как показано ниже. И я хочу проверить каждый шаг. Но очевидно, что я могу обработать приватную функцию. Я использую Google Gtest.

Как мне спроектировать UT?

Class Algorithm
{private:
    PreProcess();
    Process();
    PostProcess();
}

1 ответ

Решение

В документации по тестированию Google есть специальный раздел, посвященный тестированию частного кода.

Короткая версия, старайтесь избегать тестирования непубличных функций. Если вам нужно, то вы можете либо изменить дизайн своего класса, либо ваш тест может стать другом класса.

GTest предоставляет вспомогательный макрос для этой последней опции: FRIEND_TEST, но остерегайтесь проблем с пространством имен с этим. Ваш тест должен быть определен в том же пространстве имен, что и класс, тестируемый для работы этого макроса.

Так что-то вроде:

#include <iostream>
#include "gtest/gtest.h"

class Algorithm {
 private:
  bool PreProcess() { std::cout << "Pre\n"; return true; }
  bool Process() { std::cout << "Process\n"; return true; }
  bool PostProcess() { std::cout << "Post\n"; return true; }
  FRIEND_TEST(AlgorithmPrivateTest, PreProcess);
  FRIEND_TEST(AlgorithmPrivateTest, Process);
  FRIEND_TEST(AlgorithmPrivateTest, PostProcess);
};

class AlgorithmPrivateTest : public testing::Test {
 protected:
  AlgorithmPrivateTest() : algorithm_() {}
  Algorithm algorithm_;
};

TEST_F(AlgorithmPrivateTest, PreProcess) {
  EXPECT_TRUE(algorithm_.PreProcess());
}

TEST_F(AlgorithmPrivateTest, Process) {
  EXPECT_TRUE(algorithm_.Process());
}

TEST_F(AlgorithmPrivateTest, PostProcess) {
  EXPECT_TRUE(algorithm_.PostProcess());
}

int main(int argc, char **argv) {
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}
Другие вопросы по тегам