Я склоняюсь к статическим библиотекам, а не к dll, поэтому большая часть моего кода на C ++ в любом случае заканчивается статическими библиотеками, и, как вы обнаружили, их так же легко тестировать, как и DLL.
Для кода, который встраивается в исполняемый файл, у меня либо есть отдельный тестовый проект, который просто включает тестируемые исходные файлы и обычно встроенные в исполняемый файл. ИЛИ я создаю новую статическую библиотеку, которая содержит большую часть исполняемого файла и тестируемого файла. это так же, как я проверяю все мои другие статические библиотеки. Я обнаружил, что я обычно использую подход «большинство кода в библиотеке» с новыми проектами и подход «перетащить исходные файлы из exe-проекта в тестовый проект», когда я подгоняю тесты к существующим приложениям.
Мне не нравятся ваши варианты 2 и 3. Управлять конфигурациями сборки для 2, вероятно, сложнее, чем иметь отдельный тестовый проект, который просто извлекает нужные ему источники и включает все тесты в exe, как вы предлагаете в 3, просто неправильно;)