我使用该框架的CppUnit来测试我的课,我想知道,如果这些方法TestFixture::setUp()和TestFixture::tearDown()被调用一次TEST_SUITE或他们被称为每种方法加入到这一套件
我正在使用CMake开发一个项目,并且只是集成了一些CppUnit测试.我想使用CTest,因此我在我的CMakeLists.txt文件中使用了add_test来在输入时执行测试make test.然而我观察到,在输入时make test,它表示即使我用微不足道的错误进行测试,所有测试都会通过.手动执行时(例如./my_test),错误的测试会报告这些错误,但在执行时不会报告make test.
以下是测试目录中我的CMakeLists.txt的内容:
add_executable(TestDataSpace TestDataSpace.cpp)
target_link_libraries(TestDataSpace ${DEP_LIBRARIES} ${CPPUNIT_LIBRARIES})
add_executable(TestVariableManager TestVariableManager.cpp)
target_link_libraries(TestVariableManager ${DEP_LIBRARIES} ${CPPUNIT_LIBRARIES})
add_executable(TestLayoutManager TestLayoutManager.cpp)
target_link_libraries(TestLayoutManager ${DEP_LIBRARIES} ${CPPUNIT_LIBRARIES})
add_test(NAME "TestDataSpace" COMMAND ${MY_PROJECT_SOURCE_DIR}/test/TestDataSpace)
add_test(NAME "TestVariableManager" COMMAND ${MY_PROJECT_SOURCE_DIR}/test/TestVariableManager)
add_test(NAME "TestLayoutManager" COMMAND ${MY_PROJECT_SOURCE_DIR}/test/TestLayoutManager)
Run Code Online (Sandbox Code Playgroud)
CTest确实找到了可执行文件,因为为命令设置了错误的路径会让CMake抱怨它找不到它们.
make test 输出以下内容:
运行测试...测试项目
Run Code Online (Sandbox Code Playgroud)Start 1: TestDataSpace 1/3 Test #1: TestDataSpace .................... Passed 0.01 sec Start 2: TestVariableManager 2/3 Test #2: TestVariableManager .............. Passed 0.02 sec Start 3: TestLayoutManager 3/3 Test #3: TestLayoutManager ................ Passed 0.01 sec100%测试通过,0测试失败3
我错过了什么?
CPPUnit是否有任何功能可以让我做出printf风格的断言?例如:
CPPUNIT_ASSERT("Actual size: %d", p->GetSize(), p->GetSize() == 0);
Run Code Online (Sandbox Code Playgroud)
我知道这不是一个有效的CPPUNIT_ASSERT - 我只是以此为例.
我发现CPPUNIT_ASSERT_MESSAGE(message,condition)哪个接受一个字符串,然后条件来评估,但没有运气将值输入断言.
我知道Java的单元测试非常简单.我们只需要使用JUnit并运行测试类作为JUnit测试.
现在我正在使用C++,我找到了一个测试库:cppunit.
似乎我需要使用特定功能运行我的测试main.但是,一个cpp项目只能有一个main.
我该怎么办?当我进行测试和运行项目时,我必须切换主电源?
我正在寻找适合我要求的测试框架.以下是我在自动化测试期间需要执行的步骤:
除此之外,我还希望有一些智能来确保.cc文件是否已更改,所有可以验证更改的测试都应该运行.
我正在评估PyUnit,cppunit与scons为此.考虑运行这个问题以确保我的方向正确.你能建议任何其他测试框架工具吗?选择正确的测试框架应该考虑哪些其他要求?
我正在使用CPPUNIT为我的C++程序进行单元测试
对于非void函数,假设存在函数add()
int add(int num1 , int num2)
{
return num1+num2;
}
Run Code Online (Sandbox Code Playgroud)
我可以像这样进行单元测试
void newtestclass::add()
{
int result = add(2,3);
CPP_ASSERT(result == 5 );
}
Run Code Online (Sandbox Code Playgroud)
当我尝试对非void函数进行单元测试时遇到问题
void printmenu()
{
cout<<"1) Option A"
<<endl
<<"2) Option B";
}
Run Code Online (Sandbox Code Playgroud)
我如何对这些功能进行单元测试,以确保100%的代码覆盖率
我还遇到了嵌套在其他函数中的函数的单元测试问题
void menu_select(char x)
{
if ( x == 'a')
{
add();
}
else if ( x == 'b' )
{
subtract();
}
}
void menu()
{
char choice;
cout<<"a) Add "
<<endl
<<"b) Subtract";
cin>>choice;
menu_select(choice);
}
Run Code Online (Sandbox Code Playgroud)
我如何对这些功能进行单元测试,以确保100%的代码覆盖率
我试图按照在 gnuradio 网站上构建信号处理块的教程进行操作:http : //gnuradio.org/redmine/projects/gnuradio/wiki/OutOfTreeModules。
但是,当涉及到需要我使用 CMake 的步骤时,终端抱怨说
package cppunit is not found checking for module 'cppunit'
-- package 'cppunit' not found
-- Could NOT find CPPUNIT (missing: CPPUNIT_INCLUDE_DIRS)
CMake Error at CMakeLists.txt:101 (message):
CppUnit required to compile howto
Run Code Online (Sandbox Code Playgroud)
我尝试过诸如sudo apt-get cppunit.
我正在尝试从源代码编译软件。在一个编译阶段,我需要导航包含 CppUnit 库(例如 /home/user/lib)和 CppUnit Includes(例如 /home/user/include)的目录。如何安装这些 CppUnit 并将它们导航到 ubuntu 14.04?
我正在编写一个机器人控制器类Controller,其中我为 4 个可控电机中的每一个使用一个Axis结构体。
对于每个测试,我想重置所有内容,因此我在类中创建了一个指针,在每个测试方法之前将其更改为新的控制器。初始化在 TEST_METHOD_INITIALIZE 中工作正常,但是一旦调用任何 TEST_METHOD,程序似乎会重置轴指针。
感谢您的帮助!
编辑:经过进一步分析,我得出的理论是,初始化的 Axis 对象 Axis init_mx 在方法完成后将被删除。
Edit2:我认为这是一个稍微复杂一点的问题,如下所示:Pointer to local variable in C++ 尽管如此,我没有找到一种方法来重置每个方法的 Axis 变量,而不实际重置其中的每个变量。
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
...
namespace UnitTest
{
TEST_CLASS(UnitTestController)
{
public:
Controller* controller;
struct Axis *mx, *my, *mz, *mg;
TEST_METHOD_INITIALIZE(methodName)
{
Axis init_mx(50), init_my(50), init_mz(50), init_mg(5);
mx = &init_mx;
my = &init_my;
mz = &init_mz;
mg = &init_mg;
Controller init_controller(mx, my, mz, mg);
controller = &init_controller;
Run Code Online (Sandbox Code Playgroud)
}
...
TEST_METHOD(id_3_next_mode)
{
mx->position = 5;
controller->getAxisPositionMx(); …Run Code Online (Sandbox Code Playgroud) I am new to CppUnit. Is there any way to assert that a value must be less than zero? I am looking for something with similar behavior to CPPUNIT_ASSERT_EQUAL(). I was thinking there might be a test function named something like CPPUNIT_ASSERT_LESS_THAN().
class Foo{
void operator=(const Foo&){};
public:
Foo(){};
};
Foo& fooRef(){
static Foo aFoo;
return aFoo;
}
int main() {
Foo &foo = fooRef();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码正常工作,不会发出任何错误.一旦我将主体改为:
int main(){
Foo &foo;
foo = fooRef();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器尝试使用operator=并因此抱怨.所以我的第一个问题是:它为什么会有所作为?
我来到这个事实的方式是我在做单元测试使用CPPunit,我一定要考有签名一个单独的类getInstance()是Singleton& getInstance().为了进行测试,我试图在TestSingleton类中单例初始化一个实例.因此有:
class TestSingleton{
...
private:
Singleton &instance;
};
void TestSingleton::setUp(){
this->instance = Singleton::getInstance();
}
Run Code Online (Sandbox Code Playgroud)
以上示例发出错误(因为operator=声明为私有,如果不是,则很明显我不会被调用).所以第二个问题是:我如何避免这种情况并在我的TestSingleton班级中获得单身实例?
我正在尝试使用CppUnit来测试一个只在第一次调用时才执行某些代码的方法.
class CElementParseInputTests: public CppUnit::TestFixture {
private:
CElement* element;
public:
void setUp() {
element = new CElement();
}
void tearDown() {
delete element;
}
void test1() {
unsigned int parsePosition = 0;
CPPUNIT_ASSERT_EQUAL(false, element->parseInput("fäil", parsePosition));
}
void test2() {
unsigned int parsePosition = 0;
CPPUNIT_ASSERT_EQUAL(false, element->parseInput("pass", parsePosition));
}
Run Code Online (Sandbox Code Playgroud)
我想测试的递归方法:
bool CElement::parseInput(const std::string& input, unsigned int& parsePosition) {
static bool checkedForNonASCII = false;
if(!checkedForNonASCII) {
std::cout << "this should be printed once for every test case" << std::endl;
[...]
checkedForNonASCII = …Run Code Online (Sandbox Code Playgroud) cppunit ×13
c++ ×11
cmake ×2
unit-testing ×2
attributes ×1
ctest ×1
gnuradio ×1
methods ×1
oop ×1
scons ×1
singleton ×1
static ×1
testing ×1
visual-c++ ×1