Boost Unit Test: поймать неудачный тест

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() появляется ошибка, а Check for '5' терпит неудачу, функции closeDevice() и uninitDevice() больше не вызываются, и я не могу использовать устройство в следующем тесте. Есть ли способ справиться с этим? Может быть, поймать исключение и закрыть и uninit устройство в этой области захвата тоже? Или это полный неправильный подход? Я новичок в модульном тестировании. Поэтому любая помощь приветствуется. Благодарю!

Теги:
unit-testing
boost

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

Это основано на примере, приведенном в " Правиле нуля".

  • 0
    Предполагается ли, что USBWrapper является конструктором для USBDeviceHandler?
  • 0
    @doctorlove - упс, исправлено. Я изменил название класса помощника на полпути, написав ответ.
1

Вы должны использовать BOOST_CHECK и BOOST_CHECK_EQUAL если хотите сообщить о состоянии, которое не выполняется, но все равно продолжить тест. В этом случае, возможно, первые два элемента должны быть "REQUIRE" d, а последние три должны быть "CHECK" ed.

1

Возможно, вам будет лучше делать то, что должно произойти сначала в настройке прибора и убирать его с помощью функции срыва. Очевидно, что использование OO с RAII и помещение receiveData как метода класса позволило бы избежать этого.
В качестве альтернативы BOOST_CHECK проверит условие и продолжит тест, если он не удастся, что позволит избежать проблемы, BOOST_REQUIRE вас, когда BOOST_REQUIRE останавливает остальную часть тестового выполнения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню