技术标签: googletest 测试 testing google windows 框架
前几个月Google开源了它的测试框架,自称其旗下的上千个项目都在使用它。今天我们就用它来尝尝鲜吧?:-)
安装:
下载Google C++ Testing Framework,解压...
VC2005:
直接打开msvc/gtest.vcproj或msvc/gtest.sln,直接编译即可。
Linux/Unix下的GCC:
传统过程:./configure make
Mingw:
BCC:
用Mingw和BCB6编译需要修改一些代码,过几天我会上传到www.cppprog.com网站上。
使用:
首先#include <gtest/gtest.h>,当然工程的头文件路径要设置正确
1.简单测试TEST
假如我写了个函数,是计算阶乘的:
运行结果:
瞧:测试框架指出:TestFactorial.ZeroInput运行OK,运行OtherInput时出现三次结果和预期不符。
2.多个测试场景需要相同数据配置的情况,用TEST_F
运行结果:
瞧,Google C++ 测试框架毫不客气地指出偶的getfilename返回的字符串比预期的多了一个'//'
快速入门:
Google提供了两种断言形式,一种以ASSERT_开头,另一种以EXPECT_开头,它们的区别是ASSERT_*一旦失败立马退出,而EXPECT_还能继续下去。
断言列表:
真假条件测试:
致命断言 | 非致命断言 | 验证条件 |
ASSERT_TRUE(condition); | EXPECT_TRUE(condition); | condition为真 |
ASSERT_FALSE(condition); | EXPECT_FALSE(condition); | condition 为假 |
数据对比测试:
致命断言 | 非致命断言 | 验证条件 |
ASSERT_EQ(期望值, 实际值); | EXPECT_EQ(期望值, 实际值); | 期望值 == 实际值 |
ASSERT_NE(val1, val2); | EXPECT_NE(val1, val2); | val1 != val2 |
ASSERT_LT(val1, val2); | EXPECT_LT(val1, val2); | val1 < val2 |
ASSERT_LE(val1, val2); | EXPECT_LE(val1, val2); | val1 <= val2 |
ASSERT_GT(val1, val2); | EXPECT_GT(val1, val2); | val1 > val2 |
ASSERT_GE(val1, val2); | EXPECT_GE(val1, val2); | val1 >= val2 |
字符串(针对C形式的字符串,即char*或wchar_t*)对比测试:
致命断言 | 非致命断言 | 验证条件 |
ASSERT_STREQ(expected_str, actual_str); | EXPECT_STREQ(expected_str, actual_str); | 两个C字符串有相同的内容 |
ASSERT_STRNE(str1, str2); | EXPECT_STRNE(str1, str2); | 两个C字符串有不同的内容 |
ASSERT_STRCASEEQ(expected_str, actual_str); | EXPECT_STRCASEEQ(expected_str, actual_str); | 两个C字符串有相同的内容,忽略大小写 |
ASSERT_STRCASENE(str1, str2); | EXPECT_STRCASENE(str1, str2); | 两个C字符串有不同的内容,忽略大小写 |
TEST宏:
TEST宏的作用是创建一个简单测试,它定义了一个测试函数,在这个函数里可以使用任何C++代码并使用上面提供的断言来进行检查。
TEST的第一个参数是测试用例名,第二个参数是测试用例中某项测试的名称。一个测试用例可以包含任意数量的独立测试。这两个参数组成了一个测试的全称。
就前面的例子来说:
我们要测试这个函数:int Factorial(int n); // 返回n的阶乘
我们的测试用例是:测试输入0的情况,测试输入其它数据的情况,于是就有了:
Google Test根据测试用例来分组收集测试结果,因此,逻辑相关的测试应该在同一测试用例中;换句话说,它们的TEST()的第一个参数应该是一样的。在上面的 例子中,我们有两个测试,ZeroInput和OtherInput,它们都属于同一个测试用例TestFactorial。
TEST_F宏:
TEST_F宏用于在多个测试中使用同样的数据配置,所以它又叫:测试夹具(Test Fixtures)
如果我们的多个测试要使用相同的数据(如前例中,我们的Test_GFN和Test_GP都使用程序自身的完整文件名来测试),就可以采用一个测试夹具。
要创建测试固件,只需:
当我们要使用固件时,使用TEST_F()替换掉TEST(),它允许我们存取测试固件中的对象和子程序:
TEST_F(test_case_name, test_name) {
... test body ...
}
与TEST()一样,第一个参数是测试用例的名称,但对TEST_F()来说,这个名称必须与测试夹具类的名称一样。
对于TEST_F()中定义的每个测试,Google Test将会:
注意,同一测试用例中,不同的测试拥有不同的测试夹具。Google Test不会对多个测试重用一个测试夹具,测试对测试夹具的改动并不会影响到其他测试。
调用测试
TEST()和TEST_F()向Google Test隐式注册它们的测试。因此,与很多其他的C++测试框架不同,你不需要为了运行你定义的测试而将它们全部再列出来一次。
在定义好测试后,你可以通过RUN_ALL_TESTS()来运行它们,如果所有测试成功,该函数返回0,否则会返回1.注意RUN_ALL_TESTS()会运行你链接到的所有测试——它们可以来自不同的测试用例,甚至是来自不同的文件。
当被调用时,RUN_ALL_TESTS()宏会:
此外,如果第二步时,测试夹具的构造函数产生一个致命错误,继续执行3至5部显然没有必要,所以它们会被跳过。与之相似,如果第3部产生致命错误,第4部也会被跳过。
重要:你不能忽略掉RUN_ALL_TESTS()的返回值,否则gcc会报一个编译错误。这样设计的理由是自动化测试服务会根据测试退出返回码来 决定一个测试是否通过,而不是根据其stdout/stderr输出;因此你的main()函数必须返回RUN_ALL_TESTS()的值。
而且,你应该只调用RUN_ALL_TESTS()一次。多次调用该函数会与Google Test的一些高阶特性(如线程安全死亡测试thread-safe death tests)冲突,因而是不被支持的。
编写main()函数
你可以从下面这个模板开始:
testing::InitGoogleTest() 函数负责解析命令行传入的Google Test标志,并删除所有它可以处理的标志。这使得用户可以通过各种不同的标志控制一个测试程序的行为。关于这一点我们会在GTestAdvanced中 讲到。你必须在调用RUN_ALL_TESTS()之前调用该函数,否则就无法正确地初始化标示。
在Windows上InitGoogleTest()可以支持宽字符串,所以它也可以被用在以UNICODE模式编译的程序中。
0 基础实体:一个实际问题中的具体对象,如一个零件,一个茶杯,一本书等。特征向量(feature vector):所有用于描述实体的数字的组合就是一个实体的特征向量。对应一个空间(1维到n维)中的点。特征提取:获取实体的特征向量的过程。1 TensorFlow游乐场链接:http://playground.tensorflow.org功能:通过网页可视化的训练简单的神经网络...
如何将数据集划分为测试数据集和训练数据集?把数据集分为两部分:分别用于训练和测试sklearn提供一个将数据集切分成训练集和测试集的函数。from sklearn.crose_validation import train_test_splitXd_train,Xd_test,y_train,y_test=train_test_split(X_d,y,random_state=14)_读取stroke_survival_small数据库,将数据的25%划分为验证集,75%划分为训练集。(re
JavaScript 是脚本语言,是一种解释性脚本语言(代码不进行预编译)_js全部代码
https://zhidao.baidu.com/question/259733725.html第二个回答_ad自动布线忽略gnd
Win7系统打开组策略提示“进行解析时遇到错误找不到资源”,如下图所示:方法一、修改本地组策略1、打开电脑左下角“开始”菜单,找到【运行】选项,点击打开;2、在弹出运行对话框,输入【gpedit.msc】点击确定;3、进入“本地组策略编辑器”,右键点击【计算机配置】下的【管理模板】,点击【添加或删除模板】;4、在弹出的“添加模板栏里”点击左下角“添加”选项;5、然后在“C:\Windows\inf..._管理模板进行解析时遇到错误
HTTP报文格式常见的回写客户端的数据的类型普通文件:text/plain; charset=ios-8859-1*.html:text/html; charset=ios-8859-1*.jpg : image/jpeg*.gif : image/gif*.png : image/png*.wav : video/x-msvideo*.mov : video/quicktime...
只需要在Service中的oncreat中添加下面这句话,然后启动的时候直接启动debug断点模式即可@Override public void onCreate() { android.os.Debug.waitForDebugger();_android service中打断点
点击上方“开发者技术前线”,选择“星标”13:21 在看真爱量子位 出品 | 编辑可可2015年1月,有位用户在知乎上提问:为什么现在这么多研究生想退学?四年后,这个问题开始每隔一段时间,就登一次知乎热榜。到现在,已经累积了1420个回答。一直持续不断地有人来说自己的故事。因为话题的原因,大多数回答都在讲述他们自己学术道路上的一些苦闷。有些匿名,有些实名。不少人提到了抑郁、枯燥、挣扎、压力大。..._北京大学计算机直博
产品管理 共有数据:{{ data.total }} 条
原文: 游终南山 「 南山塞天地,日月石上生。 高峰夜留景,深谷昼未明。 山中人自正,路险心亦平。 长风驱松柏,声拂万壑清。 即此悔读书,朝朝近浮名。 」详细.. 此诗载于《全唐诗》第三百七十五卷。陕西师范大学文学研究所所长、博士生导师霍松林教授认为欣赏这首诗,必须紧扣诗题“游终南山”...
卸载目录时,当前位置不能处于要卸载的目录,否则卸载不成功Every wonder why sometimes you get this message when you try to un-mount a NFS drive or cdrom drive (不能卸载的情形)CODEroot@homer:~# umount /mnt/cdr...