开始读samples代码。
sample1
sample1包含三个文件,源文件sample1.cc
和头文件sample1.h
,以及重点要GoogleTest的测试文件sample1_unittest.cc
。sample1.cc和sample1.h中定一个了两个函数:
int Factorial(int n); //返回输入参出n的阶乘n!。
bool IsPrime(int n); //判断输入值是否为质数。
然后就是sample1_unittest.cc文件内容,以下是注释的内容:
<技术细节>
在GoogleTest中,tests被分组到测试用例(test cases)中。所以为了使代码有条理,应该将逻辑相关的测试(tests)放到同一个测试用例中(test case)。
测试用例(test case)和测试(test)的名字必须是有效的C++标识符,且不能使用下划线。
GoogleTest会确保将定义的所有test运行一遍,但是不保证测试的运行顺序。所以在编写测试(test)时不应该编写依赖于其他测试(test)运行结果的测试(test)。
PS:sample1 _unittest.cc中用两个测试用例FactorialTest
和IsPrimeTest
分别用来包含其对应的Factorial函数
和IsPrime函数
的所有测试。
定义一个简单的TEST(所有测试用例均是非法输入):
TEST(FactorialTest, Negative) {
EXPECT_EQ(1, Factorial(-5));
EXPECT_EQ(1, Factorial(-1));
EXPECT_GT(Factorial(-10), 0);
}
以上定义:这个test名为Negative
属于测试用例FactorialTest
。EXPECT_EQ(expected, actual)
等价于EXPECT_TRUE((excepted) == (actual))
当断言失败时会打印出预期值和实际值,这将对调试十分有用,因此这种情况下EXPECT_EQ
是首选。另一方面EXPECT_TRUE
可以接受任何BOOL类型的值,因此更加通用。
另两个属于FactorialTest
的测试(test),Zero
和Positive
TEST(FactorialTest, Zero) {
EXPECT_EQ(1, Factorial(0));
}
TEST(FactorialTest, Position) {
EXPECT_EQ(1, Factorial(1));
EXPECT_EQ(2, Factorial(2));
EXPECT_EQ(6, Factorial(3));
EXPECT_EQ(40320, Factorial(8));
}
接着是属于测试用例IsPrimeTest
的三个测试Nagative
、Trivial
、Positive
。
TEST(IsPrimeTest, Negative) {
// This test belongs to the IsPrimeTest test case.
EXPECT_FALSE(IsPrime(-1));
EXPECT_FALSE(IsPrime(-2));
EXPECT_FALSE(IsPrime(INT_MIN));
}
TEST(IsPrimeTest, Trivial) {
EXPECT_FALSE(IsPrime(0));
EXPECT_FALSE(IsPrime(1));
EXPECT_TRUE(IsPrime(2));
EXPECT_TRUE(IsPrime(3));
}
TEST(IsPrimeTest, Positive) {
EXPECT_FALSE(IsPrime(4));
EXPECT_TRUE(IsPrime(5));
EXPECT_FALSE(IsPrime(6));
EXPECT_TRUE(IsPrime(23));
}
由于IsPrime()函数直接返回Bool类型,所以可以直接用EXPECT_FALSE
或EXPECT_TRUE
判断函数返回值。so,能不能用EXPRCT_EQ
判断函数的返回值和true
或false
比较。
修改一下发现是可以的。
最后说一下main在哪(>_<!!!).
因为不管是sample1.cc 还是sample_unittest.cc源文件中都没有发现main函数的踪迹。
GoogleTest测试框架的main方法要求,在main方法中调用宏RUN_ALL_TESTS()。而在3rdpart/googletest/googletest/src/gtest_main.cc文件中有一个最简单的符合要求的main,内容为:
GTEST_API_ int main(int argc, char **argv) {
printf("Running main() from %s\n", __FILE__);
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
再读一下GoogleTest项目中的CMake文件,在3rdpart/googletest/googletest/CMakeLists.txt
发现会生成两个静态库。其一是gtest
由当前目录下的/src
中的gtest-all.cc
编译而成,而该文件内容是include该文件同目录下除gtest_main.cc
和其自身的所有.cc文件。另一个则是gtest_main
库,它只由/src/gtest_main.cc
文件编译而成。所以在自己的项目中如果要使用GoogleTest则必须要为可执行文件添加动态连接库gtest
,而是否添加gtest_main
库与否则取决于是否在自己测试文件中定义过main
方法。
而我自己编写的sample1的CMake中同时连接了gtest
、gtest_main
库,所以sample1直接使用了GoogleTest库提供的main函数。
最后总结一下sample1中在test中的测试宏。
- EXPECT_EQ(expected, actual);
- EXPECT_GT(expected, actual);
- EXPECT_TRUE(actual);
- EXPECT_FALSE(actual);