我正在尝试开始单元测试。我正在研究一些C++框架,并想尝试一下Boost.Test。文档看起来非常详尽,而且有点让人不知所措,特别是那些刚接触单元测试的人。所以这是我想要的情形:
假设我有两个类,Foo和Bar。我想为Foo和Bar编写一套测试,最好是在不同的文件中。我只想在使用命令行参数运行程序的情况下运行测试。所以我的main()应该看起来像这样:
int main(int argc, const char* argv[])
{
if (argc == 1 && strcmp(argv[0], "-test") == 0)
run_all_tests();
else
return program_main(argc, argv);
}我认为test_foo.cpp应该是这样的:
#include "foo.hpp"
#define BOOST_TEST_MODULE Foo test
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_SUITE( Foo_Test )
BOOST_AUTO_TEST_CASE( Foo1 )
{
Foo f;
BOOST_CHECK( f.isValid() );
}
BOOST_AUTO_TEST_CASE( Foo2 )
{
Foo f;
BOOST_CHECK( f.baz() == 5 );
}
BOOST_AUTO_TEST_SUITE_END()但是,我不知道(1)运行测试的实际命令是什么,以及(2)如何实际告诉库我想要运行每个测试。
那么,谁有使用Boost.Test的经验呢?有人能以详细的方式提供帮助吗?非常感谢。
发布于 2009-06-08 09:20:46
BOOST.Test非常灵活,你可以做任何你想做的事情。但是,既然您说您是单元测试的新手,那么您可能应该遵循标准的单元测试结构。
这就是说,对于您正在进行单元测试的每个项目,都要有一个单独的测试项目。然后包含构建测试项目所需的源代码和库。
这是更干净的,因为在您的主项目中没有可能意外运行的测试逻辑,并且很容易运行测试,因为它们有自己的可执行文件。这种方法也适用于测试库。如果您遵循这种结构,您会发现大多数BOOST.Test默认设置都是开箱即用的,您只需担心编写测试和代码即可。
发布于 2009-06-08 08:26:28
在您的test_foo.cpp中,宏将测试套件和测试用例添加到全局列表中:master_testsuite,它是所有测试节点的根。你只需要编译所有的测试文件,如test_foo.cpp,test_boo.cpp和一个运行器,然后将它们链接到可执行文件中。
函数unit_test_main用于在master_testsuite中运行测试。
boost::unit_test::unit_test_main(
&init_unit_test,
argc,
argv
)基于您在包含<boost/test/unit_test.h>之前定义的宏,Boost.Test可能已经为您生成了main函数。1生成的main只需在main中使用argc和argv调用unit_test_main。推荐使用unit_test_main,因为它可以处理一些控制台参数,比如run test by name。
unit_test_main的第一个参数是钩子。根据BOOST_TEST_ALTERNATIVE_INIT_API的不同,它有不同的定义。
#ifdef BOOST_TEST_ALTERNATIVE_INIT_API
typedef bool (*init_unit_test_func)();
#else
typedef test_suite* (*init_unit_test_func)( int, char* [] );
#endif您可以在钩子中自定义master_testsuite。在第二种形式中,返回值是新的主测试套件。
如果定义了BOOST_TEST_MAIN和BOOST_TEST_MAIN,但未定义BOOST_TEST_NO_MAIN,则为1。
发布于 2009-06-08 11:07:49
你可以从一个菜单命令开始测试,但它并不是那么简单,遗憾的是没有很好的文档。更可悲的是,不可能传递要创建日志文件的路径。我不得不自己添加这样一个命令行选项。不幸的是,我还没有提交它。我的代码如下所示:
#ifdef DEBUG
#undef main
#define BOOST_TEST_MAIN
#include <boost/test/included/unit_test.hpp>
int DoUnitTests()
{
char *args[] = {"", "--log_level=all", "--auto_start_dbg=yes"};
bool result = ::boost::unit_test::unit_test_main(&init_unit_test_suite, sizeof(args) / sizeof(char*), args);
MessageDlog("Unittests result: %s", result ? "ERRORS in Unittests" : "Goooood!");
return result;
}
#else
int DoUnitTests()
{
}
#endifhttps://stackoverflow.com/questions/963158
复制相似问题