В настоящее время я нахожусь в положении, когда я должен написать модульные тесты для исходного кода. У меня есть полная видимость (что, на мой взгляд, означает, что это считается тестированием белого ящика?). Таким образом, это не тестовое развитие.Тестирование модулей и тестирование белого ящика
Чтение этого (What is the difference between integration and unit tests?) разъясняло многое о том, для чего цель всего этого, но я все еще смущен о моем текущем положении.
Скажем, у меня есть метод, как так:
/* Some basic description on what doSomething() does */
public int doSomething(Var someVariable) {
int someInteger = [code does a bunch of stuff to get this];
someInteger = someOtherClassObject.doSomethingElse(someInteger);
return someInteger;
}
Теперь, я не знаю, что doSomething()
должен делать. Документации недостаточно для того, чтобы действительно сказать мне, что int предположительно выйдет на основе someVariable
, и я недостаточно разбираюсь в исходном коде, чтобы действительно придумать его сам.
Но у меня есть реализация, поэтому я смотрю на метод, положить в некоторых Var
в качестве входа, и следовать кодексу и утверждать, против того, что он выглядит, как он бы возвращения.
public void testDoSomething() {
ClassWithDoSomething object = new ClassWithDoSomething();
assertEquals([what it looks like it would return], object.doSomething(new Var([some input would go here]));
}
Где каким-то образом, каким-то образом, я дразнить из вызова doSomethingElse() и конструктор Var (и других зависимостей внешнего класса, если это необходимо).
Я не знаю, правильно ли это происходит с этими модульными тестами. Я думаю, что я изолирую метод так, как должен, но я не знаю, насколько значимым является мое утверждение в определении, есть ли ошибка или нет, потому что я знаю, что должен делать метод doSomething()
в коде, и как это будет сделано, и поэтому я написал свое утверждение, чтобы получить этот результат.
Ответ, который я прочитал, подробно описывает, как модульные тесты полезны из-за изолированного отказа метода doSomething()
. Но когда будет выполняться его единичный тест, кроме того, когда изменяется реализация приложения doSomething()
(что будет означать изменение в модульном тесте)?
Является ли это проблемой не слишком хорошо зная исходный код/исходный код недостаточно хорошо документирован, чтобы просто знать, какой результат я должен получать?
Если [code does a bunch of stuff to get this]
был на самом деле просто someVariable + 3
где someVariable был Int, она считается содержательной Assert утверждать, что возвращаемое значение someVariable + 3
, когда я знаю, что тест будет проходить на основе этой реализации?
Я подозреваю, что этот вопрос больше подходит для сайта [программистов] (http://programmers.stackexchange.com/). Если другие люди согласны, возможно, это может быть мигрировано. – shuttle87
Это очень похоже на код, с которым вы имеете дело, никогда не предназначался для проверки. Посмотрите на тестирование методов и функций с наименьшими побочными эффектами, а затем перейдите к более крупным после того, как вы это сделали. Поэтому в этом случае я начну с написания модульных тестов для 'doSomethingElse' перед тем, как писать какие-либо для' doSomething', поскольку результаты 'doSomething' будут зависеть от' doSomethingElse'. При тестировании 'doSomething' я тогда издевался бы над результатами' doSomethingElse', вы можете предположить, что 'doSomethingElse' работает так, как предполагалось в момент, когда вы используете тестирование' doSomething'. – shuttle87
Я просто согласен с тем, что код на самом деле не предназначен для проверки? Потому что я могу проверить doSomethingElse() и doSomething(), как вы предлагаете (и это то, что я делал). Просто мои утверждения отражают то, что я вижу, должно быть результатом исходного кода. И в конечном итоге я не знаю, насколько это значимо, потому что я могу написать это, чтобы пройти, и я не знаю, есть ли другой вариант. – Qianpou