Является ли модульное тестирование частными методами хорошей практикой? - PullRequest
13 голосов
/ 09 февраля 2012

Мне интересно, является ли юнит-тестирование закрытыми методами хорошей практикой?

Обычно тестируется только публичный интерфейс.

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

В качестве примера, скажем, у вас есть аудиоплеер, и у вас есть функции:

void play(){ ... }
void pause(){ ... }
void seek(time t)
{
    //All Private methods
    checkIfValidTimeRange(...);
    moveToFilePos(...);    
    fillBuffers(...);      
}

Обычно я пишу модульные тесты для: checkIfValidTimeRange(...), moveToFilePos(...), fillBuffers(...).

Но я не уверен, является ли это хорошей практикой.

Ответы [ 4 ]

14 голосов
/ 09 февраля 2012

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

  • moveToFilePos: больше похоже на ответственность за выполнение операций ввода-вывода, а не на музыкальный проигрыватель
  • fillBuffers:большая часть работы менеджера памяти, а не музыкального плеера
  • checkIfValidTimeRange: опять же, возможно, он мог бы быть перемещен из области видимости плеера в какой-то простой класс проверки (кажется, что этот может быть полезен и в других местах)

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

5 голосов
/ 09 февраля 2012

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

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

3 голосов
/ 09 февраля 2012

ИМХО, это очень хорошая идея, я делаю это все время. Я обычно создаю вспомогательный класс, который делает приватные методы доступными, и проверяю его ..

Обычно тестировать приватные методы даже проще, поскольку они делают что-то очень специфическое. С другой стороны, у вас может быть большой публичный метод, который немного сложнее протестировать. Так что это, безусловно, упрощает юнит-тесты.

0 голосов
/ 09 февраля 2012

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

Так что, если ваш метод использует только базовые конструкции вашего языка, протестируйте его!

...