sample1

开始读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中用两个测试用例FactorialTestIsPrimeTest分别用来包含其对应的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),ZeroPositive

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的三个测试NagativeTrivialPositive

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_FALSEEXPECT_TRUE判断函数返回值。so,能不能用EXPRCT_EQ判断函数的返回值和truefalse比较。
修改一下发现是可以的。

最后说一下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中同时连接了gtestgtest_main库,所以sample1直接使用了GoogleTest库提供的main函数。

最后总结一下sample1中在test中的测试宏。

  • EXPECT_EQ(expected, actual);
  • EXPECT_GT(expected, actual);
  • EXPECT_TRUE(actual);
  • EXPECT_FALSE(actual);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值