Задать вопрос
EvilsInterrupt
@EvilsInterrupt
System programming, Reversing Engineering, C++

Как правильно писать юнит-тест для класса работающего с файлом?

Цель вопроса выразить просьбу поделиться опытом кто и как пишет юнит-тесты для классов нацеленных на работу с файлом подчиняющегося какому-либо формату?


Итак.

Сейчас пишу библиотеку по работе с определенным форматом файла, все мои юнит-тесты при проверке тем или иным образом используют файлы. Файловый путь к тестовым файлам формирую в исходнике путем питон-скрипта, который отрабатывает перед компиляцией.


Nota Bene: Я сознательно не указываю среду разработки и язык программирование. Уверен что техники юнит-тестирования не зависят от языка или IDE.


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


Варианты приходящие в голову:

1) Просто ложить в некую папку набор тестовых файлов и указывать пукть к этой папке юнит-тестам. Этим способом сейчас и пользуюсь

2) Можно тест-файлы перевести в символьную форму, вида "\x4a\x4B\xa9" и тогда не надо будет указывать файловый путь, но по сути это теже самые тестовые файлы, только немного по-другому представлены


+ ко всему меня еще смущает работа с файлами тем что это похоже на «интеграционный» тип тестирования, а этим не должен заниматься юнит-тест.


P.S.:

Пока склоняюсь к мысли, что вариант два все-таки имеет смысл, но это означает мне надо будет написать достаточно большое количество тестового кода, своего рода Test API для тестирования моей библиотеки. Поэтому стоит вопрос будет ли это оправданным, ответ на который голова пока обдумывает?!
  • Вопрос задан
  • 8260 просмотров
Подписаться 5 Оценить 2 комментария
Решения вопроса 1
serso
@serso
Нужно отделить логику чтения файла от логики его обработки — мало ли откуда данные могут придти — из БД, по сети, в качестве параметра метода.
Т.е. обработчик должен на входе принимать строку (а ещё лучше какой-нибудь поток байт/символов для последовательного чтения).
В этом случае юнит-тестирование сведётся к тестированию только логики процессинга, а, следовательно, данные могут быть просто зашиты в файл теста.
Если нужно тестирование ещё и чтения файла — отдельный юнит тест (но т.к. скорее всего вы используете какой-нибудь стандартный API вам это не потребуется).
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
ixSci
@ixSci
читай про mock'и и используй их. Физическое чтение с ФС производить излишне, ты же не драйвер ФС пишешь, а значит тестировать надо твою логику.
Ответ написан
arturich
@arturich
Модульные тесты модульными называются потом, что тестируют модуль изолировано. Зависимойстей, по хорошему, быть не должно, иначе это уже будет что-то вроде интеграционного тестирования.

Однако, как часто бывает, проблема в другом) Всегда надо быть уверенным, что модульный тест сейчас для вас лучший вариант, так как довольно часто получается, что самым выгодным получается написание функционального теста и «дело в шляпе» как говорится. Это позволяет рефакторить большой модуль и не бояться постоянного падения тестов из-за того, что какой-то класс поменял api. Функциональные тесты часто тратят гораздо меньше времени, но, конечно, это не серебряная пуля и модульные тоже нужны.

Скажем так, что в вакууме модульные тесты нужны программистам для рефакторинга, а функциональные нужны заказчику.
Ответ написан
Комментировать
@egorinsk
> + ко всему меня еще смущает работа с файлами тем что это похоже на «интеграционный» тип тестирования, а этим не должен заниматься юнит-тест.

Юнит-тесту никто не запрещает прочитать файл в память до тестирования и отдавать тестируемому коду уже набор байт из памяти или что он там принимает на вход. Если ваш код требует на вход объект StreamPtr_t (какое странное название), то сделайте специально для тестов простейший MemoryStreamReader на 20 строчек.

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

А специально превращать файлы в портянки вроде "\xff" смахивает на извращение.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы