0

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

4

3 回答 3

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

这是基于零规则中给出的示例。

于 2013-10-10T14:18:32.957 回答
1

当您想要报告不满足的条件时,您应该使用BOOST_CHECKand ,但仍继续测试。BOOST_CHECK_EQUAL在这种情况下,也许前两项应该是“REQUIRE”d,后三项应该是“CHECK”。

于 2013-10-10T14:15:53.070 回答
1

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

于 2013-10-10T14:16:02.210 回答