В моем текущем проекте мне трудно найти хорошее решение для создания масштабируемых интеграционных тестов, которые не имеют побочных эффектов. Небольшое уточнение о свободном от побочных эффектов свойстве: в основном это касается базы данных; после завершения тестов в базе данных не должно быть никаких изменений (состояние должно быть сохранено). Возможно, масштабируемость и сохранение состояния не объединяются, но я действительно хочу стремиться к лучшему решению.
Вот типичный интеграционный тест (эти тесты касаются уровня базы данных):
public class OrderTests {
List<Order> ordersToDelete = new ArrayList<Order>();
public testOrderCreation() {
Order order = new Order();
assertTrue(order.save());
orderToDelete.add(order);
}
public testOrderComparison() {
Order order = new Order();
Order order2 = new Order();
assertFalse(order.isEqual(order2);
orderToDelete.add(order);
orderToDelete.add(order2);
}
// More tests
public teardown() {
for(Order order : ordersToDelete)
order.delete();
}
}
Как можно себе представить, этот подход дает очень медленные тесты. А применительно ко всем интеграционным тестам требуется около 5 секунд, чтобы протестировать только небольшую часть системы. Я могу представить, что это число будет расти, когда охват увеличится.
Каков был бы другой подход для написания таких тестов? Одна альтернатива, о которой я могу подумать, - это иметь вид глобальных переменных (внутри класса), и все методы тестирования разделяют эту переменную. В результате только несколько заказов создаются и удаляются; в результате чего более быстрые тесты. Тем не менее, я думаю, что это представляет большую проблему; тесты больше не изолированы, и их становится все труднее понимать и анализировать.
Может случиться так, что интеграционные тесты не предназначены для запуска так часто, как модульные тесты; поэтому низкая производительность может быть приемлемой для тех. В любом случае было бы замечательно узнать, если кто-то придумал альтернативы для улучшения масштабируемости.