Как программно отключить утверждения в С++?

Я должен отлаживать модульные тесты (мы используем UnitTestPP) в C++ (в частности, используя VS 2015), и я хочу отключить утверждения для определенных разделов кода, для которых мы добровольно делаем тестируемый код генерировать исключения, что, в свою очередь, делает некоторые утверждения терпят неудачу, поэтому я не всегда нажимаю «игнорировать» каждый раз, когда появляется всплывающее окно «утверждение не удалось».

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

Я знаю о #define NDEBUG, но он не работает. Я думаю, это потому, что модульные тесты находятся в другом проекте/DLL.

Кроме того, неудачное утверждение - это ATLASSERT, я не знаю, меняет ли это что-то.


person TommyD    schedule 17.02.2017    source источник
comment
Когда утверждение терпит неудачу, независимо от причины, у вас есть ошибка.   -  person Cheers and hth. - Alf    schedule 18.02.2017
comment
ATLASSERT — это продукт Microsoft, и он задокументирован Microsoft. Часто полезно взглянуть на документацию чего-либо, когда возникает вопрос, какие функциональные возможности у этого чего-то есть.   -  person Cheers and hth. - Alf    schedule 18.02.2017
comment
Это помогает? stackoverflow.com/questions/28316665/   -  person Bathsheba    schedule 18.02.2017
comment
Visual Studio поставляется с исходным кодом для ATL. Если вы хотите посмотреть, как реализован ATLASSERT (и тем самым найти способы его отключения), у вас есть все необходимые инструменты. Если вы обнаружите, что его нельзя отключить во время выполнения, вы можете использовать WinEvents для отслеживания создания диалогов и использования Автоматизация пользовательского интерфейса, чтобы отклонить ее, где это необходимо.   -  person IInspectable    schedule 18.02.2017
comment
@Cheersandhth.-Alf Учитывая, что рассматриваемые тесты пытаются спровоцировать случаи ошибок, вполне ожидаемо, что оба исключения выдаются, а утверждения не проходят. Делать и то и другое не рекомендуется, но такова суровая реальность устаревшего кода.   -  person TommyD    schedule 20.02.2017
comment
@ТоммиД; Вы написали, что, в свою очередь, делает некоторые утверждения ошибочными. Это ошибки. Модульный тест может привести к сбою утверждений, преднамеренно вводя ошибки, такие как неудачные предварительные условия. Насколько я помню, большинству фреймворков модульного тестирования не хватает поддержки этих тестовых случаев. Поэтому некоторые люди переопределяют эффект утверждения на генерацию исключений с целью тестирования. Но независимо от этого, неудачное утверждение является ошибкой. Это /может/ быть преднамеренной ошибкой с целью тестирования. Но если это вызвано исключением, то это ошибка, которую необходимо исправить.   -  person Cheers and hth. - Alf    schedule 20.02.2017
comment
@Cheersandhth.-Alf Утверждение означает только то, что имел в виду программист, поместивший его туда, ни больше, ни меньше. Говорить, что это всегда ошибка, — это догма. Например, тестирование извлечения элемента в пустом самодельном контейнере из устаревшей кодовой базы может вызвать как исключение, так и ошибочное утверждение повышения. Код по-прежнему работает, как предполагалось, хотя утверждение не имеет значения из-за наличия исключения.   -  person TommyD    schedule 20.02.2017