分享
 
 
 

CppUnit入门实践-Tony与Alex的对话系列

王朝other·作者佚名  2006-03-04
窄屏简体版  字體: |||超大  

Tony : Hi Alex ! you just looks like drowing in your project. what is up?

Alex : 我们的项目要求引入单元测试,but i've no experience in unit test.

Tony : i think cppunit is your best choice.

Alex : 是的,我刚从网上把它down了下来,正准备研究它呢。

Tony : Really ? I have done some practice on unit test before. would you like me to join you?

Alex : Oh Tony, I'm so glad that you could help me !

Tony : My pleasue !

Alex : 我们从哪里开始呢?

Tony : The simplest case! 我们拿一个最简单的例子吧。now we have a class with the name "SimpleCalculator" and it has four basic methods 'add', 'sub', 'mul' and 'div', All we should do is to test whether these methods run as same as we expect. First of all , complete the "SimpleCalculator" class, Alex.

Alex : It is simple!

//SimpleCalculator.h

class SimpleCalculator{

public :

int add(int a, int b);

int sub(int a, int b);

int mul(int a, int b);

int div(int a, int b);

};

//SimpleCalculator.cpp

int SimpleCalculator::add(int a, int b){

return a+b;

}

int SimpleCalculator::sub(int a, int b){

return a-b;

}

int SimpleCalculator::mul(int a, int b){

return a*b;

}

int SimpleCalculator::div(int a, int b){

return a/b;

}

Alex : 这里简单点,div方法没有考虑0作除数的异常情况。

Tony : 可以。还记得我上次讲的测试驱动开发么,不过今天我们不是用它,我们只做些简单的东西,目的就是为了熟悉工具的使用。

Alex : 那我们是不是也应该列出一个test case的list亚?

Tony : 没错。

Alex : 我来随意写几个吧。“add(5,6) == 11” 、“sub(5,6)==-1”、“mul(5,6) == 30”和“div(12,6) == 2”。

Tony : 然后我们一起来学习一下CppUnit的帮助文档吧。

(Tony and Alex are reading the doc of cppunit.)

Tony : 学到了些什么?

Alex : 看来这些xUnit框架的测试工具在概念上几乎是一致的,像TestCase、TestFixture和TestSuite这些概念都大同小异。

Tony : 不错,单元测试在于测试思想,工具只是个必要条件而已,工具并不能决定你的测试就是一个好的测试。下面你就按你理解的CppUnit去做吧。

Alex : Ok. 按照书中所说,我们一次要测试多个method,最好使用TestFixture。我是这样写的,你看看。

#include "SimpleCalculator.h"

#include "CppUnit/TestCase.h"

#include "CppUnit/TestResult.h"

#include "CppUnit/TextOutputter.h"

#include "CppUnit/TestResultCollector.h"

#include "CppUnit/TestCaller.h"

#include "CppUnit/extensions/HelperMacros.h"

class SimpleCalcTest : public CPPUNIT_NS::TestFixture{

private :

SimpleCalculator * sc;

public:

virtual void setUp(){

sc = new SimpleCalculator();

}

virtual void tearDown(){

delete sc;

}

void testAdd(){

CPPUNIT_ASSERT_EQUAL( sc->add(5,6), 11);

}

void testSub(){

CPPUNIT_ASSERT_EQUAL( sc->sub(5,6), -1 );

}

void testMul(){

CPPUNIT_ASSERT_EQUAL( sc->mul(5,6), 30 );

}

void testDiv(){

CPPUNIT_ASSERT_EQUAL( sc->div(12,6), 2 );

}

};

我们的主函数如下:

int main()

{

CPPUNIT_NS::TestResult r;

CPPUNIT_NS::TestResultCollector result;

r.addListener( &result );

CPPUNIT_NS::TestCaller<SimpleCalcTest> testCase1( "testAdd", &SimpleCalcTest::testAdd );

CPPUNIT_NS::TestCaller<SimpleCalcTest> testCase2( "testSub", &SimpleCalcTest::testSub );

CPPUNIT_NS::TestCaller<SimpleCalcTest> testCase3( "testMul", &SimpleCalcTest::testMul );

CPPUNIT_NS::TestCaller<SimpleCalcTest> testCase4( "testDiv", &SimpleCalcTest::testDiv );

testCase1.run( &r );

testCase2.run( &r );

testCase3.run( &r );

testCase4.run( &r );

CPPUNIT_NS::TextOutputter out( &result, std::cout );

out.write();

return 0;

}

Tony : 我觉得可行。运行一下,看看如何。

Alex : 输出结果如下:

OK (4 tests)

Tony : 这的确是一种可行的办法,不过你回想一下我们一起学习的doc中的内容,看看是否还有改进的余地了。现在如果你要在SimpleCalcTest类中加一个测试用例方法,不仅仅SimpleCalcTest要修改,我们的main函数也需要修改,还记得JUnit中有什么概念来支持么?

Alex : 你不提我还真的记不起来了,JUnit中有TestSuite,刚才在cppunit doc中我也看到了suite方法,也许会帮得上忙,稍等一下我再翻翻文档....

Alex : 我找到了。的确有更为简单的方法。我修改一下,引用的头文件不变。

class SimpleCalcTest : public CPPUNIT_NS::TestFixture{

CPPUNIT_TEST_SUITE( SimpleCalcTest );

CPPUNIT_TEST( testAdd );

CPPUNIT_TEST( testSub );

CPPUNIT_TEST( testMul);

CPPUNIT_TEST( testDiv );

CPPUNIT_TEST_SUITE_END();

private :

SimpleCalculator * sc;

public:

virtual void setUp(){

sc = new SimpleCalculator();

}

virtual void tearDown(){

delete sc;

}

void testAdd(){

CPPUNIT_ASSERT_EQUAL( sc->add(5,6), 11);

}

void testSub(){

CPPUNIT_ASSERT_EQUAL( sc->sub(5,6), -1 );

}

void testMul(){

CPPUNIT_ASSERT_EQUAL( sc->mul(5,6), 30 );

}

void testDiv(){

CPPUNIT_ASSERT_EQUAL( sc->div(12,6), 2 );

}

};

CPPUNIT_TEST_SUITE_REGISTRATION( SimpleCalcTest );

主函数修改后如下:

int main()

{

CPPUNIT_NS::TestResult r;

CPPUNIT_NS::TestResultCollector result;

r.addListener( &result );

CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest()->run( &r );

CPPUNIT_NS::TextOutputter out( &result, std::cout );

out.write();

return 0;

}

CppUnit利用宏来解决Suite的问题。在你的TestCase定义里面写入如下的这段代码:

CPPUNIT_TEST_SUITE( YourTestCase );

CPPUNIT_TEST( testXX);

...//

CPPUNIT_TEST_SUITE_END();

这段代码实际上是定义了一个函数suite,这个函数返回了一个包含了所有CPPUNIT_TEST定义的测试用例的一个测试集。CPPUNIT_TEST_SUITE_REGISTRATION通过静态注册把这个测试集注册到全局的测试树中,最后通过CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest()生成一个包含所有测试用例的测试并且运行。这样的话,一旦要添加新的测试用例函数,我们只需要修改SimpleCalcTest类即可。

Tony : Well done! Alex你独立解决问题的能力越来越强了。相信做到这你已经心里有底儿了,再往后就是在你的实际项目中摸索CppUnit的使用经验了。

Alex : 呵呵。谢谢夸奖!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有