На каком уровне я должен юнит-тест? - PullRequest
2 голосов
/ 04 августа 2009

Допустим, в моей пользовательской модели у меня есть метод ChangePassword. Учитывая уже инициализированную модель пользователя, он принимает новый пароль в качестве параметра и работает с базой данных, чтобы волшебство произошло. Фронт-эндом к этому является веб-форма, где пользователь вводит свой текущий пароль и желаемый новый пароль. Затем контроллер проверяет правильность текущего пароля пользователя. Если это так, он вызывает метод ChangePassword пользовательской модели. Если нет, то отображается ошибка для пользователя.

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

Должен ли я:

A) Модульное тестирование только с контроллера, а также эффективное тестирование функции модели?

OR

Б) Создать 2 разных теста; один для контроллера и один для модели?

Ответы [ 6 ]

4 голосов
/ 04 августа 2009

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

2 голосов
/ 04 августа 2009

A)

  • Тест не пройден. У вас проблема с моделью или контроллером, или с обоими, и вы тратите время на поиск модели и контроллера.

B)

  • Тесты модели и контроллера не пройдены ... скорее всего, у вас проблема с моделью.
  • Только тест контроллера не пройден ... Скорее всего, проблема не в модели, а только в контроллере.
  • Только тест модели не пройден ... трудно увидеть, что это происходит, но если это так или иначе, значит, проблема в модели, а не в контроллере.

Хорошо проверить оба слоя. Позже будет гораздо проще найти проблему.

1 голос
/ 04 августа 2009

Возможно, вы захотите рассмотреть другой вариант: Макет объектов . Используя их, вы можете протестировать контроллер без модели, что может привести к более быстрому выполнению теста и повышению надежности теста (если модель не работает, вы знаете, что контроллер все еще работает). Теперь у вас есть два правильных модульных теста (оба тестируют только один фрагмент кода каждый), и вы все равно можете добавить интеграционный тест, если требуется.

1 голос
/ 04 августа 2009

Здесь должно быть несколько тестов:

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

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

0 голосов
/ 04 августа 2009

Юнит-тестирование означает тестирование каждого юнита по отдельности, поэтому в этом случае вам потребуется создать два юнит-теста: один для внешнего интерфейса и один для внутреннего.

Чтобы проверить комбинацию обоих интеграционных тестов, по крайней мере, ITSQB называет это так.

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

0 голосов
/ 04 августа 2009

A), на мой взгляд, не является модульным тестом, поскольку в нем используется более одного класса (или слоя). Таким образом, вы действительно должны проводить юнит-тестирование только модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...