当前位置:  开发笔记 > 编程语言 > 正文

C++单元测试框架的比较

如何解决《C++单元测试框架的比较》经验,为你挑选了6个好方法。

我知道关于C++单元测试框架的建议已经存在一些问题,但所有答案都没有帮助,因为他们只是推荐其中一个框架,但没有提供有关(特征)比较的任何信息.

我认为最有趣的框架是CppUnit,Boost和新的Google测试框架.有人做过任何比较吗?



1> Wernight..:

一个新的播放器是Google Test(也称为Google C++测试框架),但它非常好用.

#include 

TEST(MyTestSuitName, MyTestCaseName) {
    int actual = 1;
    EXPECT_GT(actual, 0);
    EXPECT_EQ(1, actual) << "Should be equal to one";
}

主要特点:

手提

致命和非致命的断言

轻松断言信息性消息:ASSERT_EQ(5, Foo(i)) << " where i = " << i;

Google Test会自动检测您的测试,并且不需要您枚举它们才能运行它们

可以轻松扩展断言词汇表

死亡测试(参见高级指南)

SCOPED_TRACE 用于子程序循环

您可以决定运行哪些测试

XML测试报告生成

固定装置/模拟/模板 ......


我在我的新测试框架CATCH中提供了所有这些功能(虽然有些尚未公开).请参阅我的回答链接.
@CashCow使用构建运行与测试检测不同.使用build运行取决于您的构建系统.测试检测意味着你没有**列出另一个类中的所有测试,只需创建测试方法即可.
我真的很喜欢使用谷歌测试一些其他框架,尤其是它的模拟功能,可以在googlemock框架中找到.
将它与Google C++ Mocking框架结合在一起,使其成为单元测试C++代码的强大xUnit测试框架.

2> philsquared..:

我刚推出了自己的框架,CATCH.它仍在开发中,但我相信它已经超过了大多数其他框架.不同的人有不同的标准,但我试图覆盖大部分地方而没有太多的权衡.看看我的链接博客条目,了解品尝者.我的五大特色是:

仅限标题

自动注册基于功能和方法的测试

将标准C++表达式分解为LHS和RHS(因此您不需要一整套断言宏).

支持基于函数的fixture中的嵌套部分

使用自然语言进行名称测试 - 生成函数/方法名称

它还具有Objective-C绑定.该项目由Github托管


我认为最好的框架.
[doctest](https://github.com/onqtam/doctest)是我对Catch的重新实现,主要关注编译速度 - 查看[FAQ](https://github.com/onqtam/doctest/blob/master /doc/markdown/faq.md#how-is-doctest-different-from-catch)看他们有什么不同
在比较所有测试框架(我现在必须选择其中一个)时,我真的很茫然.您是否会编写自己的答案,将doctest与Catch和其他产品进行比较和对比?

3> Sam Saffron..:

有关讨论,请参阅此问题.

他们推荐文章: 探索C++单元测试框架Jungle,作者:Noel Llopis.最近的:C++测试单元框架

我还没有找到一篇将googletest与其他框架进行比较的文章.


一个批评:文章虽然好,但是从2004年开始,不包括谷歌测试.
在第一个链接中,您将看到两个比较.除了来自谷歌的新框架,大多数信息(仍然是?)仍然相关.(而且CppUnit不是最有趣的,使用起来太笨拙了)

4> Wernight..:

Boost测试库是一个非常好的选择,特别是如果你已经在使用Boost.

// TODO: Include your class to test here.
#define BOOST_TEST_MODULE MyTest
#include 

BOOST_AUTO_TEST_CASE(MyTestCase)
{
    // To simplify this example test, let's suppose we'll test 'float'.
    // Some test are stupid, but all should pass.
    float x = 9.5f;

    BOOST_CHECK(x != 0.0f);
    BOOST_CHECK_EQUAL((int)x, 9);
    BOOST_CHECK_CLOSE(x, 9.5f, 0.0001f); // Checks differ no more then 0.0001%
}

它支持:

自动或手动测试注册

许多断言

集合的自动比较

各种输出格式(包括XML)

赛程/模板 ......

PS:我写了一篇关于它的文章可能会帮助你入门:C++单元测试框架:一个Boost测试教程


教程链接已损坏
@mloskot再次运作.

5> John Deters..:

维基百科有一个完整的单元测试框架列表,其中包含可识别支持与否的功能的表.



6> moswald..:

我最近发布了xUnit ++,特别是作为Google Test和Boost Test Library的替代品(查看比较).如果您熟悉xUnit.Net,那么您已准备好使用xUnit ++.

#include "xUnit++/xUnit++.h"

FACT("Foo and Blah should always return the same value")
{
    Check.Equal("0", Foo()) << "Calling Foo() with no parameters should always return \"0\".";
    Assert.Equal(Foo(), Blah());
}

THEORY("Foo should return the same value it was given, converted to string", (int input, std::string expected),
    std::make_tuple(0, "0"),
    std::make_tuple(1, "1"),
    std::make_tuple(2, "2"))
{
    Assert.Equal(expected, Foo(input));
}

主要特点:

令人难以置信的快速:测试同时运行.

手提

自动测试注册

许多断言类型(Boost在xUnit ++上没有任何内容)

本地比较集合.

断言分为三个层次:

致命错误

非致命错误

警告

断言记录:Assert.Equal(-1, foo(i)) << "Failed with i = " << i;

测试记录:Log.Debug << "Starting test"; Log.Warn << "Here's a warning";

赛程

数据驱动测试(理论)

根据以下内容选择要运行测试:

属性匹配

命名substring matchin

测试套房


问题是要求比较.IMO,至关重要的是提出你的框架和至少两个流行的框架之间的*差异:googletest和Boost.特别是,如果您宣传xUnit ++作为这两者的替代品.如果更新将是+1 :)
推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有