我想为一个复杂的算法编写 ut,它由许多步骤组成。例如,如下所示的算法类。我想测试每一步。但很明显我可以处理私有函数。我正在使用谷歌 gtest。
我应该如何设计 UT?
Class Algorithm
{private:
PreProcess();
Process();
PostProcess();
}
我想为一个复杂的算法编写 ut,它由许多步骤组成。例如,如下所示的算法类。我想测试每一步。但很明显我可以处理私有函数。我正在使用谷歌 gtest。
我应该如何设计 UT?
Class Algorithm
{private:
PreProcess();
Process();
PostProcess();
}
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();
}