都是一淘的文章不错,
利用cppunit做模块测试最近在K2的测试项目中做了一些利用cppunit做接口测试的工作,总结了一篇使用简介,里面有实际测试用例的svn地址,希望对有兴趣的同学有所帮助。 一:下载: 版本:最新版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 <stdlib.h> #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 <cppunit/extensions/TestFactoryRegistry.h> #include <cppunit/ui/text/TestRunner.h> // 如果不更改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接口;
- 以上情形中,被测函数参数个数、类型不发生变化或者变化不频繁;
- 测试过程中,使用了开发包装过的工具去测试的,也可以考虑下是否可行;
- 待补充。
六:对开发的要求 模块测试的提测标准: - 需要有被测功能的头文件;
- 需要一份简单的文档,说明该功能怎么调用,以及对传入的参数有什么样的要求(比如广告的featureWordHash要事先排序等这类问题);
|