windows上安装gtest、gtest使用和了解实现内部的过程

刚回到实习公司,还没有下发任务,正好公司用的是Google的测试框架,学一学这个框架的使用

1.8版本的下载链接最好找一个有msvc下载,不然还要cmake搞一个sln出来,我用cmake没搞出来,就换了个思路搞。然后就可以编译release版本或者debug版本的库出来了。

使用上有点麻烦我出现了tr1爆出异常#define_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING 1,这样就可以解决tr1报出异常的错误。还遇到一个问题是线程库的问题,一般我也很少在Windows上写多线程程序,所以这个点也不知道,如下图所示,这个时候就是多线程库的版本有问题,gtest的源码我还没有看过,但是由此推断内部应该是开了其他线程的。如何解决呢?
在这里插入图片描述
在这里插入图片描述
解决线程库的问题如下图所示,
在这里插入图片描述
前两个是lib库,带d的是debug的lib,后面两个是dll库。
在这里插入图片描述

ASSERT_*意思是当这里面的TEST宏函数里面有问题直接退出这个函数不再执行了
EXCEPT_*是TEST宏函数发生了错误函数也照样执行,不直接退出函数。

别忘了在vs添加头文件的路径、lib库的路径!

#define _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING  1
#include <gtest/gtest.h>
#include <iostream>

using namespace std;
using namespace testing;

//wait for testing
int add(int a, int b) {
	return a + b;
}
//声明testCase组,测试testAdd函数
TEST(testCase, testAdd) {
	ASSERT_EQ("2", "2");
	EXPECT_EQ(add(1, 2), 7) << " msg";// <<如果测试不过,则输出对应信息
	cout << "hello world" << endl;
}
TEST(testCase, tt2) {
	ASSERT_STREQ("2", "6");
	EXPECT_EQ(add(3, 5), 8);
	cout << "hello world" << endl;
	
}
//同样在testCase组下,测试tt
TEST(testCase, tt) {
	ASSERT_STREQ("2", "6");
	cout << "hello world" << endl;
}
//主函数
int main(int argc, char **argv) {
	InitGoogleTest(&argc, argv);
	RUN_ALL_TESTS();
	return 0;
		
}


TEST_F函数,第一个参数要一个定义好的类,gtest内部会帮你创建这个对象的,先调用SetUpTestCase这个静态函数,这个是基类的静态函数,原则上不应该覆盖non-virtual函数的,但为了观察调用顺序还是覆盖了。SetUpTestCase只会被调用一次。SetUp是virtual函数,每一个TEST_F函数就会调用一次SetUp,结束后调用TearDown

#define _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING  1
#include <stdio.h>
#include <vector>
#include <iostream>
#include "gtest/gtest.h"

using std::vector;
using namespace std;

class TestFixture : public testing::Test
{
protected:
	static void SetUpTestCase()
	{
		printf("SetUpTestCase\n");
	}
	// static void TearDownTestCase() {}
	virtual void SetUp()override
	{
		v1_.push_back(1); 
		//v2_.emplace_back(1);
		printf("SetUp\n");
	}
	virtual void TearDown() override{
		v2_.emplace_back(1);
		cout << __func__ << endl;
	}

	vector<int> v1_;
	vector<int> v2_;
};

TEST_F(TestFixture, TestName1)
{
	EXPECT_EQ(1, v1_.size()) << "v1_.size() error";
}

TEST_F(TestFixture, TestName2)
{
	cout << this->v1_.size() << endl;
	EXPECT_EQ(0, v2_.size());
}

int main(int argc, char** argv)
{
	testing::InitGoogleTest(&argc, argv);
	return RUN_ALL_TESTS();
}

TEST是如何实现的?,类似这样的,会通过宏函数中的参数展开不同的class,进而区分不同的TEST,所以两个TEST不可以参数名字完全一样。如果两个参数名字完全一样就会报重复定义类的错误,MyTest中的##代表着拼接参数的名字,我试了试好像多少个#都可以的,不过后面的dxgzg是自定义的,一个#是不行的,要两个,所以以后我要遇到这类问题我会选择加两个#。

#define MyTest(test_case_name, test_name) \
  test_case_name##_##test_name##_dxgzg


#define TEST2(test_case_name,test_name) \
class MyTest(test_case_name, test_name) {\
	\
public:\
    MyTest(test_case_name, test_name)(){\
			cout << "hello world!" << endl;\
	}\
	void fun() {\
		cout << "hello world" << endl;\
	}\
};


int main(int argc, char** argv)
{	
	TEST2(test_case_name, test_name2);
	test_case_name_test_name2_dxgzg a;
	a.fun();
	/*testing::InitGoogleTest(&argc, argv);
	return RUN_ALL_TESTS();*/
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值