我知道关于C++单元测试框架的建议已经存在一些问题,但所有答案都没有帮助,因为他们只是推荐其中一个框架,但没有提供有关(特征)比较的任何信息.
我认为最有趣的框架是CppUnit,Boost和新的Google测试框架.有人做过任何比较吗?
我正在尝试构建我的项目以包含生产源(在src子文件夹中)和测试(在test子文件夹中).我正在使用CMake来构建它.作为一个最小的例子,我有以下文件:
的CMakeLists.txt:
cmake_minimum_required (VERSION 2.8)
project (TEST)
add_subdirectory (src)
add_subdirectory (test)
Run Code Online (Sandbox Code Playgroud)
SRC /的CMakeLists.txt:
add_executable (demo main.cpp sqr.cpp)
Run Code Online (Sandbox Code Playgroud)
SRC/sqr.h
#ifndef SQR_H
#define SQR_H
double sqr(double);
#endif // SQR_H
Run Code Online (Sandbox Code Playgroud)
SRC/sqr.cpp
#include "sqr.h"
double sqr(double x) { return x*x; }
Run Code Online (Sandbox Code Playgroud)
src/main.cpp - 使用sqr,并不重要
测试/的CMakeLists.txt:
find_package(Boost COMPONENTS system filesystem unit_test_framework REQUIRED)
include_directories (${TEST_SOURCE_DIR}/src)
ADD_DEFINITIONS(-DBOOST_TEST_DYN_LINK)
add_executable (test test.cpp ${TEST_SOURCE_DIR}/src/sqr.cpp)
target_link_libraries(test
${Boost_FILESYSTEM_LIBRARY}
${Boost_SYSTEM_LIBRARY}
${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
)
enable_testing()
add_test(MyTest test)
Run Code Online (Sandbox Code Playgroud)
测试/ TEST.CPP:
#define BOOST_TEST_MODULE SqrTests
#include <boost/test/unit_test.hpp>
#include "sqr.h"
BOOST_AUTO_TEST_CASE(FailTest)
{
BOOST_CHECK_EQUAL(5, sqr(2));
} …Run Code Online (Sandbox Code Playgroud) 我们使用Visual Studio 2008开发C++应用程序,并使用Boost.Test进行单元测试.目前,我们有一个单独的解决方案,其中包含我们的单元测试.
我们在核心解决方案中的许多项目都会产生DLL.我们的测试覆盖范围有限,因为我们无法测试非导出类.
我有两个关于如何测试它们的想法:
我不完全确定会有什么缺点.上面的数字1打破了模块级封装,数字2可能导致更大的DLL,除非可能只在某些配置中包含测试代码.
那么,上述方法有任何严重的缺点,还是你能想到其他解决方案?
我有一个Boost单元测试用例,它会导致被测对象抛出异常(这是测试,导致异常).如何在测试中指定期望该特定异常.
我可以通过使用BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES来指定测试应该有一定数量的失败,但这似乎是非特定的.我希望能够在测试中的特定点说出应该抛出异常并且不应将其视为失败.
我使用Boost Test框架对我的C++代码进行单元测试,并想知道是否可以测试函数是否会断言?是的,听起来有点奇怪,但请忍受我!我的许多函数在输入时检查输入参数,断言它们是否无效,并且测试它是有用的.例如:
void MyFunction(int param)
{
assert(param > 0); // param cannot be less than 1
...
}
Run Code Online (Sandbox Code Playgroud)
我希望能够做到这样的事情:
BOOST_CHECK_ASSERT(MyFunction(0), true);
BOOST_CHECK_ASSERT(MyFunction(-1), true);
BOOST_CHECK_ASSERT(MyFunction(1), false);
...
Run Code Online (Sandbox Code Playgroud)
你可以检查使用Boost测试抛出的异常,所以我想知道是否还有一些断言魔法......
我在这个领域做了一些谷歌搜索,发现了许多关于让Jenkins了解boost.test的XML输出格式的讨论,但没有规范的参考.
有人说我们只需要使用XLST来转换XML格式,其他人则建议XML在此之前需要一些黑客攻击(任何人都有一个XSL将Boost.Test XML日志转换为可呈现的格式?).有人建议xUnit插件可以原生地理解boost.test XML格式,其他人声明它不能
因为我的搜索结果是5年,所以我意识到事情可能会发生变化.所以我正在寻找关于使用Jenkins运行和评估增强单元测试的最佳方法的最新答案.
我想Boost test在我的项目中使用.
我在我的项目中使用cmake所以我写了一个简单CMakeList.txt的包装它:
find_package (Boost COMPONENTS unit_test_framework REQUIRED)
file(GLOB_RECURSE UnitTests_sources tests/*.cpp)
add_executable(UnitTests
${UnitTests_sources}
)
enable_testing()
ADD_TEST (UnitTests UnitTests)
Run Code Online (Sandbox Code Playgroud)
所以,cmake在这里工作得很好.编译过程中出现问题:
链接CXX可执行文件../../bin/UnitTests
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/../../../../lib/crt1.o:在函数
_start': (.text+0x20): undefined reference tomain中'collect2:ld返回1退出状态
这是tests文件夹(LogManagerTest.cpp)中唯一的文件:
#include "Utils/LogManager.hpp"
#include <boost/test/unit_test.hpp>
#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MAIN
#define BOOST_TEST_MODULE LogManager
BOOST_AUTO_TEST_CASE(LogManagerCase)
{
BOOST_REQUIRE(true);
/*LogManager manager;
manager.Initialize();
manager.Deinitialize();*/
}
Run Code Online (Sandbox Code Playgroud)
这有什么不对?
我的项目使用CMake作为其构建系统,我希望它能够执行我的Boost.Test测试用例.
我怎样才能做到这一点?在Boost.Build中,我可以这样做:
import testing ;
use-project /my_lib : ../src ;
unit-test my_test
: my_test.cpp
/my_lib
boost_unit_test_framework
;
lib boost_unit_test_framework ;
Run Code Online (Sandbox Code Playgroud) 我一直在使用CppUnit已经有一段时间了(我很满意).当我们使用boost库的越来越多的部分时,我对boost.test进行了简短介绍,现在我想知道是否应该在新项目中切换到boost.test.
谁能在这里告诉我两个框架之间的差异以及使用boost.test的好处(如果有的话)?
我有一个测试用例,我想为不同的数据库状态执行.我将对象插入到夹具中的DB(我想保持这种方式).我想为数据库中的不同配置创建DB虚拟化和专用夹具的初始化方法.
我能想到的一种方法是做一些事情:
void doTest(){
//test code here
}
BOOST_FIXTURE_TEST_CASE(test1, fixture1)
{
doTest();
}
BOOST_FIXTURE_TEST_CASE(test2, fixture2)
{
doTest();
}
BOOST_FIXTURE_TEST_CASE(test3, fixture3)
{
doTest();
}
Run Code Online (Sandbox Code Playgroud)
但是有更清洁,更整洁的方式吗?或许我不应该完全这样做?我将非常感谢测试专家给出的任何建议.
boost-test ×10
c++ ×10
boost ×6
unit-testing ×6
cmake ×2
cppunit ×2
assert ×1
exception ×1
fixtures ×1
googletest ×1
jenkins ×1
linker ×1
mt ×1