【问题标题】:C++ Unit Testing Libraries [closed]C++ 单元测试库 [关闭]
【发布时间】:2011-01-03 13:36:43
【问题描述】:

我遇到过 cppunit,但它看起来并不超级好用(也许我看起来并不难,也许是因为 C++ 不像 Java/C# 那样工作)。是否有广泛使用的简单替代方案?

事实上, cppunit 是 C++ 的标准单元测试框架吗?

【问题讨论】:

标签: c++ unit-testing cppunit


【解决方案1】:

我刚刚推出了自己的框架CATCH。它仍在开发中,但我相信它已经超越了大多数其他框架。 不同的人有不同的标准,但我试图在没有太多权衡的情况下涵盖大部分内容。 请查看我的链接博客条目以供品酒师使用。我的前五个功能是:

  • 仅标题
  • 自动注册基于函数和方法的测试
  • 将标准 C++ 表达式分解为 LHS 和 RHS(因此您不需要一整套断言宏)。
  • 支持基于函数的夹具中的嵌套部分
  • 使用自然语言命名测试 - 生成函数/方法名称

它还具有 Objective-C 绑定。

作为一个例子,下面是你如何编写与@dmeister 引用的 gtest 示例等效的方法:

TEST_CASE( "Factorial/Handles zero input", "Tests factorial of 0.") 
{
  REQUIRE( Factorial(0) == 1 );
}

TEST_CASE( "Factorial/Handles positive input", "Tests factorial of positive numbers.") 
{
  REQUIRE( Factorial(1) == 1 );
  REQUIRE( Factorial(2) == 2 );
  REQUIRE( Factorial(3) == 6 );
  REQUIRE( Factorial(8) == 40320 );
}

如果测试失败,您仍然会独立记录 LHS 和 RHS 值。

【讨论】:

  • doctest 是我对 Catch 的重新实现,非常注重编译速度 - 查看 FAQ 以了解两者之间的不同
【解决方案2】:

C++ 没有标准单元测试库。有很多选择可供选择; cppunit 就是其中之一。

在我的公司,我们使用Google Test 及其合作伙伴Google Mock 进行单元测试和对象模拟。我发现它们结合起来比 cppunit 更易于使用且功能更强大。

【讨论】:

  • +1 酷,我不知道这些存在。
  • 只是好奇,google-thangs 与 Eclipse 和 Hudson “玩得好吗”?
  • 它能够将输出写入 xml 文件,遵循与 JUnit 相同的模式,带有标志 --gtest_output="xml:_path_to_output_file_"。它适用于我们在 Windows、Mac 和 Ubuntu 上的 hudson。我不能代表 eclipse,虽然我们不使用它。
【解决方案3】:

Google Test 框架是另一种选择。

这是来自documentation的一个简单示例:

// Tests factorial of 0.
TEST(FactorialTest, HandlesZeroInput) {
  EXPECT_EQ(1, Factorial(0));
}

// Tests factorial of positive numbers.
TEST(FactorialTest, HandlesPositiveInput) {
  EXPECT_EQ(1, Factorial(1));
  EXPECT_EQ(2, Factorial(2));
  EXPECT_EQ(6, Factorial(3));
  EXPECT_EQ(40320, Factorial(8));
}

它还可以很好地与gmock(Google 的 C++ 模拟框架)配合使用。

【讨论】:

【解决方案4】:

CppUnit 可能是 C++ 的第一个单元测试框架。它是著名的 Java 框架 Junit 的直接端口。这使得从 Junit 的过渡更容易,但代价是框架有点重,没有利用 RAII 等 C++ 功能。这就是创建 CppUnitLite、NanoCppUnit 等轻量级版本的原因。 CppUnit2 应该改进这一点,以及其他改进。

Tut 以前很轻,只有一个 header,但最新版本引入了一个库。

就“标准”框架而言,没有,C++1X 也没有定义。

【讨论】:

    【解决方案5】:

    我为自己的代码开发人员创建了一个名为 saru (http://github.com/mikeando/saru) 的测试套件。它是一个 BSD 许可代码。我开发它是因为我不喜欢其他测试套件的几个特性。它没有被广泛使用,但我已经在分布在两家公司的几个商业项目中使用它。

    1. 我不喜欢我的所有测试都被编译成一个二进制文件。我这样做的原因是,如果编译失败所有测试都失败,如果一个测试执行未定义的行为,则程序输出未定义。
    2. 我想控制运行的测试。我希望能够对测试进行分组并运行子集。
    3. 我希望将测试的编译失败报告为测试失败,而不是停止所有正在运行的测试。
    4. 我希望能够运行多种不同语言的测试
    5. 我想要一个足够灵活的系统,以便我可以在 valgrind 下运行特定的测试(在 saru 中还没有:()

    所以 saru 解决了大部分这些功能。 它的重点是能够运行一套用不同语言编写的测试。 以最小的测试规模。这是最小的(失败的)C++ 测试

    //SARU : dummy dummy
    int main() { return (1==2)?0:1; }
    

    所有 saru 真正关心的是它编译的二进制文件的返回值。 然后它解析输出以确定哪些测试失败等等。它的头文件使使用 C++ 比上面的简单示例更好:

    //SARU : dummy dummy
    #include "MyStruct.h"
    #include "saru_cxx.h"
    
    class Fixture
    {
      MyStruct s_;
      Fixture() : s_() {}
      void test_A_is_B()
      {
         SARU_ASSERT_EQUAL( s_.A(), s_.B() );
      }
    
      void test_C_is_7()
      {
         SARU_ASSERT_EQUAL( 7, s_.C() );
      }
    };
    
    int main()
    {
       saru::TestLogger logger;
       SARU_TEST( Fixture:: test_A_is_B, logger );
       SARU_TEST( Fixture:: test_C_is_7, logger );
       logger.printSummary();
       return logger.allOK()?0:1;
    }
    

    或者,如果您不喜欢它的 C++ 头文件的工作方式,它应该能够以最小的难度与其他单元测试库集成。

    但它也会运行用 PHP 和 python 编写的测试。 因此,您可以使用 saru 设置完整的功能测试。或者你可以在你的代码上运行类似 lint 的东西作为测试套件的一部分。

    【讨论】:

      【解决方案6】:

      这是一个最小的 C++ 单元测试库: https://github.com/vahidk/minimal-cpp-test

      它的语法与 Google 测试库非常相似,但它只是一个标头库,因此更容易跨平台移植。

      这是一个最小的单元测试:

      #define DEFINE_TEST_MAIN    
      #include "test.h"
      TEST(GroupName, TestName) {
        EXPECT_EQ(1 + 2, 3);
      }
      

      还有一个最小的夹具:

      class ClassName : public cyrus:Test {
      public:
        void Setup() override { 
          x = 5;
        }
        int x;
      }
      
      Test_F(ClassName, Test1) {
        EXPECT_EQ(x, 5);
      }
      

      希望这会有所帮助。

      【讨论】:

      • 链接给出404
      【解决方案7】:

      这里是一个单独的头文件,只包含 C++ 单元测试的解决方案: https://gitlab.com/cppocl/unit_test_framework

      在这里使用它的简单示例,但它也有固定装置(设置和拆卸),内存泄漏测试失败,性能测试失败(我在其他任何地方都没有看到这个功能)。

      #include "test/Test.hpp"
      
      TEST(MyTest)
      {
          int a = 1;
          int b = 2;
          CHECK_EQUAL(a + b, 3);
      }
      

      【讨论】:

        【解决方案8】:

        这是单元测试库的列表。

        http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C.2B.2B

        不过,据我所知,cppunit 是最受欢迎的。

        【讨论】:

          猜你喜欢
          • 2010-09-09
          • 1970-01-01
          • 2014-03-20
          • 2011-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-16
          相关资源
          最近更新 更多