如何使用 Visual Studio CppUnitTestFramework 初始化测试变量
How to initialize test variables using Visual Studio CppUnitTestFramework
我正在编写一个机器人控制器 class Controller,其中我为每个控制器使用一个结构 Axis 4个可控电机。
对于每个测试,我都想重置所有内容,因此我在 class 中创建了一个指针,在每个测试方法之前将其更改为一个新的控制器。初始化在 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;
}
...
TEST_METHOD(id_3_next_mode)
{
mx->position = 5;
controller->getAxisPositionMx();
//Axis in pointers got reset and therefore have no pointers to the
//provided structs from TEST_METHOD_INITIALIZE
}
}
};
}
Controller.h(摘录):
private:
struct Axis *mx, *my, *mz, *mg;
Controller.cpp(摘录)
Controller::Controller(Axis *mx_in, Axis *my_in, Axis *mz_in, Axis *mg_in)
{
mx = mx_in;
my = my_in;
mz = mz_in;
mg = mg_in;
}
您发现了您的原始错误,但我认为有必要指出一些关于测试模块、classes、方法和特殊 initialize/cleanup 方法如何工作的细节。
需要注意的最重要的一点是,每次执行测试方法时都会实例化 class 的一个新实例,因此每个测试都会有一组新的 class 变量。这意味着您的示例测试 class 可能如下所示:
TEST_CLASS(UnitTestController)
{
public:
struct Axis mx, my, mz, mg;
Controller controller;
// Define a constructor to initialize the class variables
UnitTestController() :
mx(50), my(50), mz(50), mg(50),
controller(mx, my, mz, mg)
{
}
TEST_METHOD(id_3_next_mode)
{
mx.position = 5;
controller.getAxisPositionMx();
}
};
如果你想让一个变量在测试之间保持不变,你可以把它放在测试之外 class。
namespace UnitTest {
SomeClass moduleVar1;
TEST_CLASS(UnitTestClass)
{
public:
TEST_METHOD(TestMethod1)
{
Assert::IsTrue(moduleVar1.SomeMethod());
}
TEST_METHOD(TestMethod2)
{
Assert::IsFalse(moduleVar1.SomeOtherMethod());
}
};
}
该框架还提供了以下初始化和清理功能,可用于操作测试环境和固定装置:
TEST_METHOD_INITIALIZE
- 在每个测试方法 运行 之前调用一次。
TEST_METHOD_CLEANUP
- 在每个测试方法 运行 之后调用一次。
TEST_CLASS_INITIALIZE
- 在 运行 属于此 class 的任何测试之前每个模块调用一次。
TEST_CLASS_CLEANUP
- 在 运行 所有属于此 class 的测试之后每个模块调用一次。
TEST_MODULE_INITIALIZE
- 在 运行 任何测试或 class initalizers 之前每个模块调用一次。
TEST_MODULE_CLEANUP
- 在 运行 所有测试和 class 清理之后每个模块调用一次。
我正在编写一个机器人控制器 class Controller,其中我为每个控制器使用一个结构 Axis 4个可控电机。
对于每个测试,我都想重置所有内容,因此我在 class 中创建了一个指针,在每个测试方法之前将其更改为一个新的控制器。初始化在 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;
}
...
TEST_METHOD(id_3_next_mode)
{
mx->position = 5;
controller->getAxisPositionMx();
//Axis in pointers got reset and therefore have no pointers to the
//provided structs from TEST_METHOD_INITIALIZE
}
}
};
}
private:
struct Axis *mx, *my, *mz, *mg;
Controller.cpp(摘录)
Controller::Controller(Axis *mx_in, Axis *my_in, Axis *mz_in, Axis *mg_in)
{
mx = mx_in;
my = my_in;
mz = mz_in;
mg = mg_in;
}
您发现了您的原始错误,但我认为有必要指出一些关于测试模块、classes、方法和特殊 initialize/cleanup 方法如何工作的细节。
需要注意的最重要的一点是,每次执行测试方法时都会实例化 class 的一个新实例,因此每个测试都会有一组新的 class 变量。这意味着您的示例测试 class 可能如下所示:
TEST_CLASS(UnitTestController)
{
public:
struct Axis mx, my, mz, mg;
Controller controller;
// Define a constructor to initialize the class variables
UnitTestController() :
mx(50), my(50), mz(50), mg(50),
controller(mx, my, mz, mg)
{
}
TEST_METHOD(id_3_next_mode)
{
mx.position = 5;
controller.getAxisPositionMx();
}
};
如果你想让一个变量在测试之间保持不变,你可以把它放在测试之外 class。
namespace UnitTest {
SomeClass moduleVar1;
TEST_CLASS(UnitTestClass)
{
public:
TEST_METHOD(TestMethod1)
{
Assert::IsTrue(moduleVar1.SomeMethod());
}
TEST_METHOD(TestMethod2)
{
Assert::IsFalse(moduleVar1.SomeOtherMethod());
}
};
}
该框架还提供了以下初始化和清理功能,可用于操作测试环境和固定装置:
TEST_METHOD_INITIALIZE
- 在每个测试方法 运行 之前调用一次。TEST_METHOD_CLEANUP
- 在每个测试方法 运行 之后调用一次。TEST_CLASS_INITIALIZE
- 在 运行 属于此 class 的任何测试之前每个模块调用一次。TEST_CLASS_CLEANUP
- 在 运行 所有属于此 class 的测试之后每个模块调用一次。TEST_MODULE_INITIALIZE
- 在 运行 任何测试或 class initalizers 之前每个模块调用一次。TEST_MODULE_CLEANUP
- 在 运行 所有测试和 class 清理之后每个模块调用一次。