Шаблоны для упрощения тестирования кода на С++

Должны ли вы разработать код для облегчения тестирования? И если да, то как разработать С++ код, чтобы его было легко проверить.

  • Как вы применяете инъекцию зависимостей в С++?
  • Должен ли я реализовывать классы, используя чистый класс интерфейса в качестве базы, чтобы упростить создание поддельных тестовых объектов?
    • Это заставило бы меня сделать много виртуальных методов. Это повлияет на производительность?
  • Что еще мне следует учитывать при проектировании для проверки на С++?

Ответ 1

Должен ли я реализовывать классы с использованием чистого класса интерфейса в качестве базы, чтобы упростить создание поддельных тестовых объектов?

  • Это заставило бы меня создавать множество виртуальных методов. Это повлияет на производительность?

Обходной путь, который я часто использую, - это templatize класс вместо того, чтобы скрывать его за интерфейсом. Затем я могу передавать объекты тестирования/макета в качестве параметров шаблона при тестировании, а реальные объекты - в противном случае. Таким образом избегается поражение виртуальных функций.

Edit
Хорошо, простой пример:

С ООП и интерфейсами вы можете написать такую ​​функцию, как:

void Foo(IBar& someBar) { ... }

Эта функция принимает параметр, реализующий интерфейс IBar, и делает что-то с ним. Если вы хотите перейти в фиктивную реализацию mock, вы просто напишите mock-объект, который наследует от IBar, и передайте его на Foo. Простой и понятный.

Но вы можете добиться того же, что и с шаблонами:

template <typename BarType>
void Foo(BarType& someBar) { ... }

... и что это. Тело Foo может быть практически без изменений. До тех пор, пока тип, переданный функции, предоставляет все необходимые нам члены, он будет работать без формального наследования класса интерфейса и без накладных расходов на виртуальные функции и полиморфизм во время выполнения.

Ответ 2

Не начинайте с самого начала слишком много, а затем пишите тест, а затем пропустите его, но не более того. Держите свои функции очень короткими. Посмотрите, что вы сделали и реорганизовали. Если вы собираетесь написать комментарий, лучше поместите рассматриваемый код в отдельную функцию с хорошим именем.

И не тратьте слишком много времени на размышления о шаблонах, о том, что много науки и небольшого результата, просто напишите тест первым и сохраните свой код простым, то, что удивительно, вам не нужно писать тесты для него, вы Это уже сделано. И ваш код работает.

Ответ 3

Максимум cohesion и минимум coupling.

Это облегчит вашу жизнь при тестировании.

Ответ 4

Я думаю, что главная проблема должна быть...

  • Достижение функциональных возможностей
  • Расширение кода
  • Резолюция кода
  • Поддержание кода