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

+0

открытие фактических портов usb разумная вещь, чтобы сделать в * единице * тест? – doctorlove

ответ

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.

+0

Возможно, USBWrapper является конструктором для USBDeviceHandler? – doctorlove

+0

@doctorlove - oops, fixed. Я изменил имя вспомогательного класса на полпути, написав ответ. –

1

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

1

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

Смежные вопросы