C ++单元测试库

时间:2010-01-10 21:28:53

标签: c++ unit-testing cppunit

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

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

8 个答案:

答案 0 :(得分:21)

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

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

答案 1 :(得分:21)

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

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

它还具有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值。

答案 2 :(得分:6)

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));
}

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

答案 3 :(得分:2)

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

Tut曾经很轻,只有一个标题,但最新版本引入了一个库。

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

答案 4 :(得分:2)

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

  1. 我不喜欢将所有测试编译成一个二进制文件。我的理由是,如果编译失败,所有测试都失败,如果一个测试未定义,则程序输出未定义。
  2. 我希望控制运行的测试。我希望能够对测试进行分组并运行子集。
  3. 我希望将测试的编译失败报告为测试失败,并且不要暂停所有运行的测试。
  4. 我希望能够运行多种不同语言的测试
  5. 我想要一个足够灵活的系统,我可以在valgrind下运行特定的测试(尚未在saru :()
  6. 所以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和PHP编写的测试。蟒蛇。 所以你可以用saru设置全功能测试。或者,您可以在代码中运行类似于lint的内容作为测试套件的一部分。

答案 5 :(得分:1)

这是一个最小的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);
}

希望这有帮助。

答案 6 :(得分:1)

这是一个单独的头文件,仅包含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);
}

答案 7 :(得分:0)

以下是单元测试库的列表。

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

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