Google开源了很多实用的模块,比如google-gtest/google-gmock/google-glog/google-gflags/google-ctemplate/google-sparsehash/Protobuf/Perftools,Gtest是C++的测试模块,提供丰富的测试方法
软件单元测试常用的有CppUnit, C++Test,提供白盒功能的测试,Gtest同样是提供单元测试,诺西开源的Robot Framework测试,只是用来测Configuration,运用在版本提交到测试部之前,每次RD人员提交到Robot的时候,可以采用Gtest来做自身完整测试,不仅测试配置,而且测试业务看收发包是否正常,下图是一个ECI的测试简图
1、 Gtest编译
在http://code.google.com/p/googletest/下载gtest-1.6.0,用VC8打开gtest\msvc下工程
单线程调试工程gtest.sln和多线程调试工程gtest-md.sln,不同工程生成的lib也不同,路径分别为gtest\msvc\gtest\Debug\gtestd.lib, gtest\msvc\gtest-md\Debug\gtestd.lib
debug和release不同编译方式下,生成debug版本的gtest静态库(gtestd.lib)和release版本的gtest静态库(gtest.lib).
2、 写Gtest测试用例
在VC8中新建Win32 ConsoleApplication,接着设置HEADER,LIB路径,Runtime Library模式(d:\vc\main d:\vc\gtest)
Header路径:
LIB路径:
Runtime Library模式: 如果Release版本,设为/MT,如果debug版本,设为/MTD
含有下面几个测试用例
3、 测试用例:TestSimple
这种用例最简单,就是函数的测试,下面测试函数入参(4,10),(30,18),返回值为2和6
#include <gtest/gtest.h>
int Foop(inta, int b) {
if (a==0 ||b==0) {
throw"don't do that";
}
int c=a%b;
if(c==0) {
returnb;
}
returnFoop(b,c);
}
TEST(FoopTest,HandleNoneZeroInput)
{
EXPECT_EQ(2, Foop(4, 10));
EXPECT_EQ(6, Foop(30, 18));
}
int main(intargc, char* argv[])
{
testing::InitGoogleTest(&argc, argv);
returnRUN_ALL_TESTS();
}
4、 测试用例:TestGlobal
类似于初始化函数,下面例子是初始化corba,只在整个测试过程中运行一次。
class CorbaEnvironment: public testing::Environment
{
public:
virtual void SetUp()
{
std::cout << " CorbaEnvironment SetUP" << std::endl;
corba_init("127.0.0.1","7777");
}
virtual void TearDown()
{
std::cout << " CorbaEnvironment TearDown" << std::endl;
}
};
int main(intargc, char* argv[])
{
testing::AddGlobalTestEnvironment(newCorbaEnvironment);
testing::InitGoogleTest(&argc, argv);
returnRUN_ALL_TESTS();
}
5、 测试用例:TestSuite
这种用例是TestSuite方式,比如QinQ业务的EPL,EVPL-UNI2UNI,EVPL-UNI2NNI,EVLAN等等,每种业务就理解为一个Class,同一种业务发的不同测试报文为一个FUNCTION
1.SetUpTestCase() 方法在当前类第一个Case之前执行
2.TearDownTestCase() 方法在当前类最后一个Case之后执行
/* Simulate NMS, Configurate differnet VPN*/
class EPL_ety2ety : public testing::Test
{
protected:
static void SetUpTestCase()
{
/*create EPL */
}
static void TearDownTestCase()
{
/*delete EPL */
}
};
/* Simulate IXIA, send different pkts */
TEST_F(EPL_ety2ety,ety_untagPkts)
{
/*send untag packets */
}
TEST_F(EPL_ety2ety,ety_pritagPkts)
{
/*send pritag packets */
}
TEST_F(EPL_ety2ety,ety_tagPkts)
{
/*send tag packets */
}
int main(intargc, char* argv[])
{
testing::AddGlobalTestEnvironment(new CorbaEnvironment);
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
6、 测试用例:TestCase
和TestSuite不同的是,TestCase对当前类所有case都运行,下面例子是用来处理MPLS_ety2mplsnni,每个测试Case都有动作
1. SetUp()方法在当前类每个Case之前执行
2. TearDown()方法在当前类每个Case之后执行
class MPLS_ety2mplsnni : publictesting::Test
{
protected:
virtual void SetUp()
{
/* */
}
virtual void TearDown()
{
/* */
}
};
TEST_F(MPLS_ety2mplsnni, ety_untagPkts)
{
/*send untag packets */
}
int main(intargc, char* argv[])
{
testing::AddGlobalTestEnvironment(new CorbaEnvironment);
testing::InitGoogleTest(&argc, argv);
returnRUN_ALL_TESTS();
}
7、 测试用例:参数化
按照前面测试方法TestSimple,Foop需要复制很多个,利用参数化之后,就定义取值范围即可,ECI暂时没用到