Jak*_*old 6 c++ testing unit-testing
我将用C++为学校项目编写一个非常大的应用程序.到目前为止,我已经习惯使用JUnit和RSpec在Java和Ruby中使用TDD.
但就我的经验而言,我从未见过任何测试套件的C/C++项目.
您建议在C++中使用哪个库进行测试?
C++有什么好的模拟/存根框架吗?
实际上我正在使用NetBeans IDE,似乎不支持任何测试.
您会在C++中为TDD推荐什么工具?
TDD甚至可以用C++实现吗?编译时似乎是一个很大的缺点.
C++有很多单元测试框架.我最有经验的是CppUnit和CxxTest.我更喜欢CxxTest,因为我发现更容易不必明确注册我的测试用例,因为你必须使用CppUnit.有一个用于CxxTest的eclipse插件,但我不知道是否有一个用于NetBeans的插件.编写时间不应该是编写良好的C++的问题,并且绝对不是跳过单元测试/ tdd的理由.
对于验收测试,我使用过精确度.这是一个基于java的工具,但在C++环境中使用并不困难.
我们使用Google Test Framework.我们不会在开发人员机器上的每个编译上运行测试.这是构建服务器的工作.
小智 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/
| 归档时间: |
|
| 查看次数: |
13949 次 |
| 最近记录: |