Я запускаю тест, когда устройство 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 устройство в этой области захвата тоже? Или это полный неправильный подход? Я новичок в модульном тестировании. Поэтому любая помощь приветствуется. Благодарю!
Я бы использовал одну из ключевых концепций в современных 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
Это основано на примере, приведенном в " Правиле нуля".
Вы должны использовать BOOST_CHECK
и BOOST_CHECK_EQUAL
если хотите сообщить о состоянии, которое не выполняется, но все равно продолжить тест. В этом случае, возможно, первые два элемента должны быть "REQUIRE" d, а последние три должны быть "CHECK" ed.
Возможно, вам будет лучше делать то, что должно произойти сначала в настройке прибора и убирать его с помощью функции срыва. Очевидно, что использование OO с RAII и помещение receiveData
как метода класса позволило бы избежать этого.
В качестве альтернативы BOOST_CHECK
проверит условие и продолжит тест, если он не удастся, что позволит избежать проблемы, BOOST_REQUIRE
вас, когда BOOST_REQUIRE
останавливает остальную часть тестового выполнения.