Шаблоны для облегчения тестирования кода на С ++
Стоит ли разрабатывать код для облегчения тестирования? И если да, то как разработать код на С ++, чтобы его было легко тестировать.
- Как вы применяете внедрение зависимостей в C++?
- Должен ли я реализовать классы, используя чистый интерфейсный класс в качестве основы, чтобы упростить создание поддельных тестовых объектов?
- Это заставило бы меня сделать много виртуальных методов. Повлияет ли это на производительность?
- Что еще я должен думать при разработке для тестируемости в C++?
4 ответа
Должен ли я реализовать классы, используя чистый интерфейсный класс в качестве основы, чтобы упростить создание поддельных тестовых объектов?
- Это заставило бы меня сделать много виртуальных методов. Повлияет ли это на производительность?
Обходной путь, который я часто использую, состоит в том, чтобы шаблонизировать класс, а не прятать его за интерфейсом. Затем я могу передать тестовые / фиктивные объекты в качестве параметров шаблона при тестировании, а реальные объекты - в противном случае. Таким образом можно избежать снижения производительности виртуальных функций.
редактировать
Хорошо, простой пример:
С ООП и интерфейсами вы можете написать такую функцию:
void Foo(IBar& someBar) { ... }
Эта функция принимает параметр, который реализует IBar
интерфейс, и делает что-то с этим. Если вы хотите передать фиктивную реализацию, вы просто пишете фиктивный объект, который наследуется от IBar
и передать это Foo
, Просто и понятно.
Но вы можете добиться того же с помощью шаблонов:
template <typename BarType>
void Foo(BarType& someBar) { ... }
... и это все. Тело Foo
может быть почти без изменений. Пока тип, передаваемый в функцию, предоставляет все необходимые нам члены, он будет работать без формального наследования от класса интерфейса и без накладных расходов на виртуальные функции и полиморфизм во время выполнения.
Не создавайте слишком много с самого начала, затем напишите тест, затем сделайте его успешным, но не более того. Держите свои функции очень короткими. Посмотрите, что вы сделали, и рефакторинг. Если вы собираетесь написать комментарий, лучше поместите соответствующий код в отдельную функцию с хорошим именем.
И не тратьте слишком много времени на размышления о шаблонах, это много науки и мало результатов, просто сначала напишите тест и сделайте свой код простым, а затем, к удивлению, вам не нужно писать тесты для него, вы сделали это уже. И твой код работает.
Я думаю, что главное беспокойство должно быть...
- Достижение функциональности
- Расширяемость кода
- Код Resuablity
- Поддержка кода