GoogleTest的断言是一种类似于函数调用的断言机制。我们可以在GoogleTest本身的断言消息后面定义自己的测试失败信息。下面说明几种不同断言方式:
为了提供自定义的失败信息,可以使用C++的stream流操作把字符输入到断言中,借助于<<操作符号。
ASSERT_EQ(x.size(), y.size()) << "Vectors x and y are of unequal length";
for (int i = 0; i < x.size(); ++i) {
EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i;
}
注意,任何可以写入流ostream的,都可被写入断言宏,比如C的字符串、string对象,甚至可以是广义上的字符(流):Windows的Unicode下的wchar_t*、 TCHAR*或者C++的std::string。所有流的输入都会转化成UTF-8的格式。
如果上述的一个测试失败,那么会打印出val1和val2的值。
Value参数必须与断言比较运算符兼容,否则有编译错误。这些断言机制可以使用用户自定义的结构,但是必须进行运算符重载 。如果使用了自定义结构,我们最好使用ASSERT_*(),这样不仅会输出比较结果,而且会输出操作数。
ASSERT_EQ()会进行指针比较, 如果使用C风格字符串,那么比较的是地址!!(也可以是值,下面的eg就可以说明)
如果要比较值的话,使用ASSERT_STREQ(), 如果判断C字符串是否是NULL,使用ASSERT_STREQ(NULL, c_string)。 如果比较string,那么使用ASSERT_EQ。
在这里,比较的是C风格的字符串,如果想要比较string对象,请使用EXPECT_EQ、 EXPECT_NE等,而不是下面的。
在github网站下载gtest框架https://github.com/google/googletest
解压后,目录下有以下内容:
进入googltest目录,现在我们需要将其编译成.o文件
编译生成gtest.o文件:
g++ -std=c++11 -o gtest.o -I./include -I./ -c ./src/gtest-all.cc
注:我的g++需要指定c++11,不需要指定的就不需要
再生成.a静态库文件:
ar -rv libgtest.a gtest.o
生成的libgtest.a以及该目录include下的头文件都是我们后面测试需要的。
(1)新建项目目录,比如我创建了一个LeetcodeWithC-master目录
(2)在该目录下创建以下四个目录
├── gtest //存放gtest框架内容
├── leetcode //存放项目源代码
├── testcase //存放测试用例代码
├── gmock//存放googletest的很多头文件
(3)gtest目录中放置:刚才生成的libgtest.a静态库文件,以及\googletest\include\gtest中的文件。另外,我们还需要一个main函数文件。放在getst的main下
#include "gtest/gtest.h"
#include
using namespace std;
int main(int argc,char* argv[])
{
//testing::GTEST_FLAG(output) = "xml:"; //若要生成xml结果文件
testing::InitGoogleTest(&argc,argv); //初始化
if( RUN_ALL_TESTS()) //跑单元测试
return 0;
}
该gtest的目录结构和内容如下所示:
(4)leetcode目录下新建src目录和include目录,分别用于存放头文件和.c文件
在include下放了两个头文件,common.h 和leetcode_functions.h
内容分别如下:
common.h
#pragma once
#include
#include
#include
#include
leetcode_functions.h
#pragma once
//leetcode_functions.h
#ifndef _LEETCODE_FUNCTIONS_H
#define _LEETCODE_FUNCTIONS_H
#include"common.h"
/*001,two sum*/
int* twoSum(int* nums, int numsSize, int target);
/**************************************************************
题目:
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
释义:
给定整型数组,返回两个数的下标,使得这两个数相加得到特定的值。
假设每个给定的数组只能找到一组满足条件的结果,同时,不能使用同一个数两次。
分析:
题大意为,在一组数组中,找到两个数,使得这两个数的和等于特定值,并返回下标。可以从第一个数开始,循环与后面的每一个相加,与结果比较,比较成功则返回。
例如,输入[1,7,11,15],目标值26,那么循环计算1+7,1+11,1+15,7+11,7+15......,直到得到目标值。
***************************************************************/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
#include "leetcode_functions.h"
int* twoSum(int* nums, int numsSize, int target) {
int loop = 0;
int inloop = 0;
int* result = NULL;
result =(int*) malloc(2*sizeof(int));
memset(result,0,2*sizeof(int));
printf("numsSize=%d\n",numsSize);
if(NULL == nums || numsSize==0)
{
return result;
}
for(loop = 0;loop < numsSize;loop++)
{
for(inloop = loop+1;inloop
整体目录如下:
(5) testcase下新建include和src目录
src目录下有测试用例文件leetcode_test.cpp
#include "googletest.h"
#include "leetcode_functions.h"
#include "leetcode_utils.h"
TEST(two_sum_test,twoSum001)
{
int nums[4]={2,7,11,15};
int target = 9;
int numsSize = 4;
int* result = twoSum(nums,numsSize,target);
ASSERT_EQ(0,*result);
ASSERT_EQ(1,*(result+1));
target = 17;
result = twoSum(nums,numsSize,target);
ASSERT_EQ(0,*result);
ASSERT_EQ(3,*(result+1));
result= twoSum(NULL,numsSize,target);
ASSERT_EQ(0,*result);
}
include目录下的文件有
googletest.h头文件
#pragma once
#include"gmock/gmock.h"
#include"gtest/gtest.h"
leetcode_utils.h头文件
#pragma once
#include"leetcode_functions.h"
typedef enum leetcode_return
{
FALSE =0,
TRUE =1
}leetcode_return;
leetcode_return leet_judge_two_numbers_result(struct ListNode * result,int* retArr,int num);
整体目录如下:
(6)gmock目录:将googletest中的\googlemock\include\gmock里面的文件拷贝到这里即可
测试之前,需要编译并链接我们得项目代码和测试框架。
编译
g++ -o 001_two_sum.o -c ./leetcode/src/001_Two_Sum.c -I ./leetcode/include/
g++ -o leetcode_test.o -c ./testcase/src/001_Two_Sum_test.cpp -I ./testcase/include/ -I ./leetcode/include/ -I ./
g++ -o TestAll.o -c ./gtest/main/TestAll.cpp -I ./
链接:
g++ -o main *.o -I./include -L./gtest -lgtest -lpthread
运行生成的可执行文件main
./main
主要有:googletest原始测试框架、以及其他bloger所作的多个测试,以及我的简化版本。
https://download.csdn.net/download/u011436427/11541109