网站设计风格分析市场调研报告包括哪些内容
文章目录
- 1:介绍
- 1.1、什么是gtest
- 1.2、断言
- 2、gtest的简单使用
- 3、gtest系列之事件机制
- 4、gtest系列之死亡测试
1:介绍
1.1、什么是gtest
gtest是一个跨平台的(Liunx、Mac OS X、Windows、Cygwin、Windows CE and Symbian)C++单元测试框架,由google公司发布。gtest是为在不同平台上为编写C++测试而生成的。它提供了丰富的断言、致命和非致命判断、参数化、”死亡测试”等等。
1.2、断言
一般的,要测试一个方法(函数)是否是正常执行的,可以提供一些输入数据,在调用这个方法(函数)后,得到输出数据,然后检查输出的数据是否与我们期望的结果是一致的,若一致,则说明这个方法的逻辑是正确的,否则,就有问题。 在对输出结果进行检查(check)时,Gtest为我们提供了一系列的断言(assertion)来进行代码测试,这些宏有点类似于函数调用。当断言失败时Gtest将会打印出assertion时的源文件和出错行的位置,以及附加的失败信息。这些输出的附加信息用户可以直接通过“<<”在这些断言宏后面。
Gtest中,断言的宏可以理解为分为两类,一类是ASSERT系列,一类是EXPECT系列。
ASSERT_* 系列的断言(Fatal assertion),当检查点失败时,退出当前函数(注意:并非退出当前案例)。
bool值检查
1>、 ASSERT_TRUE(参数),期待结果是true
2>、ASSERT_FALSE(参数),期待结果是false
数值型数据检查
3>、ASSERT_EQ(expected, actual),传入的是需要比较的两个数 equal
4>、ASSERT_NE(参数1,参数2),not equal,不等于才返回true
5>、ASSERT_LT(参数1,参数2),less than,小于才返回true
6>、ASSERT_GT(参数1,参数2),greater than,大于才返回true
7>、ASSERT_LE(参数1,参数2),less equal,小于等于才返回true
8>、ASSERT_GE(参数1,参数2),greater equal,大于等于才返回true
字符串检查
9>、ASSERT_STREQ(expected_str, actual_str),两个C风格的字符串相等才正确返回
10>、ASSERT_STRNE(str1, str2),两个C风格的字符串不相等时才正确返回
11>、ASSERT_STRCASEEQ(expected_str, actual_str)
12>、ASSERT_STRCASENE(str1, str2)
浮点型数据检查
ASSERT_FLOAT_EQ(expected, actual);
ASSERT_DOUBLE_EQ(expected, actual);
异常检查
ASSERT_THROW(statement, exception_type);语句引发给定类型的异常
ASSERT_ANY_THROW(statement);语句引发任何类型的异常
ASSERT_NO_THROW(statement);语句不会引发任何异常
EXPECT_* 系列的断言(Nonfatal assertion),当检查点失败时,继续执行下一个检查点(每一个断言表示一个测试点)。
EXPECT_系列,也是具有与ASSERT_* 系列类似的宏结构
通常情况应该首选使用EXPECT_,因为ASSERT_*在报告完错误后不会进行清理工作,有可能导致内存泄露问题。
2、gtest的简单使用
引入gtest头文件,#include <gtest/gtest.h>
采用宏来进行测试
TEST(test_case_name,test_name)
理解:将一组有关联的测试用例放在了一组测试里面
test_case_name: 针对谁的测试,这里是HuffmanTree的创建
test_name:针对某一个部分的测试,例如:针对创建节点的测试等
#include<iostream>
using namespace std;
#include<gtest/gtest.h>int Abs(int x)
{return x > 0 ? x : -x;
}int add(int a, int b)
{return a + b;
}TEST(IsAbsTest, HandlerTrueReturn)
{//ASSERT_TRUE期待结果是true,operator<<输出一些自定义的信息ASSERT_TRUE(Abs(1) == 1) << "Abs(1)=1"; ASSERT_TRUE(Abs(-1) == 1) << "Abs(-1)=1";ASSERT_FALSE(Abs(-2) == -2); //期待结果是falseASSERT_EQ(Abs(1), Abs(-1));ASSERT_NE(Abs(-1), 0);ASSERT_LT(Abs(-1), 2);ASSERT_GT(Abs(-1), 0);ASSERT_LE(Abs(-1), 2);ASSERT_GE(Abs(-1), 0);
}
TEST(AddTest, HandlerTrueReturn)
{//EXPECT_TRUE期待结果是4,operator<<输出一些自定义的信息EXPECT_TRUE(add(1, 3) == 5) << "1+3=4"; EXPECT_EQ(add(1, 9), 10);EXPECT_NE(add(1, 4), 6);EXPECT_LT(add(1, 3), 5);EXPECT_GT(add(1, 3), 2);EXPECT_LE(add(1, 3), 4);EXPECT_GE(add(1, 3), 3);
}int main(int argc, char** argv)
{testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}
上述中期望1+3=5,这显然错了,因此测试不会通过。
3、gtest系列之事件机制
“事件” 本质是框架给你提供了一个机会, 让你能在这样的几个机会来执行你自己定制的代码, 来给测试用例准备/清理数据。gtest提供了多种事件机制,总结一下gtest的事件一共有三种:
1、TestSuite事件
需要写一个类,继承testing::Test,然后实现两个静态方法:SetUpTestCase方法在第一个TestCase之前执行;TearDownTestCase方法在最后一个TestCase之后执行。
class FooTest : public testing::Test {
protected:static void SetUpTestCase() {cout << "TestSuite event1 : start" << endl;}static void TearDownTestCase() {cout << "TestSuite event1 : end" << endl;}static int* shared_resource_;
};
int add(int a, int b)
{return a + b;
}TEST_F(FooTest, Test1)
{EXPECT_EQ(add(2, 5), 7);
}TEST_F(FooTest, Test2)
{EXPECT_STREQ("sdgsg", "sdgsg");
}
int main(int argc, char** argv)
{testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();return 0;
}
2、TestCase事件
是挂在每个案例执行前后的,需要实现的是SetUp方法和TearDown方法。SetUp方法在每个TestCase之前执行;TearDown方法在每个TestCase之后执行。
由于gtest是用c++编写,所以刚开始要调用类初始化,初始化接收用户命令行传入参数;RUN_ALL_TESTS();函数会自动运行我们做的测试用例集,system(“PAUSE”);函数会让命令行窗口停留,以便观察具体的测试结果。
#include <stdio.h>
#include <vector>
#include <iostream>
#include "gtest/gtest.h"
using namespace std;
class TestFixture : public testing::Test
{
public:virtual void SetUp(){v1_.push_back(1);//v2_.emplace_back(1);printf("SetUp\n");}virtual void TearDown() {v2_.emplace_back(1);cout << __func__ << endl;}vector<int> v1_;vector<int> v2_;
};TEST_F(TestFixture, TestName1)
{EXPECT_EQ(2, v1_.size()) << "v1_.size()number 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();
}
上述中因为v1容器只插入了一个,而EXPECT_EQ(2,1),当然会出错,operator<<输出一些自定义的信息(例如测试失败时打印的可能错误信息)。
3、全局事件
要实现全局事件,必须写一个类,继承testing::Environment类,实现里面的SetUp和TearDown方法。SetUp方法在所有案例执行前执行;TearDown方法在所有案例执行后执行。
例如全局事件可以按照下列方式来使用:
除了要继承testing::Environment类,还要定义一个该全局环境的一个对象并将该对象添加到全局环境测试中去。
#include <gtest/gtest.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;class CGlobalEnvironment :public testing::Environment
{
public:virtual void SetUp(){//TODO: Do something before every case}virtual void TearDown(){//TODO: Do something after every case}
};
/* 测试用例集的名字 当前测试用例的名字 */
TEST(demoTestCase, demoTest)
{int a = 0;for (a = 0; a < 100; a++){EXPECT_LT(a, 500);}
}//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, 6), 7) << " msg";// <<如果测试不过,则输出对应信息cout << "hello world" << endl;
}
TEST(testCase, tt2) {ASSERT_STREQ("2", "2");EXPECT_EQ(add(3, 5), 8);cout << "hello world" << endl;}
//同样在testCase组下,测试tt
TEST(testCase, tt) {ASSERT_STREQ("2", "2");cout << "hello world" << endl;
}
int main(int argc, char** argv)
{testing::InitGoogleTest(&argc, argv);testing::AddGlobalTestEnvironment(new CGlobalEnvironment());testing::FLAGS_gtest_filter = "*";RUN_ALL_TESTS();system("PAUSE"); //命令行停在当前窗口return 0;
}
4、gtest系列之死亡测试
这里的”死亡”指的是程序的奔溃。通常在测试的过程中,我们需要考虑各种各样的输入,有的输入可能直接导致程序奔溃,这个时候我们就要检查程序是否按照预期的方式挂掉,这也就是所谓的”死亡测试”。
1>、ASSERT_DEATH(参数1,参数2),程序挂了并且错误信息和参数2匹配,此时认为测试通过。如果参数2为空字符串,则只需要看程序挂没挂即可。
2>、ASSERT_EXIT(参数1,参数2,参数3),语句停止并且错误信息和被提前给的信息匹配。
#include<iostream>
using namespace std;
#include<gtest/gtest.h>
void Foo()
{int* pInt = 0;*pInt = 42;
}TEST(FooDeathTest, Demo)
{EXPECT_DEATH(Foo(), "");
}
int main(int argc, char** argv)
{testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();return 0;
}
测试Foo函数是否能够正常运行。
注意事项
- 不要在死亡测试里释放内存。
- 在父进程里再次释放内存。
- 不要在程序中使用内存堆检查。