增强单元测试:捕获不成功的测试

时间:2013-10-10 13:50:12

标签: c++ unit-testing boost

我正在运行测试,其中打开一个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(),我无法在下次测试。有办法处理这个吗?也许捕获异常并关闭并取消该捕获范围内的设备?或者这是一个完全错误的方法? 我对单元测试很陌生。所以任何帮助都表示赞赏。谢谢!

3 个答案:

答案 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_CHECKBOOST_CHECK_EQUAL。在这种情况下,也许前两个项应该是“REQUIRE”d,最后三个应该是“CHECK”ed。

答案 2 :(得分:1)

你最好先做一些必须先在夹具设置中完成并整理拆卸功能的东西。显然,将OO与RAII一起使用并将receiveData作为类方法可以避免这种情况。
或者,BOOST_CHECK将检查条件并继续测试,如果它失败,这将避免您BOOST_REQUIRE停止执行其余测试的问题。