4

CppUnit 的设计类似于 JUnit 和其他 XUnit 框架。

这样做的优点/缺点是什么?出于这个原因,什么时候应该选择它?
如果相似性没有优势,是否应该首选不同的框架。开始时的实际使用是否简单直观?


先从优势说起。使用一些工具会更好吗?例如,用于持续集成的工具?

在混合环境(如 C# 和 C++)中更好吗?

缺点:我知道构建起来稍微复杂一些,因此跨平台比其他框架少。就我个人而言,我的印象是(对于初学者)很容易陷入编译和链接错误,似乎很难遵循实际代码(例如在调试器中),而且与函数一起使用也不那么自然( C 风格的接口)。

4

2 回答 2

1

好处:

CppUnit 的主要优点是它遵循 XUnit 模式的 Setup / Test / Teardown。任何具有 XUnit 经验的人都可以理解该范例。必须使用宏而不是属性或反射(就像使用 .Net 或 Java XUnit 框架一样)是一种解决方法,但并不是很麻烦。

CppUnit 本身是可移植的。尽管 TestRunner.DLL GUI 完全在 MFC 中构建,因此仅适用于 Windows,但命令行版本不使用 Microsoft 特定代码,并且可以在许多平台上执行。

它也非常稳定。多年来,开发人员几乎没有对它做任何事情,主要是因为它的核心不需要任何东西。它把它的一件事做得很好。

缺点:

不幸的是,缺点是缺乏最终用户的支持。我最大的抱怨是没有将 CppUnit 集成到 IDE 中的好工具。我认为这最严重的原因是测试需要纪律。任何使单元测试变得比实际更难的事情都将被用作不这样做的借口。

您可以手动添加格式以输出 Visual Studio 将正确解释的测试失败行(因此双击它将带您到测试中失败的 ASSERTion。)但这不随工具提供,您必须学习它在像这样的网站上外部。

您可以编写一个 IDE 插件来为您生成单元测试框架代码,但我知道没有公开提供此类插件。同样,这对于开发人员来说需要很容易。

因为没有集成,所以也没有关于将 CppUnit 项目合并到您的代码库中的已发布指南。这使得开始变得非常困难。

如果你设法让它工作,有几个人报告了幻影 CppUnit 项目签入/签出问题。

CppUnit 不支持任何特定的模拟框架。由于大多数模拟框架使用反射来使开发模拟变得轻松,因此 C++ 总是会在那里受到一些影响。

备择方案:

有很多很多的 C++ 单元测试框架。Googletest 得到了一些人的好评。CppUnitLite 受到一些人的称赞,但我发现它非常混乱和无益。CxxUnit 需要一个笨拙的 Python 扫描和解析步骤——对于不太文明的时代来说,这是一种不太优雅的武器。在这个领域有许多商业参与者,提供他们的商品。

我推荐http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C.2B.2B以获得非常丰富的替代品列表。

虽然我还没有机会使用它,但我知道 Visual Studio 2012 已经整合了 Microsoft 自己的测试套件工具,并使其可用于本机 C++ 代码。以前,它只能通过 .Net 集成工作,这对于大多数 C++ 代码来说是无用的。我真的很期待拥有一整套工具,包括它们的代码覆盖集成,它可以突出显示您的测试代码,向您展示测试覆盖中的差距。

底线:如果我今天重新开始,我会选择一个不同的与 XUnit 兼容的测试框架,一个与 IDE 完全集成的框架。当我们选择 CppUnit 时,它是 Visual Studio 6.0 中最好的游戏,但现在我们只是忍受它。

于 2012-11-05T17:11:41.457 回答
0

坏处:

在研究CppUnit时,我发现 CppUnit Test 的安装路径是固定的(/usr/local),无法修改。因此,当您尝试将此框架集成到您没有管理员权限的工作机器上时,这将是一个问题

MYMACHINE:cppunit-1.12.1 usrId$ make install
Making install in src
Making install in cppunit
test -z "/usr/local/lib" || ../../config/install-sh -c -d "/usr/local/lib"
 /bin/sh ../../libtool   --mode=install /usr/bin/install -c  'libcppunit.la' '/usr/local/lib/libcppunit.la'
/usr/bin/install -c .libs/libcppunit-1.12.1.0.0.dylib /usr/local/lib/libcppunit-1.12.1.0.0.dylib
install: /usr/local/lib/libcppunit-1.12.1.0.0.dylib: Permission denied
make[3]: *** [install-libLTLIBRARIES] Error 71
make[2]: *** [install-am] Error 2
make[1]: *** [install-recursive] Error 1
make: *** [install-recursive] Error 1
MYMACHINE:cppunit-1.12.1 usrId$

即使更改了多个makefile,结果也是一样的

MYMACHINE:cppunit-1.12.1 usrId$ make install
test -z "/Users/username/lib" || ../../config/install-sh -c -d "/Users/username/lib"
 /bin/sh ../../libtool   --mode=install /usr/bin/install -c  'libcppunit.la' '/Users/username/lib/libcppunit.la'
/usr/bin/install -c .libs/libcppunit-1.12.1.0.0.dylib /Users/username/lib/libcppunit-1.12.1.0.0.dylib
(cd /Users/username/lib && { ln -s -f libcppunit-1.12.1.0.0.dylib libcppunit-1.12.1.dylib || { rm -f libcppunit-1.12.1.dylib && ln -s libcppunit-1.12.1.0.0.dylib libcppunit-1.12.1.dylib; }; })
(cd /Users/username/lib && { ln -s -f libcppunit-1.12.1.0.0.dylib libcppunit.dylib || { rm -f libcppunit.dylib && ln -s libcppunit-1.12.1.0.0.dylib libcppunit.dylib; }; })
/usr/bin/install -c .libs/libcppunit.lai /Users/username/lib/libcppunit.la
/usr/bin/install -c .libs/libcppunit.a /Users/username/lib/libcppunit.a
chmod 644 /Users/username/lib/libcppunit.a
ranlib /Users/username/lib/libcppunit.a
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/username/lib/libcppunit.a(BeOsDynamicLibraryManager.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/username/lib/libcppunit.a(ShlDynamicLibraryManager.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /Users/username/lib/libcppunit.a(Win32DynamicLibraryManager.o) has no symbols
libtool: install: warning: remember to run `libtool --finish /usr/local/lib'
make[1]: Nothing to be done for `install-data-am'.
于 2018-08-02T18:16:32.847 回答