刚回到实习公司,还没有下发任务,正好公司用的是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();*/
}