В моем последнем проекте у нас было Unit Testing с почти 100% cc, и в результате у нас почти не было ошибок. Однако, поскольку Unit Testing должен быть White Box (вы должны издеваться над внутренними функциями, чтобы получить желаемый результат, поэтому ваши тесты должны знать о внутренней структуре вашего кода) в любое время, когда мы меняли реализацию функции, нам приходилось также измените тесты. Обратите внимание, что мы не изменили логику функций, а только реализацию. Это было очень много времени, и мне казалось, что мы работаем не так. Поскольку мы использовали все надлежащие рекомендации ООП (в частности, инкапсуляцию), каждый раз, когда мы меняли реализацию, нам не приходилось менять остальную часть нашего кода, но приходилось менять модульные тесты. Мне казалось, что мы проводим тесты, а не обслуживаем нас.
Чтобы этого не случилось, некоторые из нас утверждали, что модульные тесты должны проводиться в Black Box Testing. Это было бы возможно, если мы создадим один большой макет нашего всего Домена и создадим заглушку для каждой функции в каждом классе в одном месте и будем использовать ее в каждом unit test. Конечно, если конкретный тест нуждается в конкретной внутренней функции, которую нужно вызвать (например, чтобы мы записывали в БД), мы можем переопределить наш заглушку.
Итак, каждый раз, когда мы меняем реализацию функции (например, добавляем или заменяем вызов функции справки), нам нужно будет только изменить наш главный большой макет. Даже если нам нужно изменить некоторые модульные тесты, все равно будет намного меньше, чем раньше.
Другие утверждают, что модульные тесты должны быть White Box, так как вы не только хотите, чтобы ваше приложение записывалось в БД в определенном месте, вы хотите, чтобы ваше приложение не записывалось в базу данных где-нибудь еще, ожидайте этого. Хотя это действительный момент, я не думаю, что это стоит времени для написания тестов White Box вместо тестов Black Box.
Итак, в заключение, 2 вопроса:
-
Что вы думаете о концепции тестирования модулей Black Box?
-
Что вы думаете о том, как мы хотим реализовать эту концепцию? У вас есть лучшие идеи?