使用CppUnit建立简单的测试环境

TDD相信很多人都了解,它是敏捷软件开发中不可缺少的一个环节,能使你编写出更高质量,使你更放心的代码(当然,并不是指使用了TDD之后,就不会出现bug,呵呵,你懂的……)

 

那么,要使用TDD就要有一个测试框架,所以,在C++环境中,一个简单使用的单元测试框架CppUnit会为你帮上不少的忙

 

 

我对CppUnit的学习是从下面的文章中学习到的:

MFC UI界面的:http://www.vckbase.com/document/viewdoc/?id=1762

一个普通Cmd界面的:http://www.cs.nmsu.edu/~jeffery/courses/371/cppunit/cppunit_cookbook.html

 

下面是这两天来对CppUnit的学习记录:

首先,在CppUnit中的架构是:

 

TestRunner->TestSuite->TestCase

 

//这里说的名字是对应着CppUnit中的类的,但并是代表在其对应的层次上就只可以使用这个类,对应的层次上有各种其他可能适合大家的类,相信这三个会是使用的比较多的(还有一个是TestFixture吧,也十分常用)

 

TestRunner主要充当调用者的角色(从名字上可以理解到吧)

TestSuite主要充当着一个封包的角色,即将你所有的test cases都包在一起(不单止是test cases,它同样可以包含一个suite的)

TestCase主要充当一个测试用例,如你要测试:

void testFalse()

{

CPPUNIT_ASSERT(1!=2);

}

这个testFalse就是一个case,Suite就是包含大量这些case的合集(可能还有更多更深的含义,在下并无深入学习,就这是我自己的理解)

 

 

下面是一个简单的例子:

//这里使用到许多HelperMarco.h中的宏,通常如果只是使用CppUnit的话,没有必要这道这些Marco实现是怎样的,知道怎么用就可以了,这是我的理解

 

这里是模仿cppunit_cook_book中的例子:

首先需要一对C++文件:ComplexTest.h/cpp //顾名思义就是对Complex类的测试文件

 

 

#ifndef _COMPLEX_NUM_TEST_H #define _COMPLEX_NUM_TEST_H #include <string> #include "cppunit/TestSuite.h" #include "cppunit/ui/text/TestRunner.h" #include "cppunit/extensions/HelperMacros.h" #include "cppunit/extensions/TestFactoryRegistry.h" #include "Complex.h" using std::string; class ComplerTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(ComplerTest); // 首先声明一个Suite CPPUNIT_TEST(testEquality); // 往Suite里面加入Cases CPPUNIT_TEST(testAddition); CPPUNIT_TEST(testFalse); CPPUNIT_TEST_SUITE_END(); // 声明Suite结束 // 上面几个宏非常简单就做了许许多多的事,要了解实际过程是怎样,参考cppunit_cook_book的文章吧 public: // CppUnit会调用setUp虚函数对数据进行初始化 // virtual void setUp() { m_p10_1 = new Complex(10, 1); m_p10_2 = new Complex(10, 2); m_p11_1 = new Complex(11, 1); } // CppUnit会调用tearDown清理立即 // virtual void tearDown() { delete m_p10_1; delete m_p10_2; delete m_p11_1; } //我们的测试用例 void testEquality() { CPPUNIT_ASSERT(*m_p10_1 == *m_p10_1); CPPUNIT_ASSERT(*m_p10_1 != *m_p10_1); } void testAddition() { CPPUNIT_ASSERT(*m_p10_1 + *m_p10_2 == Complex(20, 3)); CPPUNIT_ASSERT(*m_p10_1 + *m_p11_1 == Complex(20, 3)); } void testFalse() { CPPUNIT_ASSERT( 1 == 2); } private: Complex *m_p10_1; Complex *m_p10_2; Complex *m_p11_1; }; #endif //_COMPLEX_NUM_TEST_H

 

 

#include "ComplexNumTest.h" // 将前面声明的Suite注册到CppUnit里面,我们将会在TestRunner里面调用这个已经注册在内部的Suite /* 这里有一个很严重的问题,一定要将这个实现放在一个.cpp文件中 放到.h文件中会被多次注册到CppUnit中(视你引用.h文件的次) 当你run的时候,测试用例就会被多次调用的了,所以要十分主意 */ CPPUNIT_TEST_SUITE_REGISTRATION(ComplerTest);


然后就需要在我们的main函数里面调用我们的测试用例了

#include "ComplexNumTest.h" int main() { CppUnit::TextUi::TestRunner runner; //声明一个使用TextUi的TestRunner //获取我们刚才注册到CppUnit里面的测试用例 CppUnit::TestFactoryRegistry &registry = CppUnit::TestFactoryRegistry::getRegistry(); runner.addTest(registry.makeTest()); runner.run(); return 0; } 

 

由于在这个时候运行肯定会错的,所以不断进行修改,让编译通过,所有的CPPUNIT_ASSERT()通过就是我们的任务了,这里就开始要体现到TDD的威力了,而CppUnit也已经为我们打下了坚实的基础了!!!它让我们知道我们哪里错了!要做哪些事情,要定义一些怎样的接口等,不单止为我们日后维护提供保障,对我们code层面上的设计都是十分有帮助的,这些都是需要我们不断从编码时间中得到的!!!!

 

对于Complex的实现这里就不贴出代码了,自己实现吧,哈哈!

 

 

你可能感兴趣的:(框架,TDD,单元测试,测试,delete,mfc)