用C C++测试代码

Tim*_*Tim 15 c c++ testing

我不知道你们每次编写代码以及不同级别的测试时如何测试代码:单元测试,集成测试,......

例如,对于刚编写的函数的单元测试,你是否编写了另一组main函数和Makefile来测试它?或者您是否修改项目的主要功能以测试功能.或者你只是在调试下运行你的项目,并停止调用函数的位置并修改其参数的值?

我相信一定有一些方便和常见的方式,大多数人都在使用,只有我不知道.

Bug*_*boy 9

测试驱动开发(TDD)的方法是首先编写测试,看它默认失败(即新测试成功失败),然后编写函数以通过测试.

通过这种方式,测试不是事后的想法,而是您的开发方法的核心.

因为您可能在实现其运行的对象之前开发函数(方法),所以大多数TDD框架还提供了生成"模拟"对象的工具,这些对象将在实际实现类之前返回预期结果.

我个人推荐Google TestGoogle Mock.


小智 7

比较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/


Adr*_*aan 3

xUnit 是一系列单元测试模块。x 被替换为所使用框架语言的字母。目前该家庭成员包括:

我曾使用 CppUnit 参与过项目,并取得了良好的结果。最近,我尝试将其集成到自动构建环境(即 Hudson)中,但遇到了许多障碍。

理想情况下,构建会自动构建并运行单元测试。在这种情况下,代码从测试环境运行(因此有它自己的主循环)。对我来说,一个额外的复杂因素是我使用嵌入式系统。printf 并不总是可行。我希望如果你在 PC 上运行,CUnit 和 CppUnit 可以帮助你实现良好的单元测试。请看如何使用结果;持续集成系统将大大提高您的效率。

另一个值得一看的框架是Maestra。它依赖于 C99(微软从未实现过,但对于 gcc 来说它很棒!)