У моєму поточному проекті мені важко придумати хороше рішення для створення масштабованих тестів на інтеграцію, які не мають побічних ефектів. Невелике уточнення щодо побічних властивостей вільної дії: йдеться переважно про базу даних; після завершення тестів не повинно бути ніяких змін у базі даних (стан повинен зберігатися). Можливо, масштабність та збереження держави не поєднуються, але мені дуже хочеться наполягати на кращому рішенні.
Ось типовий тест на інтеграцію (ці тести стосуються шару бази даних):
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 секунд, щоб протестувати лише невелику частину системи. Я можу уявити, що ця кількість зростає, коли покриття збільшується.
Який би був ще один підхід до написання таких тестів? Я можу подумати про те, що є різновиди глобальних змінних (у класі), і всі методи тестування мають цю змінну. В результаті створюються та видаляються лише кілька замовлень; що призводить до більш швидких тестів. Однак я вважаю, що це створює більшу проблему; тести вже не поодинокі, і їх стає важче зрозуміти та проаналізувати.
Можливо, просто те, що тести інтеграції не запускаються так часто, як одиничні тести; тому низька продуктивність може бути прийнятною для них. У будь-якому випадку, було б чудово знати, чи хтось придумав альтернативи для покращення масштабованості.