我正在尝试开始单元测试。我正在寻找一些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);
}
我认为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的经验?有人可以详细帮助吗?非常感谢你。
答案 0 :(得分: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
)
基于您之前定义的宏,包括
<boost/test/unit_test.h>
, Boost.Test 可能已生成main
适合你。[1]生成的main
只是被调用
unit_test_main
argc
argv
和main
unit_test_main
。这是推荐的
使用unit_test_main
因为它可以处理一些控制台参数,
比如run test by name。
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
。在第二
表单,返回的值是新的主测试套件。
[1]如果定义了BOOST_TEST_MAIN
和BOOST_TEST_NO_MAIN
,但是
{{1}}不是。
答案 1 :(得分:5)
您可以从菜单命令开始测试,但这并不是那么简单,遗憾的是没有详细记录。更难过 - 它无法通过创建日志文件的路径。我必须自己添加这样一个命令行选项。不幸的是我尚未提交。我的代码如下所示:
#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
答案 2 :(得分:3)
BOOST.Test非常灵活,你可以做你想做的事。但是,既然您说您不熟悉单元测试,那么您应该遵循标准的单元测试结构。
这是为您进行单元测试的每个项目都有一个单独的测试项目。然后包括构建测试项目所需的源和库。
这很干净,因为主项目中没有可能会意外运行的测试逻辑,并且很容易运行测试,因为它们有自己的可执行文件。这种方法也适用于测试库。如果你遵循这个结构,你会发现大多数BOOST.Test默认设置是开箱即用的,你可以担心编写测试和代码。
答案 3 :(得分:0)
在NUnit中没有独立的测试运行器
您只需将测试用例构建为单个.exe应用程序(如果您使用的是Windows)并运行它
答案 4 :(得分:0)
尝试我写的这个脚本,给定一个程序名和类列表将为每个类/模块生成makefile,项目框架和测试套件框架。它还设置了所有内容,以便每个类的测试套件可以单独运行,也可以作为一体化全局套件的一部分运行。
这是致电makeSimple,可在sourceforge上找到。