2021-07-23

Gtest学习



[gtest推荐学习地址原博地址:](https://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html)
(我只是对博主的东西进行了搬迁,当作自己的笔记,尊重原博)

为什么使用Gtest?
  1. 使用gtest可以免去维护测试框架的麻烦,让我们有更多精力投入到案例设计上
  2. 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、运行即可
2021-07-23

小结:
2021-07-23


断言类型:

  1. 布尔值检查
    2021-07-23

  2. 数值数据类型检查
    2021-07-23

  3. 字符串检查
    2021-07-23
    STREQSTRNE同时支持char和wchar_t类型的,STRCASEEQSTRCASENE却只接收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());

}

结果:
2021-07-23
4. 显示返回成功或失败
2021-07-23

TEST(ExplicitTest, Demo)
{
    ADD_FAILURE() << "Sorry"; // None Fatal Asserton,继续往下执行。

    //FAIL(); // Fatal Assertion,不往下执行该案例。

    SUCCEED();
}
  1. 异常检查
    2021-07-23
    例如:
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*);
}
  1. Predicate Assertions
    使用EXPECT_TRUE或ASSERT_TRUE时,有时希望能够输出更加详细的信息,比如检查一个函数的返回值TRUE还是FALSE时,希望能够输出传入的参数是什么,以便失败后好跟踪
    2021-07-23
bool MutuallyPrime(int m, int n)
{
    return Foo(m , n) > 1;
}

TEST(PredicateAssertionTest, Demo)
{
    int m = 5, n = 6;
    EXPECT_PRED2(MutuallyPrime, m, n);
}

2021-07-23

  1. 浮点型检查
    2021-07-23
    对相近数进行比较:
    2021-07-23

  2. Windows HRESULT assertions
    2021-07-23

CComPtr shell;
ASSERT_HRESULT_SUCCEEDED(shell.CoCreateInstance(L"Shell.Application"));
CComVariant empty;
ASSERT_HRESULT_SUCCEEDED(shell->ShellExecute(CComBSTR(url), empty, empty, empty, empty));
  1. 类型检查
    类型检查失败时,直接导致代码编不过,难得用处就在这
template <typename T> class FooType {
public:
    void Bar() { testing::StaticAssertTypeEq<int, T>(); }
};

TEST(TypeAssertionTest, Demo)
{
    FooType<bool> fooType;
    fooType.Bar();
}```

上一篇:7-1 实验3_13_最大公约数和最小公倍数 (100 分)


下一篇:如何在复现问题时使用adb命令录制现象视频