Что не протестировать когда дело доходит до Поблочного тестирования?

Когда вы используете getClass().getResource(...), вы загружаете ресурс, не указывая путь к файлу. В случае, когда загрузчик классов загружает классы из файловой системы, они, по существу, приравниваются к одной и той же вещи, и на самом деле это работает (хотя даже тогда нет технической причины, по которой это необходимо). Когда загрузчик классов загружает классы другими механизмами (и, вероятно, во всех случаях), важно обратить внимание на спецификации Java для ресурса .

В частности, примечание:

Ресурсы, имена и контексты

Ресурс идентифицируется строкой, состоящей из последовательности подстрок, разделенных косой чертой (/), за которой следует ресурс имя. Каждая подстрока должна быть допустимым идентификатором Java. Имя ресурса имеет форму shortName или shortName.extension. И shortName, и extension должны быть идентификаторами Java.

blockquote>

(Мой акцент.) Поскольку .. не является допустимым идентификатором Java, нет гарантии того, что этот ресурс будет разрешаемым. Случается, что загрузчик классов файловой системы решает это так, как вы ожидаете, поэтому он работает в вашей среде IDE, но реализация getResource(...) в загрузчике класса jar не реализует это так, как вы надеетесь.

Попробуйте

FXMLLoader loader = new FXMLLoader(getClass().getResource("/sm/customer/CustomerHome.fxml"));

Использование мест расположения контроллеров для загрузки FXML:

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

FXMLLoader loader = new FXMLLoader(CustomerHomeCtrl.class.getResource("CustomerHome.fxml"));

Это кажется довольно естественно, в этой настройке, и компилятор проверяет, что у вас есть имя пакета для CustomerHomeCtrl правильно в точке, где вы импортируете класс. Это также облегчает рефакторинг: например, предположим, что вы хотели разделить sm.admin на несколько подпакетов. В Eclipse вы создадите подпакеты, перетащите FXML и контроллеры в соответствующие подпакеты, а операторы импорта будут автоматически обновляться: дальнейших изменений не потребуется. В случае, когда путь указан в getResource(...), все это нужно было бы поменять вручную.

33
задан spinodal 6 November 2008 в 15:54
поделиться

20 ответов

Здесь я нашел (через , взломал что-то, что Michael Feathers говорит, что это может быть ответом:

Он говорит,

, тест А не является модульным тестом если:

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

Снова в той же статье он добавляет:

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

37
ответ дан spinodal 11 October 2019 в 07:51
поделиться

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

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

0
ответ дан Kris 11 October 2019 в 07:51
поделиться

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

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

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

0
ответ дан Horcrux7 11 October 2019 в 07:51
поделиться

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

0
ответ дан Rob Walker 11 October 2019 в 07:51
поделиться

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

1
ответ дан Adron 11 October 2019 в 07:51
поделиться

Я не соглашаюсь с ответом quamrana относительно не тестирования стороннего кода. Это - идеальное использование модульного теста. Что, если ошибка (ошибки) представлена в новом выпуске библиотеки? Идеально, когда новая сторонняя библиотека версии выпущена, Вы выполняете модульные тесты, которые представляют ожидаемое поведение этой библиотеки проверить, что это все еще работает как ожидалось.

1
ответ дан Mitch Wheat 11 October 2019 в 07:51
поделиться

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

Исчерпывающе тестирующие вещи как представление форм, доступ к базе данных, доступ FTP, и т.д. на очень подробном уровне является часто просто пустой тратой времени; если программное обеспечение, записанное потребности очень высокий уровень надежности (материал на 99,999%) поблочное тестирование слишком много, не может быть излишеством и оперативным приемником.

1
ответ дан wprl 11 October 2019 в 07:51
поделиться

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

Что-либо вне этого - интеграционное тестирование.

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

Остальные должны быть достаточно для только для создания Вас способными записать Ваш код в нем, не больше, не меньше.

1
ответ дан 11 October 2019 в 07:51
поделиться

Что-либо, что не абсолютно детерминировано, нет - нет для поблочного тестирования. Вы хотите, чтобы Ваши модульные тесты ВСЕГДА передали или перестали работать с теми же начальными условиями - если странность как поточная обработка или случайное поколение данных, или время/даты или внешние сервисы может влиять на это, то Вы не должны покрывать его в своих модульных тестах. Время/даты является особенно противным случаем. Можно обычно проектировать код для имения даты для работы с быть введенными (кодом и тестами) вместо того, чтобы полагаться на функциональность в текущей дате и время.

, Который сказал, хотя, модульные тесты не должны только находиться на одном уровне тестирования в Вашем приложении. Достижение 100%-го покрытия модульного теста часто является пустой тратой времени, и быстро встречает убывающую доходность.

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

2
ответ дан madlep 11 October 2019 в 07:51
поделиться

Что-либо, чему нужна очень большая и сложная установка. Конечно, можно протестировать ftp (клиент), но тогда необходимо установить FTP-сервер. Для модульного теста Вам нужна восстанавливаемая тестовая установка. Если Вы не можете обеспечить его, Вы не можете протестировать его.

1
ответ дан EricSchaefer 11 October 2019 в 07:51
поделиться

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

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

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

2
ответ дан Angelo van der Sijpt 11 October 2019 в 07:51
поделиться

Большинство тестов, та потребность, огромная и дорогая (в стоимости ресурса или computationtime) установки, является интеграционными тестами. Модульные тесты должны (в теории), только тестируют небольшие единицы кода. Отдельные функции.

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

очень полезно сделать различие между модульными тестами и интеграционными тестами. Модульные тесты должны работать очень быстро. Должно быть легко возможно выполнить все Ваши модульные тесты перед регистрацией в коде.

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

Так для ответа на вопрос: Сделайте сетевые вещи модульного теста, которые лучше реализованы как интеграционный тест (и также не тестируйте метода get/метод set - это - пустая трата времени;-)).

2
ответ дан Mo. 11 October 2019 в 07:51
поделиться

@GarryShutler

я на самом деле unittest электронная почта при помощи фальшивки smtp (Более мудрый) сервер. Удостоверяется Вы, код приложения корректен:

http://maas-frensch.com/peter/2007/08/29/unittesting-e-mail-sending-using-spring/

Что-то как этот могло, вероятно, быть сделано для других серверов. Иначе необходимо быть в состоянии дразнить API...

BTW: 100%-е покрытие является только началом... просто означает, что весь код имеет на самом деле боб, выполняемый однажды .... ничто о пограничных случаях и т.д.

2
ответ дан p3t0r 11 October 2019 в 07:51
поделиться

Доступ к данным возможен, потому что можно настроить тестовую базу данных.

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

кроме того, 100%-е покрытие кода недостаточно самостоятельно.

3
ответ дан Andrew Grimm 11 October 2019 в 07:51
поделиться

Поблочное тестирование GUI является также трудным, хотя не невозможный, я предполагаю.

3
ответ дан Thomas 11 October 2019 в 07:51
поделиться

Что Вы не протестировали бы? Что-либо, что не могло возможно повредиться.

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

4
ответ дан quamrana 11 October 2019 в 07:51
поделиться

Цель не является 100%-м покрытием кода, ни является им 80%-е покрытие кода. Модульный тест, являющийся легким записать, не означает, что необходимо записать его, и, модульные тесты, являющиеся твердым записать, не означают, что необходимо избежать усилия.

цель любого теста состоит в том, чтобы обнаружить пользователя видимые проблемы самым afforable способом.

общая стоимость авторской разработки, поддержания и диагностирования проблем, отмеченных тестом (включая ложные положительные стороны) стоящий проблем, которые ловит определенный тест?

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

базовая цель модульного теста состоит в том, чтобы защитить devs от ошибок реализации. Тот один должен указать, что так слишком много усилия будет отходами. После определенного момента там лучшие стратегии получения корректной реализации. Также после определенного момента пользователь видимые проблемы происходят из-за корректной реализации неправильной вещи, которая может только быть поймана уровнем пользователя или интеграционным тестированием.

7
ответ дан Steve Steiner 11 October 2019 в 07:51
поделиться

достижение 100%-го покрытия кода почти всегда расточительно. Существует много ресурсов на этом.

Ничто не невозможно к модульному тесту, но всегда существует убывающая доходность. Это не может стоить того к вещам модульного теста, которые являются болезненными к модульному тесту.

10
ответ дан Aaron Jensen 11 October 2019 в 07:51
поделиться

То, что 100%-е покрытие является мифом, который это, не означает, что 80%-е покрытие бесполезно. Цель, конечно, составляет 100%, и между модульными тестами и затем интеграционными тестами, можно приблизиться к ней.

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

13
ответ дан Kevin Little 11 October 2019 в 07:51
поделиться

"Что не протестировать когда дело доходит до Поблочного тестирования?" * Бобы только с методами get и методами set. Обоснование: Обычно пустая трата времени, которая могла быть лучше потрачена, тестируя что-то еще.

2
ответ дан Vivek Kodira 11 October 2019 в 07:51
поделиться
Другие вопросы по тегам:

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