2010-01-10 125 views
14

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

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

+0

你想支持模拟对象吗? –

+1

相关:http://stackoverflow.com/questions/91384/unit-testing-for-c-code-tools-and-methodology http://stackoverflow.com/questions/13699/choosing-ac-unit-testing-工具框架http://stackoverflow.com/questions/3150/how-to-set-up-unit-testing-for-visual-studio-c http://stackoverflow.com/questions/387272/unit-testing- in-c和可能其他 –

+2

重复http://stackoverflow.com/questions/242926/comparison-of-c-unit-test-frameworks – dmckee

回答

18

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

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

+0

+1酷,我不知道这些存在。 –

+0

只是好奇,做Eclipse和哈德森的“胜利”谷歌? – Mawg

+0

它能够将输出写入xml文件,遵循与JUnit具有相同架构的标记--gtest_output =“xml:_path_to_output_file_”。它适用于Windows,Mac和Ubuntu上的hudson。我不能说日食,虽然我们不使用它。 –

5

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

下面是从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,谷歌的模拟框架,很好地发挥了C++

+0

我给出了一个例子,说明如何在我的答案中在我自己的框架CATCH中编写这些测试的等价物。 – philsquared

1

CppUnit的可能是对C的第一单元测试框架++。它是着名的Java框架Junit的直接端口。这使得从Junit过渡起来更容易,但是以一个有点沉重的框架为代价,它没有利用C++的能力,比如RAII。这就是为什么轻量级版本如CppUnitLite,NanoCppUnit已经创建的原因。除此之外,CppUnit2应该改进这一点。

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

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

1

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

  1. 我不喜欢我的所有测试编译成一个二进制文件。我的原因是,如果编译失败,所有测试失败,如果一个测试未定义行为,则程序输出未定义。
  2. 我想控制什么样的测试运行。我希望能够对测试进行分组并运行子集。
  3. 我希望编译失败的测试报告为测试失败,并且不会暂停所有测试运行。
  4. 我希望能够从多个不同的语言运行测试
  5. 我想足够灵活,我可以运行在Valgrind的特定测试(尚未萨鲁法尔:()

所以萨鲁解决大部分的系统这些功能。 它的重点是能够运行一套写在 不同的语言。用最少的试验规模测试。下面是最小的(失败的)C++测试

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

所有萨鲁法尔真正关心阿布t是编译的二进制文件的返回值。 然后它分析输出以确定哪些测试失败等等。它有头,以与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++头工作,它应该能够与最小的困难等单元测试库集成的方式。

但它也会运行python编写的PHP &测试。 所以你可以用saru进行全功能测试。或者你可以在你的代码上运行一些像lint一样的测试套件。

16

我刚推出我自己的框架,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值independentaly记录。

+3

[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)看看两者有什么不同 – onqtam

0

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

它具有非常相似的语法来谷歌测试库,但它只是库,所以跨平台更容易端口头。

这里有一个最小的单元测试:

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

希望这有助于。