我正在使用Boost Test来测试一些C++代码.
我有一个值的向量,我需要与预期的结果进行比较,但我不想手动检查循环中的值:
BOOST_REQUIRE_EQUAL(values.size(), expected.size());
for( int i = 0; i < size; ++i )
{
BOOST_CHECK_EQUAL(values[i], expected[i]);
}
Run Code Online (Sandbox Code Playgroud)
主要问题是循环检查不会打印索引,因此需要进行一些搜索才能找到不匹配.
我可以使用std::equal或std::mismatch在两个向量上,但这也需要很多样板.
有更清洁的方法吗?
我正在通过Boost单元测试框架摸索,并建立了一个基本的功能单元测试.我正在使用BOOST_TEST_MESSAGE,让用户知道哪些测试正在运行,但消息不会显示在屏幕上.例如:
#define BOOST_TEST_MODULE MyTest
#include <boost/test/included/unit_test.hpp>
BOOST_FIXTURE_TEST_SUITE(MyTestSuite, MyTestFixture)
BOOST_AUTO_TEST_CASE(MessageTest)
{
BOOST_TEST_MESSAGE( "no one sees this!" );
}
BOOST_AUTO_TEST_SUITE_END();
Run Code Online (Sandbox Code Playgroud)
我试过定义BOOST_TEST_LOG_LEVEL,all但这没有效果.我从Boost日志级参数页面得到了这个想法,但我认为日志的概念可能与屏幕上实际显示的内容无关.有任何想法吗?
在启用所有日志记录(例如test --log_level=all)的情况下执行时,使用Boost Unit Test Framework创建的单元测试将报告单个测试用例使用如下消息所花费的时间:
Leaving test case "testRecursiveSchedule"; testing time: 2196mks
Run Code Online (Sandbox Code Playgroud)
在那里展示的单位,mks,使我神秘.据我所知,Meters-Kilograms-Seconds是一个公制测量系统,但Boost显然只显示时间测量.不应该在这种情况下,单位是毫秒,如果毫秒或微秒(或者我们)如果微秒?是MKS通常理解为微秒的缩写?
请注意,根据Boost单元测试框架源代码,如果经过的时间恰好可被1000整除,则显示的单位将为ms,在这种情况下,在显示之前将除以1000.这与mks意味着微秒的观点是一致的.
但是呢?或者Boost在这里是特殊的?
time boost unit-testing units-of-measurement boost-unit-test-framework
我正在维护一个autoconf软件包,并希望集成自动测试.我使用Boost Unit Test Framework我的单元测试,并能够成功地将其集成到包中.
也就是说它可以通过编译make check,但是没有运行(尽管我读过它们make check都编译并运行测试).结果,我必须在构建繁琐的测试后手动运行它.
Makefile.am 在test文件夹中看起来像这样:
check_PROGRAMS = prog_test
prog_test_SOURCES = test_main.cpp ../src/class1.cpp class1_test.cpp class2.cpp ../src/class2_test.cpp ../src/class3.cpp ../src/class4.cpp
prog_test_LDADD = $(BOOST_FILESYSTEM_LIB) $(BOOST_SYSTEM_LIB) $(BOOST_UNIT_TEST_FRAMEWORK_LIB)
Run Code Online (Sandbox Code Playgroud)
Makefile.am 在根文件夹中:
SUBDIRS = src test
dist_doc_DATA = README
ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS} -I m4
Run Code Online (Sandbox Code Playgroud)
运行test/prog产生输出:
Running 4 test cases...
*** No errors detected
Run Code Online (Sandbox Code Playgroud)
(我不认为你需要我的测试用例的内容才能回答我的问题,所以我现在省略了它们)
那么我怎样才能automake在每次跑步时运行我的测试make check?
automake autoconf unit-testing makefile boost-unit-test-framework
我正在尝试使用Boost的单元测试框架构建单元测试.我想动态地将测试套件库与Boost提供的自动生成的测试模块链接起来.这是我一直在使用的基本结构:
test_main.cpp:
#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
Run Code Online (Sandbox Code Playgroud)
lib_case.cpp:
#define BOOST_TEST_DYN_LINK
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_SUITE( test_lib )
BOOST_AUTO_TEST_CASE( test_lib_case ) {
BOOST_ASSERT(true);
}
BOOST_AUTO_TEST_SUITE_END()
Run Code Online (Sandbox Code Playgroud)
Makefile文件:
all: unittest unittest2 unittest3
lib_case.o: lib_case.cpp
g++ -g -c -Wall -fPIC lib_case.cpp -o lib_case.o
libcase.so: lib_case.o
g++ -shared -Wl,-soname,libcase.so -o libcase.so lib_case.o
unittest: libcase.so
g++ -o unittest test_main.cpp -L. -lcase -lboost_unit_test_framework
unittest2: test_main.cpp lib_case.cpp
g++ -o unittest2 test_main.cpp lib_case.cpp -lboost_unit_test_framework
unittest3: lib_case.o
g++ -o unittest3 test_main.cpp lib_case.o -lboost_unit_test_framework
Run Code Online (Sandbox Code Playgroud)
在Ubuntu 14.04上进行测试,所有可执行文件都可以编译和链接而不会出错.
'unittest'无法执行'test_lib'套件声称安装失败,但'unittest2'和'unittest3'成功:
$./unittest
Test setup error: test …Run Code Online (Sandbox Code Playgroud) c++ ubuntu singleton dynamic-linking boost-unit-test-framework
我的应用程序中有一些日志记录(碰巧是log4cxx,但是我很灵活),并且我使用Boost单元测试框架进行了一些单元测试。运行单元测试时,无论通过测试还是失败测试,我都会得到很多日志输出(不仅是增强的断言记录,还有我自己的应用程序代码的调试日志记录)。我想获得单元测试框架,以在通过的测试中丢弃日志,并从失败的测试中输出日志(我逐渐意识到使用python / nose时的这种行为)。
使用Boost单元测试框架有某种标准的方法吗?如果没有,我是否可以使用一些测试开始/测试挂钩结束来缓冲我的日志并有条件地输出它们以自己实现此行为?
所以,我已经开始使用升压单元测试了.当我尝试构建一个创建类实例的简单测试时,我得到一个编译错误.没有该类的实例它工作正常.
编译错误消息是:
/src/test/WTFomgFail_test.cpp: In member function ‘void WTFomgFail::defaultConstructor::test_method()’:
/src/test/WTFomgFail_test.cpp:20: error: expected primary-expression before ‘obj’
/src/test/WTFomgFail_test.cpp:20: error: expected `;' before ‘obj’
Run Code Online (Sandbox Code Playgroud)
#include "WTFomgFail.hpp"
#define BOOST_TEST_MODULE WTFomgFail
#define BOOST_TEST_MAIN
#define BOOST_TEST_DYN_LINK
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_SUITE(WTFomgFail)
BOOST_AUTO_TEST_CASE( defaultConstructor )
{
WTFomgFail obj = WTFomgFail();
BOOST_MESSAGE("wow, you did it");
}
BOOST_AUTO_TEST_SUITE_END()
Run Code Online (Sandbox Code Playgroud)
#ifndef WTFOMGFAIL_HPP_
#define WTFOMGFAIL_HPP_
class WTFomgFail
{
public:
WTFomgFail();
~WTFomgFail();
};
#endif /* WTFOMGFAIL_HPP_ */
Run Code Online (Sandbox Code Playgroud)
#include "WTFomgFail.hpp"
WTFomgFail::WTFomgFail()
{
}
WTFomgFail::~WTFomgFail()
{
}
Run Code Online (Sandbox Code Playgroud)
如果我换成BOOST_AUTO_TEST_SUITE(WTFomgFail)其他东西,那么错误就会消失BOOST_AUTO_TEST_SUITE(OMGreally).
此外,我不使用时得到的错误#define BOOST_TEST_MODULE …
boost ×5
c++ ×5
unit-testing ×4
autoconf ×1
automake ×1
boost-test ×1
makefile ×1
singleton ×1
time ×1
ubuntu ×1