我正在运行测试,其中打开一个USB设备,发送和接收数据包,然后再次关闭。 它看起来像这样:
void TestCase1(void)
{
int recv;
BOOST_REQUIRE(initDevice());
BOOST_REQUIRE(openDevice());
BOOST_REQUIRE_EQUAL(receiveData(), 5);
BOOST_REQUIRE(closeDevice());
BOOST_REQUIRE(uninitDevice());
}
现在,只要receiveData()
来电中出现错误,并且检查'5'失败,就不会再调用closeDevice()
和uninitDevice()
,我无法在下次测试。有办法处理这个吗?也许捕获异常并关闭并取消该捕获范围内的设备?或者这是一个完全错误的方法?
我对单元测试很陌生。所以任何帮助都表示赞赏。谢谢!
答案 0 :(得分:2)
我会使用现代C ++中的一个关键概念RAII来帮助保持initDevice / uninitDevice和openDevice / closeDevice绑定在一起:
class USBDeviceHandler
{
public:
USBDeviceHandler()
: initDeviceHandle { ::initDevice()), &::uninitDevice },
openDeviceHandle { ::openDevice()), &::closeDevice }
{
}
using init_handle = std::unique_ptr<void, decltype(&::uninitDevice)>;
using open_handle = std::unique_ptr<void, decltype(&::closeDevice)>;
init_handle initDeviceHandle;
open_handle openDeviceHandle;
};
void TestCase1(void)
{
int recv;
USBDeviceHandler device; //init/open is called upon construction
BOOST_REQUIRE_EQUAL(receiveData(), 5);
}//close/uninit is called upon destruction
这是基于Rule of Zero中给出的示例。
答案 1 :(得分:1)
如果您想报告条件不满意,但仍需继续测试,则应使用BOOST_CHECK
和BOOST_CHECK_EQUAL
。在这种情况下,也许前两个项应该是“REQUIRE”d,最后三个应该是“CHECK”ed。
答案 2 :(得分:1)
你最好先做一些必须先在夹具设置中完成并整理拆卸功能的东西。显然,将OO与RAII一起使用并将receiveData
作为类方法可以避免这种情况。
或者,BOOST_CHECK
将检查条件并继续测试,如果它失败,这将避免您BOOST_REQUIRE
停止执行其余测试的问题。