Если вы просто хотите повторно использовать тестовый код как есть, но с другим тестируемым модулем, наследование представляется наиболее простым, поскольку вам потребуется отдельный метод тестирования для каждого теста, а наследование является единственным способ сделать это без необходимости вводить их самостоятельно. Это не должно приводить к дублированию, поскольку вам нужно только повторно реализовать части, которые на самом деле различны в каждом подклассе.
Если ваша проблема связана с тем, что вы строите свое тестовое устройство в тестовом примере в качестве конструктора класса, альтернативой может быть применение шаблона проектирования Template Method к вашим тестовым методам и добавление метода виртуального создания для тестируемого модуля, который подклассы могут переопределять для создания экземпляров указанного модуля c Вы хотите, чтобы они протестировали. Кроме того, вы можете создать метод настройки теста и пометить его соответствующим атрибутом, как описано в этот ответ .
При этом, если вы действительно хотите Храните их все в одном и том же классе тестового примера, вы можете сделать это, если вы реализуете методы создания для отдельных тестируемых модулей в своем базовом классе тестового примера, а затем передаете имена этих методов в свои тестовые методы и вызываете их используя отражение. Должен существовать атрибут, который позволяет передавать аргументы в методы тестирования, что обсуждается в этом ответе . Однако выполнимость такого подхода с моей стороны является лишь предположением, и вы рискуете сделать свои тесты более неясными.