如何使用cppunit做模块测试

发表于:2012-12-03来源:一淘测试作者:若凌点击数: 标签:cppunit
如何使用cppunit做模块测试.最近在K2的测试项目中做了一些利用cppunit做接口测试的工作,总结了一篇使用简介,里面有实际测试用例的svn地址,希望对有兴趣的同学有所帮助。

  最近在K2的测试项目中做了一些利用cppunit做接口测试的工作,总结了一篇使用简介,里面有实际测试用例的svn地址,希望对有兴趣的同学有所帮助。

  一:下载

  地址:http://sourceforge.net/projects/cppunit/files/cppunit/

  版本:最新版1.12.1

  二:编译配置

  解压后进入cppunit-1.12.1目录执行以下操作:

  ./configure

  make

  make check

  make install(sudo make install):自动将生成的.a和.so文件安装到usr/local/lib 目录。

  手动将cppunit-1.12.1/include/下的cppunit目录,拷贝到/usr/local/include目录下。

  三:如何写testcase

  概念理解

  Testcase:一次测试,一般可以看做一次输入,对应一次确定的输出;

  TestSuite:多个TestCase可以嵌套在一个TestSuite中,多个TestSuite又可以嵌套在更上层的TestSuite中;

  一个简单的测试实现

  被测功能(只提供了加法功能的算数类):

  ///Math.h

  // a class will be tested

  class Math

  {

  public:

  Math(){}

  ~Math(){}

  int add(int,int);

  };

  算数类的实现:

  ///Math.cpp

  //implement of Math.h

  #include

  #include “Math.h”

  int Math::add(int x,int y)

  {

  return x+y;

  }

  -----------------------------------------------华丽的分割线-----------------------------------------------------------------

  为了测试Math类的测试类:

  /// MathTest.h

  // A TestFixture subclass.

  #include “cppunit/TestFixture.h”

  #include “cppunit/extensions/HelperMacros.h”

  class MathTest : public CppUnit::TestFixture

  {

  CPPUNIT_TEST_SUITE(MathTest); //声明一个TestSuite

  CPPUNIT_TEST(testAdd); //添加TestCase到TestSuite

  /*定义新的测试用例需要在这儿声明一下

  // … 可以添加更多testcase

  */

  CPPUNIT_TEST_SUITE_END();// TestSuite声明完成

  public:

  MathTest(){}

  ~MathTest(){}

  void eard(){};//初始化函数,此例没有用到

  void eardown(){};//清理函数,此例没有用到

  void testAdd ();// 测试加法的测试函数

  /*可以添加更多测试函数

  // …

  */

  };

  测试类MathTest的实现:

  /// MathTest.cpp

  // implement of MathTest.h

  #include "MathTest.h"

  #include "Math.h"

  #include "cppunit/TestAssert.h"

  //把这个TestSuite注册到名字为"alltest"的TestSuite中

  CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( MathTest, "alltest" );

  //实现测试,测试中的核心部分

  void MathTest::testAdd()

  {

  Math M;//实例化

  int ret = M.add(-1,3); //调用add方法对其进行测试;

  CPPUNIT_ASSERT(ret==2); //用cppunit提供的方法对ret与预期结果作比较

  }

  Main函数:

  #include

  #include

  // 如果不更改TestSuite, 本文件后期不需要更改.

  int main()

  {

  CppUnit::TextUi::TestRunner runner;

  //从注册的TestSuite中获取特定的TestSuite

  CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry("alltest");

  //添加这个TestSuite到TestRunner中

  runner.addTest( registry.makeTest() );

  // 运行测试

  runner.run();

  }

  编译:

  g++ Math.cpp MathTest.cpp main.cpp -lcppunit -ldl -lm -lpthread -o mathTest

  运行:

  export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH

  ./mathTest

  显示:

  通过的情况:OK (1 tests)

  失败的情况:会显示那个测试类中的哪行测试不通过

  !!!FAILURES!!!

  Test Results:

  Run: 1 Failures: 1 Errors: 0

  1) test: MathTest::testAdd (F) line: 15 MathTest.cpp

  assertion failed

  - Expression: ret==4

  四:实际应用

  之前组内讨论时,有些模块考虑到开发测试代码时间,以及新人上手慢的问题,我觉得也有道理,后面有时间会继续完善测试过程,总结下什么样的模块适合做单元测试,以及怎么减少这种代价和风险。

  五:什么样的模块适合做类单元测试

  不能单独运行的模块,必须依赖上级模块的输出结果等情形;

  提供给别的模块做调用的,提供头文件,.so动态库或者.a静态库;

  Api测试,基础组件(kfc、mmdb)的api接口;

  以上情形中,被测函数参数个数、类型不发生变化或者变化不频繁;

  测试过程中,使用了开发包装过的工具去测试的,也可以考虑下是否可行;

  待补充。

原文转自:http://www.ltesting.net