CppUnit使用指南_第1页
CppUnit使用指南_第2页
CppUnit使用指南_第3页
CppUnit使用指南_第4页
CppUnit使用指南_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、CppUnit使用指南CppUnit的原理在 CppUnit 中,一个或一组测试用例的测试对象被称为 Fixture(设施,下文为方便理解尽量使用英文名称)。Fixture 就是被测试的目标,可能是一个对象或者一组相关的对象,甚至一个函数。 有了被测试的 fixture,就可以对这个 fixture 的某个功能、某个可能出错的流程编写测试代码,这样对某个方面完整的测试被称为TestCase(测试用例)。通常写一个 TestCase 的步骤包括: 1. 对 fixture 进行初始化,及其他初始化操作,比如:生成一组被测试的对象,初始化值; 2. 按照要测试的某个功能或者某个

2、流程对 fixture 进行操作; 3. 验证结果是否正确; 4. 对 fixture 的及其他的资源释放等清理工作。对 fixture 的多个测试用例,通常(1)(4)部分代码都是相似的,CppUnit 在很多地方引入了 setUp 和 tearDown 虚函数。可以在 setUp 函数里完成(1)初始化代码,而在 tearDown 函数中完成(4)代码。具体测试用例函数中只需要完成(2)(3)部分代码即可,运行时 CppUnit 会自动为每个测试用例函数运行 setUp,之后运行 tearDown,这样测试用例之间就没有交叉影响。 撰写TestCase必须注意以下几点: 

3、6; 可以自动执行,不用人手操作Ø 自动返回测试结果Ø 绝对的独立,不能与其他TestCase有任何联系。就算测试同一个函数的不同功能也需要分开。每个TestCase可以说是一个孤岛对 fixture 的所有测试用例可以被封装在一个 CppUnit:TestFixture 的子类(命名惯例是ClassNameTest)中。然后定义这个fixture 的 setUp 和 tearDown 函数,为每个测试用例定义一个测试函数(命名惯例是 testXXX)。下面是个简单的例子: class MathTest : public CppUnit:TestFixture p

4、rotected: int m_value1, m_value2; public: MathTest() / 初始化函数 void setUp () m_value1 = 2; m_value2 = 3; / 测试加法的测试函数 void testAdd () / 步骤(2),对 fixture 进行操作 int result = m_value1 + m_value2; / 步骤(3),验证结果是否争取 CPPUNIT_ASSERT( result = 5 ); / 没有什么清理工作没有定义 tearDown.  在测试函数中对执行结果的验证成功或者失败直接反应这个测试用例的成功和

5、失败。CppUnit 提供了多种验证成功失败的方式:CPPUNIT_ASSERT(condition)/ 确信condition为真 CPPUNIT_ASSERT_MESSAGE(message, condition)/ 当condition为假时失败, 并打印message CPPUNIT_FAIL(message)/ 当前测试失败, 并打印message CPPUNIT_ASSERT_EQUAL(expected, actual)/ 确信两者相等 CPPUNIT_ASSERT_EQUAL_MESSAGE(message, expected, actual)/ 失败的同时打印message

6、CPPUNIT_ASSERT_DOUBLES_EQUAL(expected, actual, delta)/ 当expected和actual之间差大于delta时失败要把对 fixture 的一个测试函数转变成一个测试用例,需要生成一个 CppUnit:TestCaller 对象。而最终运行整个应用程序的测试代码的时候,可能需要同时运行对一个 fixture 的多个测试函数,甚至多个 fixture 的测试用例。CppUnit 中把这种同时运行的测试案例的集合称为 TestSuite。而 TestRunner 则运行测试用例或者 TestSuite,具体管理所有测试用例的生命周期。目前提供了

7、 3 类TestRunner,包括:Ø CppUnit:TextUi:TestRunner / 文本方式的TestRunnerØ CppUnit:QtUi:TestRunner/ QT方式的TestRunnerØ CppUnit:MfcUi:TestRunner/ MFC方式的TestRunner下面是一个TestRunner的例子:CppUnit:TextUi:TestRunner runner; CppUnit:TestSuite *suite= new CppUnit:TestSuite(); / 添加一个测试用例 suite->addTest(new

8、 CppUnit:TestCaller<MathTest> ("testAdd", testAdd); / 指定运行TestSuite runner.addTest( suite ); / 开始运行, 自动显示测试进度和测试结果 runner.run( "", true ); / Run all tests and wait常用使用方式按照上面的方式,如果要添加新的测试用例,需要把每个测试用例添加到 TestSuite 中,而且添加新的 TestFixture 需要把所有头文件添加到 main.cpp 中,比较麻烦。为此 CppUnit 提供

9、了 CppUnit:TestSuiteBuilder,CppUnit:TestFactoryRegistry 和一堆宏,用来方便地把 TestFixture 和测试用例注册到 TestSuite 中。下面就是通常的使用方式(注意红色字体):/ MathTest.h#include "cppunit/extensions/HelperMacros.h" class MathTest : public CppUnit:TestFixture / 声明一个TestSuite CPPUNIT_TEST_SUITE( MathTest ); / 添加测试用例到TestSuite, 定

10、义新的测试用例需要在这儿声明一下 CPPUNIT_TEST( testAdd ); / TestSuite声明完成 CPPUNIT_TEST_SUITE_END(); / 其余不变 protected: int m_value1, m_value2; public: MathTest() / 初始化函数 void setUp (); / 清理函数 void tearDown(); / 测试加法的测试函数 void testAdd (); / 可以添加新的测试函数 ; / MathTest.cpp / 把这个TestSuite注册到名字为"alltest"的TestSuite

11、中, 如果没有定义会自动定义 / 也可以CPPUNIT_TEST_SUITE_REGISTRATION( MathTest );注册到全局的一个未命名的TestSuite中. CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( MathTest, "alltest" ); / 下面不变 void MathTest:setUp() m_value1 = 2; m_value2 = 3; void MathTest:tearDown() void MathTest:testAdd() int result = m_value1 + m_value2;

12、CPPUNIT_ASSERT( result = 5 ); / main.cpp/ 不用再包含所有TestFixture子类的头文件 #include <cppunit/extensions/TestFactoryRegistry.h> #include <cppunit/ui/text/TestRunner.h> / 如果不更改TestSuite, 本文件后期不需要更改. int main() CppUnit:TextUi:TestRunner runner; / 从注册的TestSuite中获取特定的TestSuite, 没有参数获取未命名的TestSuite. C

13、ppUnit:TestFactoryRegistry &registry = CppUnit:TestFactoryRegistry:getRegistry("alltest"); /若没有注册名字,在MathTest.cpp文件中只是调用了CPPUNIT_TEST_SUITE_REGISTRATION( MathTest );那就可以写成 CppUnit:TestFactoryRegistry &registry = CppUnit:TestFactoryRegistry:getRegistry(); / 添加这个TestSuite到TestRunner中

14、 runner.addTest( registry.makeTest() ); / 运行测试 runner.run();  / mainanother.cpp另外的一种写法。其实和上面大同小异,只是生成的对象是Test而不是registry了。int main(int argc, char* argv) / Get the top level suite from the registry CppUnit:Test *suite = CppUnit:TestFactoryRegistry:getRegistry().makeTest(); / Adds the test to the

15、 list of test to run CppUnit:TextUi:TestRunner runner; runner.addTest( suite ); / Change the default outputter to a compiler error format outputter runner.setOutputter( new CppUnit:CompilerOutputter( &runner.result(),std:cerr ) ); / Run the tests. bool wasSucessful = runner.run(); / Return error

16、 code 1 if the one of test failed. return wasSucessful ? 0 : 1;  这样添加新的测试用例(TestFixture)只需要在类定义的开始声明一下即可。其他实际问题通常包含测试用例代码和被测试对象是在不同的项目中。应该在另一个项目(最好在不同的目录)中编写 TestFixture,然后把被测试的对象包含在测试项目中。对某个类或者某个函数进行测试的时候,这个 TestFixture 可能引用了别的类或者别的函数,为了隔离其他部分代码的影响,应该在源文件中临时定义一些桩程序,模拟这些类或者函数。这些代码可以通过宏定义在测试项目中有

17、效,而在被测试的项目中无效。CppUnit的组成结构2 核心部分(Core)2.1 基本测试类2.1.1 Test2.1.2 TestFixture2.1.3 TestCase2.1.4 TestSuite2.2 测试结果记录2.2.1 SynchronizedObject2.2.2 TestListener2.2.3 TestResult2.3 错误处理2.3.1 TestFailure2.3.2 SourceLine2.3.3 Exception 2.3.4 NotEqualException 2.4 断言 2.4.1 Asserter 2.4.2 TestAssert 3 输出部分(Ou

18、tput) 3.1 基础部件 3.1.1 Outputter 3.1.2 TestResultCollector 3.2 衍生类 3.2.1 TextOutputter 3.2.2 CompilerOutputter 3.2.3 XmlOutputter 4 辅助部分(Helper) 4.1 创建机制 4.1.1 TypeInfoHelper 4.1.2 TestFactory 4.1.3 TestFactoryRegistry,NamedRegistries 4.1.4 TestSuiteFactory 4.1.5 TestSuiteBuilder 4.1.6 TestCaller 4.1.7

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论