Восстановление из исключений с помощью CPPUnit - PullRequest
2 голосов
/ 15 октября 2008

Я использовал CPPUnit в качестве фреймворка для юнит-тестирования и сейчас пытаюсь использовать его в автоматизированной системе сборки и пакетирования. Однако проблема, сдерживающая меня, состоит в том, что если во время выполнения модульных тестов происходит сбой, например, разыменование нулевого указателя останавливает остаток автоматизации.

Есть ли способ для CPPUnit восстановиться после исключения, записать сбой теста и затем существовать изящно, а не завершать процесс модульного тестирования? Даже подход, специфичный для разыменования нулевых указателей, был бы полезен, поскольку он составляет около 90% проблем, которые у меня были.

Чтобы быть специфичным для технологии, я использую make-файлы в системе Windows.

Ответы [ 5 ]

3 голосов
/ 15 октября 2008

Вы автоматизируете выполнение своих модульных тестов на основе cppunit во время процесса сборки, верно?

Если бы вы пытались использовать CppUnit для выполнения процесса сборки, я бы хотел сказать, что не делайте этого!

Не могли бы вы рассказать нам, что останавливает процесс сборки при сбое модульных тестов? И какие у вас начались юнит-тесты: Makefile, собственный скрипт или инфраструктура непрерывной интеграции ?


Чтобы попытаться ответить на ваш вопрос, CppUnit не может восстановиться после ошибок нарушения или сегментации. В Unix-подобных системах вы должны быть в состоянии перехватить SIGSEGV и продолжить, , но , в каком состоянии ?

Если ваши сбои происходят в вашем модульном тесте, а не в вашем продукте, то я бы порекомендовал вам использовать защиту утверждений для предотвращения разыменования указателей NULL:

class TestObject : public CPPUNIT_NS::TestCase
{
  CPPUNIT_TEST_SUITE(Test);
  CPPUNIT_TEST(testObjectIsReady);
  CPPUNIT_TEST_SUITE_END();

public:
  void setUp(void) {}
  void tearDown(void) {} 

protected:
  void testObjectIsReady(void)
  { 
     Object *theObject = GetObject();

     CPPUNIT_ASSERT_MESSAGE("check pointer is not null", theObject != NULL);

     //--- now you can play with your object without dereferencing a NULL pointer
     CPPUNIT_ASSERT_MESSAGE("check objet is ready", theObject->isReady());
  }
};
2 голосов
/ 26 января 2009

Извините, что говорю это, но предыдущие ответы, которые вы получили на это, смешны. Cppunit действительно не хватает в этом отношении. cppunit должен реализовать макрос EXIT_ON_FAIL, который позволяет вам отлавливать нарушение доступа в окнах (используя SetUnhandledExceptionFilter), затем вы можете выполнить любую очистку и позволить cpp-unit сообщать о сбое через EXIT_ON_FAIL. Затем после сообщения выйдите из приложения.

1 голос
/ 12 февраля 2009

Как дополнительное примечание для любого, кто просматривает этот вопрос позже, я обнаружил, что UnitTest ++ может перехватывать исключения в тестах и ​​просто не выполнять тест с соответствующей информацией, а не приводить к завершению процесса.

1 голос
/ 15 октября 2008

В C / C ++ лучший способ исправить подобные ошибки - это запускать каждый тест в отдельном процессе, а затем отслеживать их из родительского процесса. Это очень просто в UNIX - просто fork () перед началом теста. check поддерживает это, и вы, вероятно, можете исправить CPPUnit, чтобы такое поведение происходило без особых хлопот.

0 голосов
/ 11 декабря 2009

Я не пробовал, но если в Windows, я думаю, использование SEH поможет:

__try
{
// running your case
}

__except
{
}

Интегрируйте его в платформу CppUnit и каждый раз получайте неизвестное исключение, помечайте случай как сбойный.

...