gtest是一个很好用的测试框架,可以很方便地对函数进行单元测试。
主页:http://code.google.com/p/googletest/
在使用gtest的过程中,我发现使用gtest对类进行白盒测试有些麻烦——因为测试用例可能需要访问类的私有变量或者私有函数。
最原始的解决方法有两个:
1)为私有变量增加get函数,这个太麻烦了,而且会使得类的接口急剧膨胀。
2)使用FRIEND_TEST宏,这个不算麻烦,假设测试 TEST(TestClassA, WhiteBoxTesting)想要访问类A的私有变量,在类A中声明FRIEND_TEST(TestClassA, WhiteBoxTesting)即可。但这样有两个问题:第一,如果有很多测试用例,类A中要声明得不亦说乎。第二,为了使源码不依赖于具体测试框架,我们希望不要在类A中包含gtest头文件。
目前的解决方法:使用friend class
在类A中声明:friend class white_box_testing_classa;
在测试代码里面:
class white_box_testing_classa
: public testing::Test
{
static void test_method1(){// 这里可以自由访问A的私有成员}
static void test_method2(){// 这里可以自由访问A的私有成员}
// 根据需要定义SetUpTestCase() TearDownTestCase() SetUp() TearDown()
};
TEST_F(white_box_testing_classa, test_method1)
{
white_box_testing_classa::test_method1();
}
TEST_F(white_box_testing_classa, test_method2)
{
white_box_testing_classa::test_method2();
}
期间遇到的问题:c++里面如果类A属于命名中间ns_x,则声明的友类如果不加域修饰符则必须也属于ns_x。否则即使声明了友类,也会提示无权限访问私有成员!
使用域修饰符,友类可以属于其他命名空间,但是比较麻烦,所以直接把测试代码放在同个命名空间比较省事。