【问题标题】:Boost Unit Test: Catch an unsuccessful TestBoost Unit Test:捕获一个不成功的测试
【发布时间】:2013-10-10 13:50:11
【问题描述】:

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

【问题讨论】:

  • unit 测试中打开实际的 USB 端口是否明智?

标签: c++ unit-testing boost


【解决方案1】:

我将使用现代 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 中给出的示例。

【讨论】:

  • USBWrapper 应该是 USBDeviceHandler 的构造函数吗?
  • @doctorlove - 哎呀,已修复。我在写答案的中途更改了助手类的名称。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多