21

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

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

4

8 回答 8

23

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

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

于 2010-01-10T21:31:45.267 回答
23

我刚刚推出了我自己的框架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 值。

于 2010-12-28T03:18:08.237 回答
6

谷歌测试框架是一种替代方案。

这是文档中的一个简单示例:

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

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

于 2010-01-10T21:34:13.673 回答
2

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

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

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

于 2010-01-11T06:11:07.547 回答
2

我为自己的代码开发人员创建了一个名为 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 的东西作为测试套件的一部分。

于 2010-01-11T08:35:32.063 回答
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);
}

希望这可以帮助。

于 2015-03-02T22:16:16.510 回答
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);
}
于 2018-06-05T21:36:23.267 回答
0

这是单元测试库的列表。

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

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

于 2010-01-10T21:31:58.987 回答