Код модульного тестирования с зависимостью файловой системы

Если строки велики, вы хотите использовать Rabin-Karp , в итоге:

  • развертки окна размера подстроки, перемещение по строке
  • хэш с O (1) служебными данными для добавления и удаления (т. е. перемещение на 1 символ)
  • , реализованного в C или полагающегося на pypy

129
задан Lii 7 December 2016 в 13:06
поделиться

9 ответов

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

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

42
ответ дан Adam Rosenfield 7 December 2016 в 13:06
поделиться

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

Мое взятие на этом - то, что Ваши модульные тесты сделали бы столько, сколько они могут, который не может быть 100%-м покрытием. На самом деле это могут только быть 10%. Точка, Ваши модульные тесты должны быть быстрыми и не иметь никаких внешних зависимостей. Они могли бы протестировать случаи как "этот метод броски ArgumentNullException, когда Вы передаете в пустом указателе для этого параметра".

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

При измерении покрытия кода, я измеряю и модульные и интеграционные тесты.

23
ответ дан Tim Cooper 7 December 2016 в 13:06
поделиться
  • 1
    @RahulTripathi while(false) является ошибкой времени компиляции. if(false) может производить предупреждение, но явно не ошибка времени компиляции. – chrylis 30 November 2013 в 23:05

Нет ничего неправильно с ударом файловой системы, просто считайте это интеграционным тестом, а не модульным тестом. Я подкачал бы твердый кодированный путь с относительным путем и создал бы подпапку TestData для содержания zip для модульных тестов.

, Если Ваши интеграционные тесты занимают слишком много времени работать затем, выделяют их так, они не работают так же часто как Ваши быстрые модульные тесты.

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

8
ответ дан JC. 7 December 2016 в 13:06
поделиться
  • 1
    @luukburger:-Да Вы корректны. Я понял его превратно. Я обновил свой ответ и объяснение, почему компилятор не бросит ошибку! – Rahul Tripathi 30 November 2013 в 23:17

Один путь состоял бы в том, чтобы записать разархивировать метод для взятия InputStreams. Затем модульный тест мог создать такой InputStream из использования массива байтов ByteArrayInputStream. Содержание того массива байтов могло быть константой в коде модульного теста.

6
ответ дан nsayer 7 December 2016 в 13:06
поделиться
  • 1
    Но это не запишет на исходном изображении. Это создаст пустое изображение и запишет на этом. Таким образом, наконец данные не записаны на исходном изображении. – Banketeshvar Narayan 12 January 2014 в 01:41

Это, кажется, больше интеграционного теста, как Вы в зависимости от определенной детали (файловая система), который мог измениться в теории.

я абстрагировал бы код, который имеет дело с ОС в свой собственный модуль (класс, блок, банка, безотносительно). В Вашем случае Вы хотите загрузить определенный DLL, если найдено, поэтому сделайте интерфейс IDllLoader и класс DllLoader. Имейте свое приложение, получают DLL от DllLoader с помощью интерфейса и теста это.. Вы не ответственны за разархивировать код afterall право?

3
ответ дан tap 7 December 2016 в 13:06
поделиться

Предположение, что "взаимодействия файловой системы" хорошо тестируются в самой платформе, создает Ваш метод, чтобы работать с потоками и протестировать это. Открытие FileStream и передача его к методу могут быть упущены из Ваших тестов как FileStream. Открытый хорошо тестируется создателями платформы.

2
ответ дан Sunny Milenov 7 December 2016 в 13:06
поделиться

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

1
ответ дан Dror Helper 7 December 2016 в 13:06
поделиться

Для модульного теста я предложил бы, чтобы Вы включали тестовый файл в свой проект (файл EAR, или эквивалентный) затем используют относительный путь в модульных тестах т.е. "../testdata/testfile".

, пока Ваш проект правильно экспортируется/импортируется, чем Ваш модульный тест должен работать.

1
ответ дан James Anderson 7 December 2016 в 13:06
поделиться

Как другие сказали, первое прекрасно как интеграционный тест. Вторые тесты только, что функция, как предполагается, на самом деле делает, который является всем модульный тест, должны сделать.

Как показано, второй пример выглядит немного бессмысленным, но он действительно дает Вам возможность протестировать, как функция отвечает на ошибки на любом из шагов. У Вас нет проверки ошибок в примере, но в реальной системе Вы можете иметь, и внедрение зависимости позволило бы Вам протестировать все ответы на любые ошибки. Затем стоимость будет стоить того.

0
ответ дан David Sykes 7 December 2016 в 13:06
поделиться
Другие вопросы по тегам:

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