rlb*_*ond 11 c++ boost unit-testing
我正在尝试开始单元测试.我正在寻找一些C++框架,并想尝试Boost.Test.文档看起来非常彻底,而且有点压倒性,尤其是新的单元测试人员.所以这是我想要的情况:
假设我有2个课程,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);
}
Run Code Online (Sandbox Code Playgroud)
我想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()
Run Code Online (Sandbox Code Playgroud)
但是,我不知道(1)运行测试的实际命令是什么,以及(2)如何实际告诉库我想要运行每个测试.
那么,谁有Boost.Test的经验?有人可以详细帮助吗?非常感谢.
小智 12
在您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
)
Run Code Online (Sandbox Code Playgroud)
根据您之前定义的宏
<boost/test/unit_test.h>,Boost.Test可能已经main
为您生成了函数.[1] 生成的main简单调用
unit_test_mainwith argc和argvin main.建议使用unit_test_main它,因为它可以处理一些控制台参数,例如按名称运行测试.
第一个参数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
Run Code Online (Sandbox Code Playgroud)
你可以自定义master_testsuite钩子.在第二种形式中,返回的值是新的主测试套件.
[1],如果BOOST_TEST_MAIN和BOOST_TEST_MAIN被定义,但
BOOST_TEST_NO_MAIN并非如此.
您可以从菜单命令开始测试,但这并不是那么简单,遗憾的是没有详细记录.更难过 - 它无法通过创建日志文件的路径.我必须自己添加这样一个命令行选项.不幸的是我尚未提交.我的代码看起来像这样:
#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()
{
}
#endif
Run Code Online (Sandbox Code Playgroud)
BOOST.Test 非常灵活,您可能可以做您想做的事情。但是,既然您说您是单元测试的新手,那么您可能应该遵循标准的单元测试结构。
这是为您正在单元测试的每个项目都有一个单独的测试项目。然后包含构建测试项目所需的源和库。
这更干净,因为主项目中没有可能意外运行的测试逻辑,并且很容易运行测试,因为它们有自己的可执行文件。这种方法也适用于测试库。如果您遵循此结构,您会发现大多数 BOOST.Test 默认值都是开箱即用的,您只需编写测试和代码即可。
| 归档时间: |
|
| 查看次数: |
11305 次 |
| 最近记录: |