C++中的单元和集成测试

Jak*_*old 6 c++ testing unit-testing

我将用C++为学校项目编写一个非常大的应用程序.到目前为止,我已经习惯使用JUnit和RSpec在Java和Ruby中使用TDD.

但就我的经验而言,我从未见过任何测试套件的C/C++项目.

您建议在C++中使用哪个库进行测试?
C++有什么好的模拟/存根框架吗?

实际上我正在使用NetBeans IDE,似乎不支持任何测试.
您会在C++中为TDD推荐什么工具?

TDD甚至可以用C++实现吗?编译时似乎是一个很大的缺点.

Geo*_*che 7

升压试题库让你的单元测试等.


Gle*_*len 5

C++有很多单元测试框架.我最有经验的是CppUnit和CxxTest.我更喜欢CxxTest,因为我发现更容易不必明确注册我的测试用例,因为你必须使用CppUnit.有一个用于CxxTest的eclipse插件,但我不知道是否有一个用于NetBeans的插件.编写时间不应该是编写良好的C++的问题,并且绝对不是跳过单元测试/ tdd的理由.

对于验收测试,我使用过精确度.这是一个基于java的工具,但在C++环境中使用并不困难.


Ser*_*bry 5

我们使用Google Test Framework.我们不会在开发人员机器上的每个编译上运行测试.这是构建服务器的工作.

  • @Tolli这取决于谁进行构建.如果是人类 - 没有测试,因为我们想要尽可能快的构建时间.如果它是构建服务器 - 则始终执行测试. (2认同)

小智 5

比较CppTest和CppUnit我会选择CppTest.CppTest具有较少的隐藏框架,IMO更易于理解和实现.我个人希望看到主要切入点.我还包括了Boost Unit Testing Framework.它不是基于xUnit的.我不是粉丝,但如果您已经在使用Boost Library,那么合并将会很不错.


CppTest与CppUnit

易于创建单元测试和测试套件.CppUnit和CppTest都创建了类方法的单元测试,类本身派生自一些工具提供的Test类.但是,CppTest的语法稍微简单一些,测试注册发生在类构造函数中.在CppUnit的情况下,需要额外的宏CPPUNIT_TEST_SUITE和CPPUNIT_TEST_SUITE_ENDS.

运行测试.CppTest只是在测试套件上调用run方法,而CppUnit使用一个单独的TestRunner类,调用其run方法来运行测试.

扩展测试层次结构.在CppTest的情况下,始终可以通过创建从旧的继承的新类来扩展先前的测试套件.新类将定义一些添加到单元测试池的附加功能.您只需在新类类型的对象上调用run方法.相反,CppUnit要求您使用宏CPPUNIT_TEST_SUB_SUITE以及类继承来实现相同的效果.

生成格式化输出.CppTest和CppUnit都能够自定义输出.但是,尽管CppTest有一个有用的,预定义的HTML输出格式化程序,但CppUnit却没有.但是,CppUnit专门支持XML格式化.两者都支持文本和编译器样式格式.

创建测试夹具.要使用测试夹具,CppUnit要求测试类派生自CppUnit :: TestFixture.您必须提供设置和拆卸例程的定义.对于CppTest,您需要仅为设置和拆除例程提供定义.这绝对是一个更好的解决方案,因为它使客户端代码保持简单.•预定义的实用程序宏支持.CppTest和CppUnit都有一组可比较的断言宏,处理浮点数等等.

头文件.CppTest要求您包含单个头文件,而CppUnit客户端代码必须包含多个头,如HelperMacros.h和TextTestRunner.h,具体取决于所使用的功能.

http://www.ibm.com/developerworks/aix/library/au-ctools3_ccptest/index.html?ca=drs-


CPPTEST

#include “cppTest.h”

class myTestWithFixtures : public Test::Suite { 
  void function1_to_test_some_code( );
  void function2_to_test_some_code( );

  public: 
  myTestWithFixtures ( ) { 
      TEST_ADD (function1_to_test_some_code) {...}; 
      TEST_ADD (function2_to_test_some_code) {...}; 
  } 

  protected: 
    virtual void setup( ) { ... };
    virtual void tear_down( ) { ... };
}; 

int main ( ) 
{ 
  myTestWithFixtures tests; 
  Test::TextOutput output(Test::TextOutput::Verbose);
  return tests.run(output);
} 
Run Code Online (Sandbox Code Playgroud)

http://www.ibm.com/developerworks/aix/library/au-ctools3_ccptest/index.html?ca=drs-


CppUnit的

#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TextTestRunner.h>
#include <cppunit/extensions/HelperMacros.h>

class mystringTest : public CppUnit::TestFixture {
public:
  void setUp() { ... };
  void tearDown() { ... };

  void function1_to_test_some_code() { ... };
  void function2_to_test_some_code() { ... };

  CPPUNIT_TEST_SUITE( mystringTest );
  CPPUNIT_TEST( function1_to_test_some_code );
  CPPUNIT_TEST( function2_to_test_some_code );
  CPPUNIT_TEST_SUITE_END();
};
CPPUNIT_TEST_SUITE_REGISTRATION( mystringTest );
Run Code Online (Sandbox Code Playgroud)

没有宏

int main ()
{
  CppUnit::TestSuite* suite = new CppUnit::TestSuite("mystringTest");
  suite->addTest(new CppUnit::TestCaller<mystringTest>("checkLength",
                &mystringTest::checkLength));
  suite->addTest(new CppUnit::TestCaller<mystringTest>("checkValue",
                &mystringTest::checkLength));

  // client code follows next 
  CppUnit::TextTestRunner runner;
  runner.addTest(suite);

  runner.run();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

http://www.ibm.com/developerworks/aix/library/au-ctools2_cppunit/


增强单元测试框架

#include <boost/test/unit_test.hpp>

using namespace std;

struct CMyFooTestFixture
{
    CMyFooTestFixture() { ... } //SetUp
    ~CMyFooTestFixture() { ... } //TearDown

    void function1_to_test_some_code(CMyFoo& foo) { ... };
    void function2_to_test_some_code(CMyFoo& foo) { ... };
}

BOOST_FIXTURE_TEST_SUITE(MyFooTest, CMyFooTestFixture);

BOOST_AUTO_TEST_CASE(function1_to_test_some_code)
{
    CMyFoo foo;
    function1_to_test_some_code(foo);
}

BOOST_AUTO_TEST_CASE(function1_to_test_some_code2)
{
    CMyFoo foo;
    function1_to_test_some_code(foo);
}

BOOST_AUTO_TEST_SUITE_END();
Run Code Online (Sandbox Code Playgroud)

http://www.beroux.com/english/articles/boost_unit_testing/