Лучшей практикой является четкое представление о целях тестирования и технической пропускной способности для достижения этих целей, поскольку существует целый ряд противоречивых принципов тестирования, начиная от разработки на основе тестирования (в этом случае ваши тестовые примеры находятся вспособ важнее, чем артефакты вашего кода, и он должен получать наивысшую оплату) для "как можно меньшего человеческого тестирования, чтобы вывести эту вещь на рынок" (что на самом деле делает большинство компаний).
Но вы задаете простой вопрос, поэтому вот простой ответ.ДА, вы должны смотреть на отделение пользовательского интерфейса приложения от бизнес-логики, для тестирования и многих других причин, и ДА, упаковка функциональности в библиотеку (DLL - это термин для Windows) - это основное средстводостижения этого.Разумеется, вопрос о том, используете ли вы динамическую или статическую библиотеку, представляет ли вас сторонний набор инструментов, помогающий вам в тестировании, - это совсем другое.
Монолитные исполняемые файлы можно тестировать, но не так легкокак приложения, разбитые на уровне компонентов с некоторой осведомленностью о разделении интересов, способностью макетировать различные интерфейсы и т. д. Поэтому, учитывая выбор, особенно если вы находитесь на ранней стадии разработки, разбивка кода на библиотеки и отдельные компоненты имеет тенденциюулучшить работоспособность и тестируемость системы, даже несмотря на то, что она вводит некоторые новые сложности, связанные со связыванием, двоичными интерфейсами и т. п.
(Также не бойтесь напрямую тестировать приложение с графическим интерфейсом, используя тестированиебегун, который понимает, как взаимодействовать с графическим интерфейсом. В идеале вы хотите тестировать вещи как в отдельности, так и в соединении, и в чистых средах, а также в тех, которые отражают производство.)