Google Test单元测试使用

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暂时没用到

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值