Gtest学习
[gtest推荐学习地址原博地址:](https://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html)
(我只是对博主的东西进行了搬迁,当作自己的笔记,尊重原博)
为什么使用Gtest?
- 使用gtest可以免去维护测试框架的麻烦,让我们有更多精力投入到案例设计上
- gtest提高了非常完善的功能,并且简单易用,极大的提高了编写测试案例的效率
gtest的使用:
*1、先写一个需要被被测试的单元:函数,类等*
//求最大公约数函数
int Foo(int a, int b)
{
if (a == 0 || b == 0)
{
throw "don't do that";
}
int c = a % b;
if (c == 0)
return b;
return Foo(b, c);
}
2、设计测试用例:
#include <gtest/gtest.h>
TEST(FooTest, HandleNoneZeroInput)
{
EXPECT_EQ(2, Foo(4, 10));
EXPECT_EQ(6, Foo(30, 18));
}
我们使用了TEST这个宏,它有两个参数,官方的对这两个参数的解释为:[TestCaseName,TestName]
对检查点的检查,我们上面使用到了EXPECT_EQ这个宏,这个宏用来比较两个数字是否相等。
Google还包装了一系列EXPECT_* 和ASSERT_*的宏,每个EXPECT_都有一个对应的ASSERT_
两者的区是:
- EXPECT_* 失败时,案例继续往下执行
- ASSERT_* 失败时,直接在当前函数中返回,当前函数中ASSERT_*后面的语句将不会执行。
3、主函数定义
int _tmain(int argc, _TCHAR* argv[])
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
testing::InitGoogleTest(&argc, argv);” :gtest的测试案例允许接收一系列的命令行参数,因此,我们将命令行参数传递给gtest,进行一些初始化操作
“RUN_ALL_TESTS()” :运行所有测试案例
4、运行即可
小结:
断言类型:
-
布尔值检查
-
数值数据类型检查
-
字符串检查
STREQ和STRNE同时支持char和wchar_t类型的,STRCASEEQ和STRCASENE却只接收char*
测试:
TEST(StringCmpTest, Demo)
{
/*
char是8位字符类型,最多只能包含256种字符,许多外文字符集所含的字符数目超过256个,char型无法表示。
wchar_t数据类型一般为16位或32位,但不同的C或C++库有不同的规定,如GNU Libc规定wchar_t为32位,总之,
wchar_t所能表示的字符数远超char型。
*/
//char *str = “abcxcba”;只是声明了一个指针变量,该指针变量指向字符串“abcxcba”,
//但是“abcxcba”这个字符串,编译器没有去给他分配空间,于是就把他放进了常量区,而常量字符串是不允许被修改的,
//于是会报错上述的错误
char str1[] = "AbcdEf";
wchar_t str2[] = L"AbcdEf";
std::string str3 = "AbcdEf";
std::wstring str4 = L"AbcdEf";
//判断是否具有相同内容
//EXPECT_STREQ :the two C strings have the same content
EXPECT_STREQ("AbcdEf", str1);
EXPECT_STREQ(L"AbcdEf", str2);
//判断是否具有不同内容
//EXCEPT_STRNE : the two C strings have different content
EXPECT_STRNE("AbcdEf", str1);
EXPECT_STRNE(L"AbcdEf", str2);
//忽略大小写比较是否有相同内容
//EXPECT_STRCASEEQ : the two C strings have the same content, ignoring case
EXPECT_STRCASEEQ("AbcdEf", str1);
//EXPECT_STRCASEEQ(L"AbcdEf", str2); 不支持
//考虑大小写比较是否有相同内容
//EXPECT_STARCASENE : the two C strings have different content, ignoring case
//c_str() : 生成一个const char*指针,指向以空字符终止的数组。
EXPECT_STRCASENE("AbcdEf", str3.c_str());
EXPECT_STREQ(L"AbcdEf", str4.c_str());
}
结果:
4. 显示返回成功或失败
TEST(ExplicitTest, Demo)
{
ADD_FAILURE() << "Sorry"; // None Fatal Asserton,继续往下执行。
//FAIL(); // Fatal Assertion,不往下执行该案例。
SUCCEED();
}
- 异常检查
例如:
int Foo(int a, int b)
{
if (a == 0 || b == 0)
{
throw "don't do that";
}
int c = a % b;
if (c == 0)
return b;
return Foo(b, c);
}
TEST(FooTest, HandleZeroInput)
{
EXPECT_ANY_THROW(Foo(10, 0));
EXPECT_THROW(Foo(0, 5), char*);
}
- Predicate Assertions
使用EXPECT_TRUE或ASSERT_TRUE时,有时希望能够输出更加详细的信息,比如检查一个函数的返回值TRUE还是FALSE时,希望能够输出传入的参数是什么,以便失败后好跟踪
bool MutuallyPrime(int m, int n)
{
return Foo(m , n) > 1;
}
TEST(PredicateAssertionTest, Demo)
{
int m = 5, n = 6;
EXPECT_PRED2(MutuallyPrime, m, n);
}
-
浮点型检查
对相近数进行比较: -
Windows HRESULT assertions
CComPtr shell;
ASSERT_HRESULT_SUCCEEDED(shell.CoCreateInstance(L"Shell.Application"));
CComVariant empty;
ASSERT_HRESULT_SUCCEEDED(shell->ShellExecute(CComBSTR(url), empty, empty, empty, empty));
- 类型检查
类型检查失败时,直接导致代码编不过,难得用处就在这
template <typename T> class FooType {
public:
void Bar() { testing::StaticAssertTypeEq<int, T>(); }
};
TEST(TypeAssertionTest, Demo)
{
FooType<bool> fooType;
fooType.Bar();
}```