`
bollaxu
  • 浏览: 219496 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

CppUnit学习

 
阅读更多

 

CppUnit定义了几个基础类以及几个继承它们的子类。

基础类主要是定义了一些virtual函数,规定一些行为;用户主要继承使用如TestCase这样的类来完成测试用例。

 

TestFixture

定义了setUp()和tearDown()两个virtual函数,用来给测试中用到的对象实例做初始化和清理。

 

Test/TestLeaf(单个test)/TestComposite(多个test)

定义了一系列的接口,规定了测试的类型,继承给TestCase和TestSuite等类

 

TestCase

单个test的类,继承了TestLeaf和TestFixture。一般使用者都写继承它的子类做测试,在setUp()函数里面初始化要使用的对象实例,在tearDown()函数进行销毁。

 

TestSuite

多个test的类,继承了TestComposite。一般会在TestCase/TestFixture的子类里面定义一个Test *suite()的函数,里面添加了多个TestCase/TestFixture的测试方法。

 

TestRunner

运行测试并收集测试结果的类。可以添加Test类型的实例(包括TestCase/TestSuite)


例子1,添加单个TestCase
#include <cppunit/TestCase.h>
#include <cppunit/TextTestRunner.h>
#include <cppunit/TestResult.h>
#include <iostream>

using namespace std;

class MyTest: public CppUnit::TestCase
{
    public:
	MyTest(string name): CppUnit::TestCase(name){}

	void runTest()
	{
	    CPPUNIT_ASSERT( 1 == 2 );
	    cout << "runTest()" << endl;
	}

};

int main()
{
    MyTest *t = new MyTest("MyTest");
    CppUnit::TestResult result;
    CppUnit::TextTestRunner r;
    r.addTest(t);
    r.run("", true);

    return 0;
}
其中,runTest()函数是TestCase必须重载的,在测试运行的时候会被调用。CPPUNIT_ASSERT等一系列宏定义在TestAssert.h里面,用作判断测试是否通过。TextTestRunner继承了TestRunner类,用作运行测试并收集测试结果的实例。
编译的时候链接libcppunit和libdl两个动态库(当然也可以直接把.a编译到可执行文件里)
$ g++ MyTest.cpp -o MyTest -lcppunit -ldl
如果报错,一般是动态链接库或者include路径没有识别,一般make cppunit以后,头文件放在/usr/local/include/cppunit/下,库文件在/usr/local/lib/下。在/etc/ld.so.conf下添加/usr/local/lib并运行ldconfig就可以了。
运行上面的例子,结果是:
.F


!!!FAILURES!!!
Test Results:
Run:  1   Failures: 1   Errors: 0


1) test: MyTest (F) line: 33 MyTest.cpp
assertion failed
- Expression: 1 == 2


<RETURN> to continue
因为1==2这个断言不成立,所以测试不通过,cppunit会报告测试的结果和错误的位置。

例子2,添加一个TestSuite
#include <cppunit/TextTestRunner.h>
#include <cppunit/TestResult.h>
#include <cppunit/TestSuite.h>
#include <cppunit/TestCaller.h>
#include <iostream>

using namespace std;

class MyTest: public CppUnit::TestCase
{
    public:

	void setUp(){}
	void tearDown(){}

	void test1()
	{
	    CPPUNIT_ASSERT( 1 == 1);
	}

	void test2()
	{
	    CPPUNIT_ASSERT( 2 == 2);
	}

	//other tests
	//...

	static CppUnit::Test *suite()
	{
	    CppUnit::TestSuite *suiteOfTests = new CppUnit::TestSuite("ThisIsATestSuite");
	    suiteOfTests->addTest(new CppUnit::TestCaller<MyTest>("test1", &MyTest::test1));
	    suiteOfTests->addTest(new CppUnit::TestCaller<MyTest>("test2", &MyTest::test2));
	    return suiteOfTests;
	}
};


int main()
{
    CppUnit::TestResult result;
    CppUnit::TextTestRunner r;
    r.addTest(MyTest::suite());
    r.run("", true);

    return 0;
}
在这里,我们定义了多个测试函数,并通过suite()函数添加到一个TestSuite类里面,最后通过TextTestRunner的addTest()添加。注意,suite()函数返回的是一个Test对象的指针。

一些帮助的宏
cppunit还定义了一些帮助的宏,便于使用者方便的添加TestSuite。
#include <cppunit/TextTestRunner.h>
#include <cppunit/TestResult.h>
#include <cppunit/TestSuite.h>
#include <cppunit/TestCaller.h>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <iostream>

using namespace std;

class MyTest: public CppUnit::TestCase
{
    public:

	void setUp(){}
	void tearDown(){}

	void test1()
	{
	    CPPUNIT_ASSERT( 1 == 1);
	}

	void test2()
	{
	    CPPUNIT_ASSERT( 2 == 2);
	}

	//other tests
	//...

	/*
	static CppUnit::Test *suite()
	{
	    CppUnit::TestSuite *suiteOfTests = new CppUnit::TestSuite("ThisIsATestSuite");
	    suiteOfTests->addTest(new CppUnit::TestCaller<MyTest>("test1", &MyTest::test1));
	    suiteOfTests->addTest(new CppUnit::TestCaller<MyTest>("test2", &MyTest::test2));
	    return suiteOfTests;
	}
	*/
	CPPUNIT_TEST_SUITE(MyTest); //define a TestSuite
	CPPUNIT_TEST(test1);	    //add test
	CPPUNIT_TEST(test2);	    //add test
	CPPUNIT_TEST_SUITE_END();   //end of TestSuite
};

CPPUNIT_TEST_SUITE_REGISTRATION(MyTest);    //register the TestSuite in this cpp file

int main()
{
    CppUnit::TestResult result;
    CppUnit::TextTestRunner r;
    
    //get the registry
    CppUnit::TestFactoryRegistry &registry = CppUnit::TestFactoryRegistry::getRegistry();
    //get all TestSuites in this registry
    r.addTest(registry.makeTest());
    r.run("", true);

    return 0;
}
在这里,我们include了HelperMacros.h和TestFactoryRegistry.h。我们看到,在MyTest类里面,我们不需要再定义suite()函数,取而代之的是几个宏,很方便地就定义了一个TestSuite。另外,CPPUNIT_TEST_SUITE_REGISTRATION这个宏很方便地把这个文件里面的MyTest这个TestSuite注册了。这样,如果有多个测试类中定义了TestSuite,只要都使用这个宏,当调用CppUnit::TestFactoryRegistry::getRegistry()的时候就能够获取所有的TestSuite,非常方便。

 

分享到:
评论

相关推荐

    cppunit全套资源

    在提供的 `cppunit学习资料` 中,你可能会找到以下内容: 1. **用户手册**:详细介绍了如何安装、配置以及使用 `cppunit`,包括如何创建测试用例,如何组织测试套件,以及如何运行和分析测试结果。 2. **API 文档*...

    单元测试工具cppunit详细学习文档、用例

    **cppunit简介** cppunit是C++编程语言中的一款单元测试框架,它是JUnit(Java语言中的一个单元测试框架)在C++领域的移植。...通过深入学习cppunit,开发者可以提升软件开发效率,减少错误,确保项目稳定可靠。

    cppunit源程序及教程

    这个压缩包包含`cppunit`的源代码以及两个示例教程,非常适合初学者入门学习。在本文中,我们将深入探讨cppunit的基本概念、安装、使用方法以及提供的功能。 ### 一、cppunit简介 `cppunit`为开发者提供了一种自动...

    cppunit

    **cppunit** ...通过学习和使用cppunit,开发者可以提高代码质量,降低bug率,实现持续集成和持续交付的流程。通过深入源码,可以更深入地理解其设计思想和实现方式,为定制和扩展cppunit功能打下基础。

    cppunit在linux下的安装配置及测试

    在 Linux 环境下,cppunit 的安装配置过程相对直接,适合初学者学习。以下是详细的步骤和相关知识点: 1. **下载与解压**: - 首先,从 [SourceForge](http://sourceforge.net/projects/cppunit/) 获取最新版本的 ...

    C++ CPPUNIT 示例代码

    总的来说,这个压缩包提供了学习和实践C++单元测试的一个起点,通过分析和运行其中的代码,开发者可以深入理解CppUnit的工作原理,以及如何有效地使用它来提高代码质量。对于想要掌握C++单元测试的人来说,这是一个...

    cppunit单元测试

    通过阅读提供的`CppUnit使用指南.doc`、`CppUnit使用指南.docx`以及`gtest使用教程.ppt`,你可以深入学习这两个框架的用法和最佳实践。同时,`cppunit`源代码也是学习单元测试框架设计的一个宝贵资源。

    Cppunit-1.12.1以及测试框架模板实例Demo

    如果你打算深入学习单元测试或者使用`Cppunit`,这个博文和`Demo`都是很好的资源。 为了充分利用`Cppunit-1.12.1` 和提供的示例,你需要了解C++编程基础,对测试驱动开发(TDD)的概念有一定的理解,并熟悉构建工具,...

    CPPUNIT源码+配置及入门+使用示例代码.rar

    通过学习和使用CPPUNIT,开发者可以提高代码质量,减少bug,增强代码的可维护性和可靠性。在提供的压缩包中,包含了CPPUNIT的源码、配置指南以及使用示例代码,这将有助于你更好地理解和应用这个测试框架。

    CPPUNIT使用说明

    其中,`examples`目录下的示例程序是学习CPPUNIT的好资源,而`include`和`src`分别存放头文件和源文件。 在Windows环境下,使用Visual Studio(如VC6、VC2005或VC2008)来编译CPPUNIT。可以直接打开`examples`目录...

    CppUnit测试框架入门[汇编].pdf

    2. **examples** 文件夹:包含CppUnit的示例代码,这些示例不仅是对CppUnit本身的测试,同时也是学习如何使用CppUnit进行测试的好材料。 3. **include** 文件夹:存放CppUnit的头文件,供开发人员在项目中引用。 4. ...

    CppUnit源码解读

    通过深入学习和分析CppUnit的源码,我们可以更深入地理解单元测试的本质,以及如何设计和实现测试框架。这不仅可以提升我们的C++编程技能,还能让我们在项目开发中更加熟练地运用单元测试,确保代码的质量和稳定性。

    cppunit for bcb6

    CppUnit 是个基于 LGPL 的开源项目,最初版本移植自Unit,是一个非常优秀的开源测试框架。CppUnit 和 JUnit 一样主要思想来源于极限编程(XProgramming)。...如果答案是肯定的,就应该学习使用这种技术

Global site tag (gtag.js) - Google Analytics