简单介绍
GoogleTest 是一个由 Google 的测试技术团队开发的测试框架,它考虑到了谷歌的特定需求和限制。无论你使用的是 Linux、Windows 还是 Mac,只要你编写 C++ 代码,GoogleTest 都可以帮到你。它支持任何类型的测试,不只是单元测试。(以下称 googletest)
优点
1.测试应该是独立的且可重复的。调试由于其它测试而成功或失败的测试是令人痛苦的,googletest通过在不同的对象上运行每个测试用例来隔离测试。当测试失败时,googletest允许你单独运行它,以便快速调试。
1.Tests should be independent and repeatable. It's a pain to debug a test that succeeds or fails as a result of other tests. googletest isolates the tests by running each of them on a different object. When a test fails, googletest allows you to run it in isolation for quick debugging.
2.测试应该得到良好的组织,并反映测试代码的结构。googletest将相关的测试分组为测试套件,它们可以共享数据和子例程。这种常见的模式很容易接受,并且使测试很容易维护。这样的一致性在人们切换项目并开始工作在一个新的代码库上时尤其有用。
2.Tests should be well organized and reflect the structure of the tested code. googletest groups related tests into test suites that can share data and subroutines. This common pattern is easy to recognize and makes tests easy to maintain. Such consistency is especially helpful when people switch projects and start to work on a new code base.
3.测试应该是可移植的且可复用的。Google 具有大量的平台无关的代码,它的测试也应该是平台无关的。googletest适用于不同的操作系统,不同的编译器,有异常或没有异常,所以 googletest测试可以使用多种配置。
3.Tests should be portable and reusable. Google has a lot of code that is platform-neutral; its tests should also be platform-neutral. googletest works on different OSes, with different compilers, with or without exceptions, so googletest tests can work with a variety of configurations.
4.当测试失败时,它们应该提供尽可能多的关于故障的信息。googletest 不会在第一个测试失败时停止。相反,它仅停止当前的测试并继续运行下一个。你还可以设置测试报告非致命故障,在此之后,当前测试将继续运行。这样,你可以在一个运行-编辑-编译周期中探测并解决多个 bug。
4.When tests fail, they should provide as much information about the problem as possible. googletest doesn't stop at the first test failure. Instead, it only stops the current test and continues with the next. You can also set up tests that report non-fatal failures after which the current test continues. Thus, you can detect and fix multiple bugs in a single run-edit-compile cycle.
5.测试框架应该将测试编写者从家务活中解放出来,并让他们将精力集中在测试内容上。googletest 自动追踪所有定义的测试,且无需用户以运行它们的顺序迭代它们。
5.The testing framework should liberate test writers from housekeeping chores and let them focus on the test content. googletest automatically keeps track of all tests defined, and doesn't require the user to enumerate them in order to run them.
6.测试要快。通过 googletest,你可以跨测试用例复用共享资源,且只支付(执行)一次 set-up/tear-down 的开销,不使测试相互依赖。
6.Tests should be fast. With googletest, you can reuse shared resources across tests and pay for the set-up/tear-down only once, without making tests depend on each other.
基本概念
使用 googletest,最先写的就是断言(assertion)。断言是一种检查某个条件是否为真的描述。断言的结果可以是成功、非致命失败、致命失败。当致命失败发生时,当前函数将会终止;而断言的其他结果则不会有此效果。
Test 使用断言来判断测试代码的行为:如果一个 Test 崩溃了或者出现了一个失败的断言,则该 Test 就失败了;反之,它就是成功的。
Test case 包括一个或多个 Test。我们应当把 Test 打包、分组,放入 Test Case 中,以便测试代码的结构更加清晰。当一个 Test Case 中的多个 Test 需要共享对象和子程序时,我们可以把这些共享内容放入一个(test fixture)类中。
一个测试程序可以包含多个 Test Case。
基本断言
有两种断言可供我们使用:
ASSERT_* :当断言失败时,产生致命错误,并终止当前函数;
EXPECT_* :当断言失败时,产生非致命错误,并且不会终止当前函数。
第一个Demo
1.首先给一个googletest在github上的开源代码,在此基础上做一些操作。
https://github.com/google/googletest
2.打开下载好的googletest文件中的msvc文件夹运行.sln,选择gtest和gtest_main两个项目。分别编译debug和release两个版本,gtest文件夹下会有gtest_maind.lib、gtestd.lib、gtest.lib、gtest_main.lib。
共生成4个文件
googletest\msvc\2010\gtest\x64-Debug - Debug方案下的二进制文件:
gtestd.lib、gtest_maind.lib(注意主文件名的d后缀)
googletest\msvc\2010\gtest\x64-Release - Release方案下的二进制文件:
gtest.lib、gtest_main.lib
注意:如果是Release版本,Runtime Library(运行库)设为/MT。当然,其实你也可以选择动态链接(/MD),前提是你之前编译的gtest也使用了同样是/MD选项。(对于Debug和Release不清楚的看文章结尾有介绍)
3.在VS中,新建一个Win32 Console Application。接着就是设置工程属性,如下:
修改vs中的解决方案配置,将其修改为和你要测试的工程配置相同,这里以“Debug x32”为例。
(vs中,Debug和Release生成的lib库是不同的,分别为gtestd.lib和gtest.lib,两个是不同的,不可混用。)-
在解决方案资源管理器中修改工程的属性,确保配置为Debug x32。
修改配置属性-C/C++-代码生成-运行库,将其修改为和你要测试的工程配置相同,这里以“多线程调试DLL(/MTd)”为例
4.将之前生成的.lib文件(只需要拷贝你需要的)然后添加你文件路径。
第一步:
第二步:
第三步:
到这里对于googletest的一些配置就完成了。
最后在你的程序中加入测试,然后运行。
#include "h.h"
#include ".\include\gtest\gtest.h"
TEST(testcase, test0)
{
EXPECT_EQ(add(1, 23), 24);
}
int add(int a,int b)
{
return a + b;
}
int main(int argc,char** argv)
{
testing::InitGoogleTest(&argc, argv);
RUN_ALL_TESTS();
getchar();
return 0;
}
讲一下Debug和Release版本的区别以及MTd和MDd
Debug 通常称为调试版本,它包含调试信息,容量比Release大很多,并且不作任何优化,便于程序员调试程序。(优化会使调试复杂化,因为源代码和生成的指令间关系会更复杂)Debug模式下生成两个文件,除了.exe或.dll文件外,还有一个.pdb文件,该文件记录了代码中断点等调试信息。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。Release模式下生成一个文件.exe或.dll文件
Debug 版本:
/MDd /MLd 或 /MTd 使用 Debug runtime library(调试版本的运行时刻函数库)
/Od 关闭优化开关
/D "_DEBUG" 相当于 #define _DEBUG,打开编译调试代码开关(主要针对assert函数)
/ZI 创建 Edit and continue(编辑继续)数据库,这样在调试过程中如果修改了源代码不需重新编译
/GZ 可以帮助捕获内存错误
/Gm 打开最小化重链接开关,减少链接时间
Release 版本:
/MD /ML 或 /MT 使用发布版本的运行时刻函数库
/O1 或 /O2 优化开关,使程序最小或最快
/D "NDEBUG" 关闭条件编译调试代码开关(即不编译assert函数)
/GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改
实际上,Debug 和 Release 并没有本质的界限,他们只是一组编译选项的集合,编译
器只是按照预定的选项行动。事实上,我们甚至可以修改这些选项,从而得到优化过的调
试版本或是带跟踪语句的发布版本。
文章参考:https://github.com/google/googletest/blob/master/googletest/docs/primer.md
https://blog.csdn.net/liitdar/article/details/85712973
https://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html