Как вы управляете фиктивными данными, используемыми для тестов? Держите их со своими юридическими лицами? В отдельном тестовом проекте? Загрузите их с помощью Serializer из внешних ресурсов? Или просто воссоздайте их там, где это необходимо?
У нас есть стек приложений с несколькими модулями в зависимости от другого с каждым содержащим объекты. Каждый модуль имеет свои собственные тесты и нуждается в фиктивных данных для работы.
Теперь для модуля, который имеет множество зависимостей, потребуется много фиктивных данных из других модулей. Тем не менее, они не публикуют свои фиктивные объекты, потому что они являются частью тестовых ресурсов, поэтому все модули должны настраивать все фиктивные объекты, которые им нужны снова и снова.
Кроме того: большинство полей в наших объектах не являются нулевыми, поэтому даже выполнение транзакций в отношении слоя объекта требует, чтобы они содержали некоторое значение, большую часть времени с дополнительными ограничениями, такими как уникальность, длина и т.д.
Есть ли лучший выход из этого или все решения компрометируют?
Подробнее
Наш стек выглядит примерно так:
Один модуль:
src/main/java --> gets jared (.../entities/*.java contains the entities)
src/main/resources --> gets jared
src/test/java --> contains dummy object setup, will NOT get jared
src/test/resources --> not jared
Мы используем Maven для обработки зависимостей.
Пример модуля:
- Модуль A содержит несколько фиктивных объектов
- Модуль B нуждается в собственных объектах И так же, как и модуль A
Вариант a)
Модуль тестирования T может содержать все фиктивные объекты и предоставлять их в тестовой области (так что загруженные зависимости не получают jared) ко всем тестам во всех модулях. Будет ли это работать? Значение: если я загружаю T в A и запускаю установку на A, он НЕ содержит ссылки, введенные T, особенно не B? Затем, однако, A будет знать о B datamodel.
Вариант b)
Модуль A предоставляет фиктивные объекты где-то в src/main/java../entities/dummy
, позволяя B получать их, а A не знает о B фиктивных данных
Вариант c)
Каждый модуль содержит внешние ресурсы, которые представляют собой сериализованные фиктивные объекты. Они могут быть десериализованы тестовой средой, которая им нужна, поскольку она имеет зависимость от модуля, к которому они принадлежат. Это потребует, чтобы каждый модуль создавал и сериализовал свои фиктивные объекты, и как это сделать? Если с другим unit test он вводит зависимости между модульными тестами, которые никогда не должны происходить или с script, будет сложно отлаживать и не гибко.
Вариант d)
Используйте фреймовую структуру и назначьте необходимые поля вручную для каждого теста по мере необходимости. Проблема здесь в том, что большинство полей в наших объектах не имеют значения NULL, и, следовательно, потребуются сеттеры или конструкторы, которые будут вызваны нами в начале снова.
Что мы не хотим
Мы не хотим настраивать статическую базу данных со статическими данными, поскольку структура требуемых объектов будет постоянно изменяться. Много сейчас, немного позже. Поэтому мы хотим, чтобы hibernate настраивал все таблицы и столбцы и заполнял их данными во время модульного тестирования. Также статическая база данных вводит множество потенциальных ошибок и проведет взаимозависимости.
Мои мысли идут в правильном направлении? Какая наилучшая практика для тестирования тестов, требующих большого количества данных? У нас будет несколько взаимозависимых модулей, для которых потребуются объекты, заполненные некоторыми данными из нескольких других модулей.
ИЗМЕНИТЬ
Дополнительная информация о том, как мы это делаем сейчас, в ответ на второй ответ:
Итак, для простоты мы имеем три модуля: Person
, Product
, Order
.
Person
проверит некоторые методы менеджера, используя объект MockPerson
:
(in person/src/test/java:)
public class MockPerson {
public Person mockPerson(parameters...) {
return mockedPerson;
}
}
public class TestPerson() {
@Inject
private MockPerson mockPerson;
public testCreate() {
Person person = mockPerson.mockPerson(...);
// Asserts...
}
}
Класс MockPerson
не будет упакован.
То же самое относится к тестированию продукта:
(в файле /src/test/java:)
public class MockProduct() { ... }
public class TestProduct {
@Inject
private MockProduct mockProduct;
// ...
}
MockProduct
необходим, но не будет упакован.
Теперь для тестов заказа потребуются MockPerson
и MockProduct
, поэтому теперь нам нужно создать как теги, так и MockOrder
для тестирования Order
.
(в порядке /src/test/java:)
Это дубликаты, и их нужно будет менять каждый раз, когда Person
или Product
изменяет
public class MockProduct() { ... }
public class MockPerson() { ... }
Это единственный класс, который должен быть здесь:
public class MockOrder() { ... }
public class TestOrder() {
@Inject
private order.MockPerson mockPerson;
@Inject
private order.MockProduct mockProduct;
@Inject
private order.MockOrder mockOrder;
public testCreate() {
Order order = mockOrder.mockOrder(mockPerson.mockPerson(), mockProduct.mockProduct());
// Asserts...
}
}
Проблема заключается в том, что теперь мы должны обновлять person.MockPerson
и order.MockPerson
при изменении Person
.
Разве не лучше просто публиковать Mocks с банкой, чтобы каждый другой тест, который имеет зависимость в любом случае, может просто вызвать Mock.mock и получить красиво настроенный объект? Или это темная сторона - простой способ?