如何为复杂的算法编写ut

时间:2013-02-02 07:31:12

标签: c++ googletest

我想为一个复杂的算法编写ut,它包含许多步骤。例如,算法类如下所示。我想测试每一步。但很明显,我可以处理私人功能。 我正在使用谷歌gtest。

我该如何设计UT?

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

1 个答案:

答案 0 :(得分:2)

Google Test documentation中有一个特定部分负责测试私有代码。

简短版本是,尽量避免测试非公共功能。如果必须,那么你可以改变你的班级设计,或者你的考试可以成为班上的朋友。

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();
}