哪个基于c ++的游戏的单元测试框架?[关闭]


13

您觉得哪种测试工具组合是最好的?给定您选择的框架/库,您可以考虑:


注意:尽管这可能是一个类似SO上的通用问题,我还是认为游戏开发通常与特定的工作流程绑定,这会影响测试的选择。要获得更高层次的观点,请参阅问题游戏自动测试


虽然我没有直接看到这个问题有什么毛病,但我认为将其做成Community Wiki将会受益。例如: gamedev.stackexchange.com/questions/480/...
杰西·多尔西

我做到了CW。但是,我认为,作为新手,什么时候提出CW问题的准则对我来说似乎有点不清楚,尤其是因为对此进行了一般性辩论(meta.stackexchange.com/questions/55888)。也许我们可以在FAQ中明确说明与此相关的gamedev政策?
jmp97 2010年

Answers:


7

我发现UnitTest ++非常易于使用。我还必须尝试与amop一起使用,后者被提及是UnitTest ++在模拟对象功能方面的良好伴侣。否则,Google Mock是一个流行的选择。另外,您可能需要阅读UnitTest ++和Mock Objects

可以使用您的持续集成方法来设置UnitTest ++,例如使用Hudson

如果您不相信单元测试和游戏进行得很好,则可能需要阅读这篇鼓舞人心的文章


UnitTest ++是您唯一需要的测试框架,尤其是考虑到它易于修改和扩展,因此尤其如此。如果您以后发现自己进行任何Java编程,JUnit都会用锤子敲打您的脸,并显示它的绝对优雅。
dash-tom-bang 2010年

对于UnitTest ++,请访问github.com/unittest-cpp/unittest-cpp。其他所有内容都已过时。
Markus 2013年

4

再次投票给UnitTest ++。非常容易集成,针对我们的目标嵌入式平台进行编译,非常简单,直接且易于使用。我们还将其与Hudson集成在一起。我们查看了GoogleTest,但拒绝了它(我认为它在为我们的目标平台进行编译时存在问题),但是它具有类似的功能集,可能适合您。

另外,您可能希望研究某种烟雾测试框架。以我的经验,仅凭单元测试就很难获得足够的测试覆盖率。特别是在将单元测试引入现有代码库的情况下,尤其是对于大型团队而言。冒烟测试将测试诸如“确保所有级别都已加载”之类的高级内容。我的理论是,如果我同时进行这两种测试,那么它们有时可能会在中间相遇并达到不错的收敛性。:)


2

回到我使用C ++时(免责声明:大约是2005年),我使用了经过稍微修改TUT(模板单元测试框架)版本。我喜欢它,因为它非常轻巧,易于修改,并且在编写测试时几乎不需要“胶水”。

这是我所做的一个非常简单的修改,使编写测试变得更加轻松/整洁:

static int BogusFunction() { return __COUNTER__; } // Increment the __COUNTER__ to the correct position for the begining of the tests
#define TEST template<> template<> void object::test<__COUNTER__>()
#define ENSURE(msg, cond) ensure(msg, cond, __FILE__, __LINE__)
#define ENSURE_EQUALS(msg, actual, expected) ensure_equals(msg, actual, expected, __FILE__, __LINE__)
#define ENSURE_DISTANCE(msg, actual, expected, distance) ensure_distance(msg, actual, expected, distance, __FILE__, __LINE__)
#define FAIL(msg) fail(msg, __FILE__, __LINE__)

我所做的另一项更改是其输出格式,以便测试失败可以正确显示在Visual Studios的错误列表中(当作为构建的一部分运行时),可单击以转到失败的测试的文件和行。

(能力做这样的事情意味着可以制成适合您的TDD / CI过程,而不是强迫你适应它。)

这是一个示例测试(来自我的编辑器的命令堆栈):

TEST // Undoing a command
{
    cs.AddCommand(new TestCommand);
    cs.AddCommand(new TestCommand(od));

    ENSURE("Undo success", cs.Undo());
    ENSURE_EQUALS("Stack size", cs.size(), 2);
    ENSURE_EQUALS("Command's Undo() was called", od.undo, 1);
    ENSURE_EQUALS("Command's Redo() not called", od.redo, 0);

    ACommandStack::const_iterator it = cs.end();
    ENSURE("Command is redoable", cs.GetUndoPos() == --it);
}

(在上面的代码中,csod是每个模块的装置,并且TestCommand是模拟对象。)



2

我不是专业的游戏开发人员,但我是专业的嵌入式开发人员。也许不完全像游戏,但接近。在我的工作场所,我们使用了一些。

我真的很喜欢Google测试。它具有最新单元测试框架的所有最佳功能,同时将所有功能都保留在最小的流水线接口中。

我列表中的下一个是Boost Test。Google Test的api比Boost.Test更加现代,但是Boost Test在添加新功能和放弃笨拙的CppUnit范例方面做得非常出色。

我也用过CxxTest。它做得很好,但您可以说它不像Boost.Test或Google Test那样现代。特别是,它对测试套件和固定装置的支持有些尴尬。

我喜欢使用高级功能,但是如果您是极简主义者,您将永远不会看到两者之间的区别。我的大多数同事对支持自动注册测试(以声明方式)并具有某种CHECK_EQUALS(a,b)宏的单元测试框架感到满意。


1

我最喜欢的测试库是QuickCheck http://en.wikipedia.org/wiki/QuickCheck。有一个实验性的C ++版本,但是看起来太重了,但是即使没有专用的库,这些原理也易于使用。

我所有的类都有一个genArbitrary方法,可以生成一个随机实例。我将其用于烟雾测试的可逆过程,例如装载和卸载。我可以生成数千个随机场景,并检查各种属性是否成立(例如我序列化的场景与我反序列化的场景相同)。

它不能替代传统的单元测试(它确实减少了对许多潜在单元测试的需求),但是它是发现错误的好方法,并且可以帮助压力测试我的内存分配策略(以及Valgrind)。Valgrind pure :)非常高兴地看到超过一百万的分配。

我曾经喜欢使用CxxTest作为测试工具。现在,我所有的测试都是单独的exe。我只有一个名为Test的文件夹,并且以Test_开头的文件都会成为测试。到目前为止,进行测试非常轻便。


0

使用Java,有很多好的库... C ++并非如此。

对于C ++用户,Kitware提供了一个非常有趣的链工具:

  • CMake:制作工具
  • CDash:持续集成工具

Kitware为计算机科学编写C ++代码。

对于个人项目,我使用Boost单元测试库(在桌面平台上)。对于持续集成,我使用Hudson:

  • 在Tomcat上轻松安装
  • 可编写脚本

0

我将第二个TUT(模板单元测试)框架;它是超轻量级的,并且非常灵活,更不用说真正易于设置和使用了(一个单独的头文件,包括一些主/设置代码,以及24行测试代码,稍后您将进行单元测试)。我将它与binfmtc(作为脚本运行C ++程序)结合在一起,以快速进行原型制作/ TDD /学习模板,包括嵌入式软件开发在内,取得了巨大的成功。由于它能够输出到XML,因此在我的后续项目中也与Jenkins(CI)和Sonar很好地契合。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.