LINUX.ORG.RU

C++ unit testing - с какой стороны подступиться?


0

1

Хочу разобраться в модульном тестировании применительно к C++. Но даже не знаю с какой стороны начинать. Прошу подсказать что почитать на эту тему. Надо что-то понятное для дилетанта вроде меня.

На эту же тему у меня есть и более конкретный практический вопрос. Например в составе программы есть три неких класса - Input, Handler и Output. Handler должен получать какую-то информацию из Input'а, как-то её обрабатывать и передавать классу Output. Реализация простая как лом: в конструкторе класса Handler создаются экземпляры Input и Output, а затем в процессе работы Handler вызывает их функции. А теперь допустим, что мне взбрело в голову проверить работу класса Handler подавая ему заранее известные данные и сравнивая результат работы с эталоном. Правильно ли я понимаю, что для этого мне нужно заменить классы Input и Output на подменные классы, которые вместо реальной работы должны выдавать заранее заготовленные данные и сравнивать результат работы? Как это правильно сделать? Мне приходит в голову только один вариант: добавление между Handler'ом и Input/Output лишних слоёв абстракции в виде полностью виртуальных классов-интерфейсов или шаблонов, чтобы можно было легко подсунуть Handler'у заменители для Input'а и Output'а. Но это мне не нравится, так как для этого надо основательно корёжить код и добавлять лишние вещи, от которых не будет никакой пользы при работе программы в штатном режиме...

Deleted

посмотреть, например, на gmock и т.п. вещи. у гугла в его видеолекциях был рассказ про gmock

ott ★★★★★
()
Ответ на: комментарий от ott

посмотреть, например, на gmock и т.п. вещи. у гугла в его видеолекциях был рассказ про gmock

Я пытался разобраться по документации к разным фреймворкам для модульного тестирования, но не понял вообще почти ничего. Мне надо что-то менее абстрактное, с примерами кода и объяснением принципа как это всё работает и как это правильно делать. Можно (или нужно?) даже книжку, не обязательно статью в интернете.

Deleted
()

Можно заменить динамический полиморфизм на статический с помощью шаблонов. Тогда не будет потери производительности. Что то вроде

class Handler<TInput, TOutput> {
public:
  Handler(const TInput &input, const TOutput &output) input(input), output(output) { }
private:
  const TInput &input;
  const TOputput &output;
}
Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Можно заменить динамический полиморфизм на статический с помощью шаблонов. Тогда не будет потери производительности.

Но тогда придётся всю реализацию класса вынести в заголовочный файл, что не удобно.

Deleted
()

Мне приходит в голову только один вариант: добавление между Handler'ом и Input/Output лишних слоёв абстракции в виде полностью виртуальных классов-интерфейсов или шаблонов, чтобы можно было легко подсунуть Handler'у заменители для Input'а и Output'а.

Ну, допустим, еще можно подменить класс с помощью препроцессора:

class MyClass {
  void do();
}

class MyTestClass {
  void do();
}

#define MyClass MyTestClass

Или с помощью линкера собрать с объектным файлом, содержащим тестовую реализацию этого класса.

Могу посоветовать книгу «Working Effectively with Legacy Code». Ничего лучше пока не попадалось. Даны основы юнит-тестирования и масса рецептов по его применению.

ipc
()
Ответ на: комментарий от Deleted

Варианты: 1. Вынести реализацию в отдельный файл и инклудить его из заголовка. 2. Использовать export templates.

Legioner ★★★★★
()
Ответ на: комментарий от ott

P.S. Но ИМХО не хватает советов по части эффективности и удобства разных подходов и т. п. В общем, тоже интересует тема.

Интересно было бы узнать кто чем пользуется для C++ и какие впечатления.

ipc
()
Ответ на: комментарий от ipc

я пользуюсь boost.test... раньше пользовался еще и cppunit

на общие темы тестирования, лучше читать что-то вроде книжек test driven design, я читал бека про extreme programming, но это было совсем давно.

P.S. на мой взгляд вполне хватает wikipedia & c2.com

ott ★★★★★
()
Ответ на: комментарий от ipc

Или с помощью линкера собрать с объектным файлом, содержащим тестовую реализацию этого класса.

Тоже вчера такой вариант в голову пришёл.

Deleted
()
Ответ на: комментарий от Deleted

Да нет, вроде во всех распространённых компиляторах реализовано.

Legioner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.