asdasdwdsd
1 .TEST(案例的名字,案例的描述)
{
EXCEPCT_EQ(1,func());
ASSERT_EQ(2,func2());
EXCEPCT_EQ(3,func3());
}
a.func为你要测试的函数
b.excepct_eq : 与你预期值相等,则通过测试,反之报错,但会接着往下执行
可以执行到assert_eq
c. assert_eq:若与预期值不符,则停止测试,不会允许到 func3
类似的宏定义
ASSERT_EQ(val1,val2); EXPECT_EQ(val1,val2); :判断两值是否相等,函数位置任意
ASSERT_NE(val1,val2); EXPECT_NE(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
注意:assert_*与expect_* 的区别在于 assert执行失败,则此包含整个assert的testsuit测试结束
expect执行失败,但会接着执行testsuit中的剩余部分
2. 参数化
第一步:.添加类,继承public::testing::TestWithParam<T>
class IsPrimeParamTest : public::testing::TestWithParam<int>
{
};
第二步:获取参数,并测试
TEST_P(案例名字,描述)
{
int n = GetPara(); //传入的参数赋值
EXPECT_TRUE(测试函数);
}
第三步 告诉要传入的参数
INSTANTIATE_TEST_CASE_P(描述,案例名字(注意与第二部的名字一致才能正确传入),testing :: Value(3,5,11,23))
testing :: Value() 这里为传入的参数,
这里的Value可替换为Range(begin,end,step)
testing::Value(3,5,7,9) == test::Range(3,10,2).
还可以替换为 ValuesIn(),用于传入数组或者容器
int a[3]={1,2,3};
Testing::ValuesIn(a)
还有bool()用来判断false/true
以上完成相同用例,完成多次测试
------------------------------------------------事件 CASE------------------------------------------------------------------
gtest事件
1 setup及teardown
class CaseTestSmpl : public testing ::Test{proctected:virtual void SetUp() {存放测试前需要初始化的事情(初始化函数,指针,申请的内存等)}virtual void TearDown() {存放测试后需要销毁的部分(回收函数,指针,申请的内存等)}int a ;// 生命周期在仅在一个suite中
}TEST_F(SUITE_TEST_SIMPLE,test1)
{
}TEST_F(SUITE_TEST_SIMPLE,test2)
{
}TEST_F(SUITE_TEST_SIMPLE,test3)
{
}
这里test1 ,2 3 在各自的suit中 会在最开始调用setup中的内容,测试结束后调用teardown中的内容
-----------------------------------------------事件 suite---------------------------------------------------------------------
testsuite 事件:在某一批案件中,第一个执行setup中的内容,最后一个suit执行teardown中的内容
//适用:多个测试函数,使用相同的变量,
class CaseTestSmpl : public testing ::Test{proctected:static void SetUpTestCase() {初始化全局变量等,生存周期为整个测试suite,直到所有suite执行完毕,由teardown进行回收}static void TearDownTestCase() {存放测试后需要销毁的部分}static int a ; //真个测试中是唯一的
}
----------------------------------------------事件 gloable------------------------------------------------------------------
全局事件:所有用例执行前后,可用于组合类行为测试
class CaseTestSmpl : public testing ::Enviroment{proctected:virtual void SetUp() {存放测试前需要初始化的事情(初始化函数,指针,申请的内存等)}virtual void TearDown() {存放测试后需要销毁的部分(回收函数,指针,申请的内存等)}int a //全局有效}int _tmain(int argc,char* argv[])
{//注册全局事件 GlobalTestSmpltesting::AddGloableTestEnvironment(new GlobalTestSmpl);testing::InitGobalTest(&argc,argv);return RUN_ALL_TESTS(); }
总结: 通过setup teardown 内部调用时机 以及不同事件的成员变量的生命周期来进行事件选择
--------------------------------------------------细节处理-------------------------------------------------------------------
实际使用问题:
1.当有时候没有打印错误信息时, 用输出流打印例如
TEST(ArraContent,Compara) {int a[]={1,2,3,4,5,6};int b[]={1,2,3,4,6,5};for (int i = 0;i < 6;i++){EXPECT_EQ(a[i],b[i]) <<"需要打印的信息"<< i;}
};
2 .使用cmake工程编译
全局CMakeLists.txt文件内容
cmake_minimum_required(VERSION 3.5)project(demo)set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)include_directories(src) //src 为源码存放目录enable_testing()# 编译googletest
add_subdirectory(googletest)# 把待测源码编译成一个静态库
add_library(mycode STATIC src/test.cpp src/test.h) # 编译测试用例
add_subdirectory(test)
测试目录下的CMakeLists.txt内容如下
cmake_minimum_required(VERSION 3.5)set(This ExampleTest)set (SourcesExampleTest.cpp
)add_executable(${This} ${Sources})# 链接gtest库和自己编写的库
target_link_libraries(${This} PUBLICgtest_mainmycode
)add_test(NAME ${This}COMMAND ${This}
)