2013-09-11 6 views
0

Мне нужно написать некоторые классы тестов интеграции в 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()); 

Если я не делаю этого есть много дублирования в тестовых классах.

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

ответ

0

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

Я сделал аналогичный дизайн в нескольких проектах без каких-либо проблем.

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

+0

В коде проекта все значения данных сохраняются в базе данных, и модуль может вызывать сервисы (например, UserService, ProductService ...) для получения моделей и выполнения некоторой логики. Я пытаюсь «имитировать» эту базу данных, потому что, если я помещаю реальные данные, чем тест, слишком зависимый от данных и менее гибкий – Vincenzo

0

Как создать его в виде абстрактного класса (как и в вашем тесте AbstractTest) со всеми необходимыми функциями, которые вам понадобятся во всех ваших тестах. Затем вы можете просто расширить свой абстрактный класс, чтобы наследовать все его свойства, и написать любую дополнительную функциональность на основе ваших конкретных тестов. Что-то вроде DefaultUserTest extends BaseTest { protected UserModel createDefaultUser() {} }

+0

Если вы имеете в виду, что realTest расширяет DefaultUserTest, который расширяет AbstractTest, у меня могут быть проблемы, когда классу нужны две разделенные функции. Например, тест для продуктов, наиболее просматриваемых пользователем, должен иметь createDefaultUser() и createDefaultProduct() – Vincenzo

+0

Нет, я имею в виду, что вы можете создать baseTest, а затем позволить вашему realTest расширять это. Конечно, настоящий тест, в свою очередь, будет составлять классы, чтобы вы могли протестировать createDefaultUser() и createDefaultProfile() в одном тестовом случае. – gyan

+0

А, ок. Это то, что я сейчас делаю, все классы тестов наследуют от AbstractTestClass. Проблема в том, что AbstractTestClass имеет тенденцию быть очень длинной и неоднородной. – Vincenzo