Проверьте сбой прерывания утверждения в CppUnit - PullRequest
0 голосов
/ 23 января 2020

Я хочу провести модульное тестирование функции C ++, которая выдает ошибку подтверждения при неверном вводе.

Функция выглядит следующим образом:

uint64_t FooBar::ReadTimeStamp(std::string& name) {
  auto iter = hash_table_.find(name);
  assert(iter != hash_table_.end());
  ....
}

В модульном тесте я использую CPPUNIT_ASSERT_ASSERTION_FAIL для подтверждения ошибки подтверждения:

void FooBarTest::
  TestReadNonexistentTimestamp() {
  CPPUNIT_ASSERT_ASSERTION_FAIL(ReadTimestamp("NON_EXISTENT"));
}

Но я получил сообщение об отмене и модульный тест не пройден.

Я прочитал эту страницу . Мне не ясно, нужно ли мне выдавать исключение здесь и каков будет правильный путь для модульного тестирования в этом сценарии. Спасибо!

1 Ответ

1 голос
/ 23 января 2020

Во-первых, ваше недоразумение вызвано различными способами использования термина «утверждение». Сам тестовый фреймворк говорит об утверждениях, но он не означает макрос assert(), предоставленный стандартной библиотекой. Так как стандартный сбой утверждения вызывает завершение программы, вы получите эти результаты.

Теперь, как это исправить:

  • Не используйте assert(). Вместо этого вы можете вызвать исключение.
  • Не проверяйте этот путь кода. Так как это ошибка программирования, которую в любом случае невозможно исправить, она может быть вызвана только неправильным использованием вашего кода (то есть нарушением предварительных условий). Так как виноват не ваш код, то его тестирование не окажет негативного влияния на его качество.
  • Hijack assert(), чтобы вызвать ошибку, которую понимает CppUnit. Это может быть сложно, потому что, с одной стороны, assert() является частью C ++ и не должен быть небрежно переопределен (возможно, лучше заменить его другим макросом). Кроме того, теперь у вас есть три различных поведения: добавьте в тестах, abort () при регулярном использовании, UB с определенным NDEBUG.

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

...