Шаблоны для облегчения тестирования кода на С ++

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

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

4 ответа

Решение

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

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

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

редактировать
Хорошо, простой пример:

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

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

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

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

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

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

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

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

Максимальное сцепление и минимальное сцепление.

Это сделает вашу жизнь проще с тестированием.

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

  1. Достижение функциональности
  2. Расширяемость кода
  3. Код Resuablity
  4. Поддержка кода
Другие вопросы по тегам