Как лучше подать тест-данные в модульный тест - из массива байтов или же из файлового стрима?

Рейтинг: 1Ответов: 1Опубликовано: 05.09.2014

У меня есть код, который работает с файлами некоторого формата. Есть класс, который работает с std::istream&, это ссылка интерфейс входного потока, он определен в стандартной библиотеке С++.

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

Вопрос 1: насколько оправдан "страх" зависимости от файловых путей к тест-файлам?
Вопрос 2: и как, на Ваш взгляд, лучше поступить - тест-файлы или же оставить, как есть, тест-данные в виде массивов байтов?

Если аргументируйте ответ, буду очень рад!

Ответы

▲ 4

Когда-то я нашел интересную заметку на эту тему - Потоки в С++ для удобного тестирования.

Насколько оправдан "страх" зависимости от файловых путей к тест-файлам?

Если пути абсолютные, то это плохие тесты. Если же пути относительные, то это нормально.

Если сторонний человек сможет склонировать Ваш репозиторий с проектом и тестами (или просто, распаковав с архива) и просто запустить одной командой тесты (либо в консоли готовым скриптом, либо тем, что интегрировано в IDE), и ему не нужно будет настраивать пути - то все ок.

и как на Ваш взгляд лучше поступить - тест-файлы или же оставить, как есть, тест-данные в виде массивов байтов?

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

Но главное не забывать тестить и на реальных файлах. К примеру, файл может быть открыт в текстовом режиме, а там внутри символ "конца файла". Под линуксом такое дело легко прочитается до реального конца файла. А вот под виндами - нет.