Подтвердить что ты не робот

Является ли модульное тестирование частными методами хорошей практикой?

Мне интересно, эффективна ли частная проверка единиц тестирования?

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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