技术标签: 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模式编译的程序中。
64位 windows7 ,用 VMware7 安装了 ubuntu12.04 desktop 出现:kernel panic-not syncing : attempted to kill the idle task.问题解决:更改 VMware7 为 VMware9
最近关注到PCIE4.0*4固态硬盘读写速度已经在7000MB/s左右浮动了,有意入手光威Ultimate 1T(7000MB/s顺序读取,6800MB/s顺序写入,求踩坑),而我笔记本的WDS250G2X0C-00L350和IM2P33F8-512GD还是PCIE3.0*4接口(读写速度在1000~3000MB/s)突然就不香了。更换硬盘之前要了解本机的主板接口类型,但是大多数硬件监控软件只会告诉你硬盘的接口类型,不会告诉你硬盘接到哪个主板接口。_怎么看pcie3.0还是4.0
目的使用注解代替setContentView(),findViewById(),onClick()和onLongClick()的点击事件如图一、实现setContentView()1、先写个注解InjectLayout(1)@interface:注解的写法(声明)(2)@Target:目标(此注解作用在什么地方)一下是常用的几个ElementType.TYPE:类名之上ElementType.FIELD:属性字段之上(成员变量)ElementType.METHOD:方法之上ElementTy
gamma校正Gamma 校正问题:什么是Gamma曲线矫正?Gamma曲线矫正是什么意思? Gamma曲线是一种特殊的色调曲线,当Gamma值等于1的时候,曲线为与坐标轴成45°的直线,这个时候表示输入和输出密度相同。高于1的Gamma值将会造成输出亮化,低于1的Gamma值将会造成输出暗化。总之,我们的要求是输入和输出比率尽可能地接近于1。在显示器、扫描仪、_gamma校正
fread函数和fwrite函数详解 fread()头文件:#include<stdio.h>功能:是用于读取二进制数据原型:size_t _fread和fwrite时,缓冲区会发生什么
“十三五”会议强调“实施严格的知识产权保护制度,完善有利于激励创新的知识产权归属制度,建设知识产权运营交易和服务平台,建设知识产权强国。”国家知识产权局局长申长雨也表示,国家已经明确将知识产权的“十三五”规划纳入到国家“十三五”规划的重点专项策划之中,这是知识产权规划第一次进入到国家的重点专项规划。《国家知识产权战略纲要》,更把保护知识产权提升为国家战略。 一般认为的知识产权包括如下权利:专利..._高企知识产权审核
是否觉得只有几个按钮和几个View有点太单一呢,页面上怎么能只显示这么少的内容呢?没关系,ViewPager来帮忙。(听说已经过时,但还是看一下吧,总是相通的)这里是参考了《第一行代码》一书。 先上代码。MainActivity.javapackage com.example.viewpagertry;import android.app.Activity;import android.supp
文章内容解决方案本文提供有关如何对戴尔系统上的耳机/麦克风插孔问题进行故障排除的信息。耳机插入OptiPlex系统的前部音频插孔中后,系统上的后部音频插孔被禁用。根据设计,如果设备通过前部音频端口连接,系统上的后部音频端口将被禁用。这允许使用耳机收听私人音频,耳机断开后,后部插孔将启用。使用Latitude笔记本的耳机和麦克风插孔的组合音频插孔最常见的两种接头是2环(3导体)接头和3环(4导体)接..._precision 5820 tower x-series 没有麦克风么
原文链接:摘要方法实验效果讨论原文链接:https://arxiv.org/abs/1612.01064摘要提供一个三值网络的训练方法。对AlexNet在ImageNet的表现,相比32全精度的提升0.3%。方法对于每一层网络,三个值是32bit浮点的{−Wnl,0,Wpl}{−Wln,0,Wlp}\{-W^n_l, 0 , W^p_l\},..._三值量化神经网络
第一次用Mac,今天使用终端下开发包,以前用虚拟机时用的apt-get , yum,rpm竟然全都用不了。同样是linux系统,本白一脸懵逼查了下资料,发现Mac系统是使用brew命令install还是不行,继续往源头上找资料,原来Mac自带ruby命令,需要先通过ruby安装brew。安装brew/usr/bin/ruby -e "$(curl -fsSL https:/..._mac yum
虽然 cookie 是一把双刃剑,但正确地处理 cookie 可以避免许多采集问题。网站会用 cookie 跟踪你的访问过程,如果发现了爬虫异常行为就会中断你的访问,比如特别快速地填写表单,或者浏览大量页面。虽然这些行为可以通过关闭并重新连接或者改变 IP 地址来伪装,但是如果 cookie 暴露了你的身份,再多努力也是白费。在采集一些网站时 cookie 是不可或缺的。要在一个网站上持续保持登...
34.jpg用前说明:本文章仅对 Web 开发,Python 开发进行探讨,进行实验时请遵守学校的规章制度。任务自动化本来就是程序员的一大乐趣,无关价值观。废话很多人有误区,以为抢课脚本就是像游戏外挂一样,利用什么教务处系统漏洞去搞到课,而事实上抢课脚本只是模拟浏览器和服务器进行交互而已。而它们之间交互的方式是使用 HTTP 协议,换言之你的程序只要通过 HTTP 协议与服务器进行交互,就可以模拟..._抢课脚本