2015-09-03 5 views
-1

Я читал here, что тестирование черного ящика (тестирование только API без деталей реализации) предпочтительнее в большинстве ситуаций. Однако, если я пишу только тесты с «черным ящиком», где мне не нужна фактическая реализация, откуда я знаю, как обрабатывать любые зависимости метода для тестирования? Представьте, что мы делаем запрос базы данных в нашем методе для тестирования. Обычно я подделывал бы этот вызов таким образом, который всегда возвращает некоторые поддельные данные, чтобы проверить, соответствует ли мой собственный метод этим данным. В рамках моего теста я не забочусь о том, откуда на самом деле поступают данные, поэтому я подделываю его.Blackbox-тесты против whitebox

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

Так что мой вопрос: есть ли обработка зависимостей, относящаяся к черным ящикам вообще?

+2

Чувства, подобные большому аргументу эндианта. Это ваш класс; это ваш тест. Внесите издевательства и продолжайте с ним. – duffymo

+0

@duffymo Чтобы это сделать, я должен знать, ЧТО издеваться над ними и из-за внутренних. – HimBromBeere

+0

Да, но это ваш класс. Вы знаете, что такое зависимости. Вы говорите об устройстве, проверяющем ваши вещи, не так ли? Если это классы, написанные другими, у вас есть исходный код. Не так ли? Или вы закрываете глаза, когда кодируете? Обязательно закрывайте глаза и притворяйтесь, что у вас нет исходного кода. Напишите свои модульные тесты, обратившись только к javadocs. Как это может работать? – duffymo

ответ

1

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

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

В примере, связанном с изменением AdderFactory, это изменение детали реализации, а не изменение зависимости, поскольку ничего здесь не нужно издеваться, и существующий тест продолжит тестирование AdderFactory.

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

+0

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

+0

зависит от того, что ваш класс требует «результата» от другого класса, деталь реализации - это то, что вы делаете через базу данных. –