Dalam proyek saya saat ini, saya mengalami kesulitan menghasilkan solusi yang baik untuk membuat tes integrasi scalable yang tidak memiliki efek samping. Klarifikasi kecil tentang efek samping properti bebas: sebagian besar tentang database; seharusnya tidak ada perubahan dalam database setelah tes selesai (status harus dipertahankan). Mungkin skalabilitas dan pelestarian negara tidak datang bersamaan, tetapi saya benar-benar ingin mendorong solusi yang lebih baik.
Berikut ini adalah tes integrasi khas (tes ini menyentuh lapisan basis data):
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();
}
}
Seperti yang bisa dibayangkan, pendekatan ini menghasilkan tes yang sangat lambat. Dan, ketika diterapkan pada keseluruhan tes integrasi, dibutuhkan sekitar 5 detik untuk menguji hanya sebagian kecil dari sistem. Saya bisa membayangkan angka ini naik ketika cakupan ditingkatkan.
Apa yang akan menjadi pendekatan lain untuk menulis tes seperti itu? Salah satu alternatif yang dapat saya pikirkan adalah memiliki jenis variabel global (dalam kelas) dan semua metode pengujian berbagi variabel ini. Akibatnya, hanya sedikit pesanan yang dibuat & dihapus; menghasilkan tes yang lebih cepat. Namun, saya pikir ini menimbulkan masalah yang lebih besar; tes tidak lagi terisolasi dan semakin sulit untuk memahami & menganalisisnya.
Mungkin saja tes integrasi tidak dimaksudkan untuk dijalankan sesering tes unit; karena itu kinerja rendah mungkin dapat diterima oleh mereka. Dalam kasus apa pun, akan lebih baik untuk mengetahui apakah seseorang datang dengan alternatif untuk meningkatkan skalabilitas.