StdExt/TPL/WinxGui/Erlang/Erlana - 许式伟的专栏

许式伟 ID:xushiweizh
394877次访问,排名114好友3人,关注者33
xushiweizh的文章
原创 121 篇
翻译 0 篇
转载 10 篇
评论 886 篇
许式伟的公告

本博客内容除非特殊说明均属原创,如需转载、引用其中的部分文字,请注意以下几点:

1)请在转载(引用)的内容开始添加本人署名,并提供本博客中相应文章的链接。如你的作品为非电子读物或纯文本,请给出链接的url。

2)请勿用于商业用途。

3)如果愿意,请给我邮件:xushiweizh@gmail.com,让我知道我的东西到哪去了。谢过。

重要链接


订阅

最近评论
xushiweizh:如果你用VC++ 6.0, 建议按照Visual Assist,程序开发可事半功倍。
tony963:郁闷....ing

请问博主,为何Winx的代码提示功能无法使用?是我的VC6没设置对吗?
比如
winx::PaintDC dc(hWnd);
dc.列出一堆成员方法和变量

在WTL程序里是可以的,写程序时不可能老是去看某个类的方法和变量吧??????
ken16:voipExplore :
(7)这个功能并非什么原创性。想想apache、squid悠远的历史,强悍的稳定,超常的性能吧。这个AutoFreeAlloc的风靡只能说明国人对技术的脱节与懒惰。

看的过程中,也是立即就想到了 apr_pool_t 这个东西,呵呵。刚开始还以为 LZ 提出来什么很特别的算法
bobdong:路过. {}限定了变量的作用域. 所以如果这是GCC的扩展, 那实在不是好的扩展, 破坏了ANSI C的规范
xushiweizh:同 hepu2007.
文章分类
收藏
相册
DocX预览图
Google vs. 百度
WinX相关
WINX团队
ebasil的专栏(RSS)
VisualFC/WINX专栏(RSS)
任风行(一路奔跑)(RSS)
绅士亦花心之WINX相关(RSS)
许伟群的专栏(RSS)
友情链接
QWL1996的专栏(RSS)
Sting的专栏(RSS)
SunHui的专栏(RSS)
不亦快斋(RSS)
于无声处(RSS)
手机开发论坛
珠穆朗玛(老汉)(RSS)
福&柯实验室(RSS)
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 CppUnit的缺陷与改进 收藏

新一篇: 贺:WINX发布4个月整

CppUnit的缺陷与改进

许式伟
2006-12-19

CppUnit的缺陷

上一篇我们介绍了CppUnit以及它的一些重要理念(参见《CppUnit与单元测试》)。然而在使用CppUnit的过程中,我还是遇到了一些不如意的地方。这里,我们就要讨论下我看到的CppUnit存在的一些不足,以及我在WINX中对它作出的改进。 

CppUnit提供了自动化、安全可控的执行环境。这是它的精华。然而它的问题在于,在测试案例执行失败,也就是说当模块存在bug时,没有一个很好的方式去跟踪它。展开来说,主要的问题有两点:

1、虽然CppUnit的出错报告中给出了错误所在的文件以及行号,但是这个信息并不方便,也不充足。 

不方便之处在于,我得找到相应的文件,然后打开它,定位到出错的行,设置断点,跟踪。有没有可能做得更加方便一些?不充足之处在于,也许出错行并不是每次执行都出错,而是在n次执行的时候出错。那么直接跑到出错行设断点,不是什么好主意。

我们知道,MFC的ASSERT(或者ATL的ATLASSERT)很好用,因为它在断言失败时可以停下来,进入调试状态。有没有可能,CPPUNIT_ASSERT也可以在出错的时候停下来?嗯,好像不行?CppUnit强调的是自动化,如果停下来就麻烦了。——各位读者想到可什么主意了?

2、一个测试程序有很多个测试案例,在某个测试函数存在bug时,其实我们跟踪调试的时候,并不喜欢所有的案例一起执行,而只希望执行有问题的案例。

特别是每个案例执行时间如果较长,那么漫长的等待也许让你有挫伤感。另外的问题是,也许几个案例测试的是从不同角度去测试同一个功能(函数),这样你设置的断点可能经常被那些没有bug的案例干扰。这些问题都导致了不愉快的体验。那么怎么办呢?把其他案例都注释掉?也许一直以来你都这样去做了。可有更好的办法吗?

 

WINX对CppUnit的改进

下面我们看看WINX中是如何支持单元测试的。当然更重要的是,如何解决上面的这些问题的。

 我曾经基于CppUnit写过一个增强版本的CppUnit。这个版本的CppUnit引入了两个概念(注意下面列了3条。第3条是写WINX时引入的):

1、引入调试模式。

在调试模式下,CPPUNIT_ASSERT的行为与ASSERT/ATLASSERT一致,也是弹出断言对话框。而在普通模式下,则CPPUNIT_ASSERT报告案例执行错误,并不停下来。

2、引入案例执行的过滤条件。

也就是说,你可以选择只执行符合特定条件的案例。

3、把代码和针对该代码的测试案例写在同一个文件里。

写WINX的时候,我为是否要把CppUnit引入到WINX中,仔仔细细考察了下CppUnit。最终我决定,依据CppUnit的思想,写一个mini版本的CppUnit,而不直接基于CppUnit。

这是因为,WINX的单元测试观念在CppUnit的测试理念之上,加了一条:

  • 把代码和针对该代码的测试案例写在同一个文件里。

这样做的好处是:

  • 你不容易忘记修改好代码后,去执行下相应的案例。
  • 你的代码规格改变后,你需要顺手修改一下测试案例的代码,以便它可以编译通过。
  • 测试案例一定程度上起到了示例代码的作用。

WINX的单元测试样例

template <class LogT>
class TestFileBuf : public TestCase
{
public:
    WINX_TEST_SUITE(TestFileBuf);
        WINX_TEST(test);
    WINX_TEST_SUITE_END();

public:
    
void test(LogT& log)
    {
        WinFileBuf file(__FILE__);
        log.printString(file.begin(), file.end());

        FILEFileBuf file2(__FILE__);
        AssertEq(file.size(), file2.size());
        AssertEqBuf(file.data(), file2.data(), file.size());
    }
};

void main()
{
    WINX_TEST_APP(std::ErrorLog, 
"TestFileBuf""test");
    
// this means to run the TestFileBuf::test function.
    
// and, WINX_TEST_APP(std::ErrorLog, "", "") means to run all TestCases

    WINX_TEST_CLASS(TestFileBuf);
}

以上代码参见:

WINX感兴趣?到这里下载完整代码。

发表于 @ 2006年12月19日 22:52:00|评论(loading...)|编辑

旧一篇: CppUnit与单元测试

评论

#ken0426 发表于2006-12-20 10:53:06  IP:
好东西!
#kingofcoder1 发表于2006-12-26 11:34:32  IP: 219.77.34.*
纯编程文篇网
http://www.KingOfCoder.com
http://www.KingOfCoder.com
http://www.KingOfCoder.com
http://www.KingOfCoder.com
http://www.KingOfCoder.com
http://www.KingOfCoder.com
http://www.KingOfCoder.com
http://www.KingOfCoder.com
http://www.KingOfCoder.com
http://www.KingOfCoder.com
#binglex 发表于2007-01-08 15:45:36  IP: 202.99.4.*
lz是否用过unit--,是我见过的最简单的测试用例库;
#include "unit--.h"

testSuite(MySuite);

testCase(CompareCase, MySuite)
{
int x = 1;
int y = x + 2;
assertTrue(x < y);
}

#binglex 发表于2007-01-08 15:46:03  IP: 202.99.4.*
lz是否用过unit--,是我见过的最简单的测试用例库;
#include "unit--.h"

testSuite(MySuite);

testCase(CompareCase, MySuite)
{
int x = 1;
int y = x + 2;
assertTrue(x < y);
}

Yes, that's all. There's no need to register your test case else where.
Simply compile your code and link it with unit--.cpp
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 许式伟