Тестовые классы с обычным поведением
Мне нужно написать несколько классов интеграционных тестов в Hybris Commerce Suite, и большинство из них имеют общее поведение для настройки системы (сайт, магазин, каталог, страна,...) или для выполнения некоторых общих действий, таких как создание клиента.
Я создал абстрактный класс, который выполняет всю инициализацию с постоянными значениями в методе @Before и с некоторыми распространенными методами, такими как createDefaultCustomer().
Все мои тестовые классы наследуются от этого класса.
Значения констант разделены на разные классы констант, такие как
abstract class AbstractTest {
protected static final class USER_CONSTANTS {
};
protected static final class CATALOG_CONSTANTS {
};
protected UserModel createDefaultUser() {
}
}
Теперь, чтобы проверить, в моих подклассах я могу сделать
createDefaultUser();
UserData userData = userFacade.getUserById(USER_CONSTANTS.ID);
assertEquals(USER_CONSTANTS.ID, userData.getId());
Если я этого не сделаю, в тестовых классах будет много дублирования.
Я сомневаюсь, что это приемлемо, потому что абстрактный класс имеет тенденцию быть длинным и богатым на методы, или мне нужно изменить дизайн. Я хотел бы избежать создания отдельных классов для каждой группы констант.
2 ответа
Я думаю, что вполне нормально использовать базовый тестовый класс для вашего общего кода, а затем расширять его в каждом из тестовых классов. Фактически стратегия тестирования должна соответствовать дизайну кода проекта. Я уверен, что ваш модуль проекта также будет иметь некоторый общий код, ваш общий раздел тестирования в основном соответствует функциональности кода проекта.
Я сделал аналогичный дизайн в нескольких проектах без каких-либо проблем.
Таким образом, всякий раз, когда в вашем проекте изменяется общая функциональность, это влияет на контрольный пример в общем классе тестирования, в то время как конкретные изменения связаны с определенным классом тестирования.
Как насчет создания его как BaseTest
абстрактный класс (как и ваш AbstractTest) со всеми необходимыми функциями, которые понадобятся вам во всех ваших тестах. Затем вы можете просто расширить свой абстрактный класс для наследования всех его свойств и написать любую дополнительную функциональность на основе ваших конкретных тестов. Что-то вроде DefaultUserTest extends BaseTest { protected UserModel createDefaultUser() {} }