1 тестовый класс для каждого «настоящего» класса.
Обычно я иду по этой схеме. Конечно, тесты для интерфейсов не имеют особого смысла, и бывают случаи, когда небольшие классы «сущностей» только с методами getter и setter (то есть без логики) не нуждаются в соответствующем классе теста.
Тем не менее, я был удивлен тем, какую полезность я нашел в модульных тестах даже для очень маленьких классов. Например, даже классы сущностей, имеющие только методы get / set, которые хранятся в базах данных с помощью методов DAO, должны быть протестированы на случай, если какая-то из проводок базы данных неверна. Вы никогда не знаете, когда у вас есть несоответствующий метод get / set, или toString()
, асимметричный hashcode()
или equals()
, или другие проблемы.
Весь смысл «модульных» тестов заключается в (ИМХО) тестировании самого маленького модуля вашего кода изолированно - это класс. Поэтому, когда у меня есть класс ContainerUtil
, я ищу соответствующий класс ContainerUtilTest
в тестовом каталоге. Я часто запускаю тесты покрытия и ожидаю, что будут покрыты практически все логические части всех классов.
1 тестовый класс для каждого пакета или даже всего проекта.
У меня может быть и это , а также , но тогда я бы посчитал, что это "интеграционные" тесты. Тесты, которые связывают между классами или между различными частями проекта, чтобы убедиться, что ваш проект работает в целом.
Но это будет в дополнение к вашим юнит-тестам.
Методы испытаний в «реальном» классе без класса испытаний.
Да, нет. Действительно плохая идея. Вы не хотите, чтобы ваш производственный код включал тестовый код, если это вообще возможно. Это уменьшает читабельность ваших классов, увеличивает изменения, которые вы что-то ломаете при попытке проверить и т. Д. Просто скажите нет.
Я также держу свои тестовые классы подальше от источников. Я обычно использую maven, поэтому мои источники находятся в src/main/java
, а мои тесты - в src/test/java
. Вы не хотите, чтобы ваши тесты попали в файлы jar или war, где они могут запутать других.