Trong dự án hiện tại của tôi, tôi đang gặp khó khăn khi đưa ra một giải pháp tốt để tạo ra các thử nghiệm tích hợp có thể mở rộng mà không có tác dụng phụ. Một chút làm rõ về thuộc tính miễn phí hiệu ứng phụ: chủ yếu là về cơ sở dữ liệu; không nên có bất kỳ thay đổi nào trong cơ sở dữ liệu sau khi các bài kiểm tra được hoàn thành (trạng thái cần được bảo tồn). Có thể khả năng mở rộng và bảo tồn nhà nước không đi cùng nhau, nhưng tôi thực sự muốn thúc đẩy một giải pháp tốt hơn.
Đây là một thử nghiệm tích hợp điển hình (các thử nghiệm này chạm vào lớp cơ sở dữ liệu):
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();
}
}
Như người ta có thể tưởng tượng, phương pháp này mang lại các bài kiểm tra cực kỳ chậm. Và, khi áp dụng cho toàn bộ các thử nghiệm tích hợp, chỉ mất khoảng 5 giây để kiểm tra một phần nhỏ của hệ thống. Tôi có thể tưởng tượng con số này sẽ tăng lên khi phạm vi bảo hiểm được tăng lên.
Điều gì sẽ là một cách tiếp cận khác để viết các bài kiểm tra như vậy? Một cách khác tôi có thể nghĩ đến là có loại biến toàn cục (trong một lớp) và tất cả các phương thức kiểm tra đều chia sẻ biến này. Kết quả là chỉ có vài đơn hàng được tạo & xóa; dẫn đến các bài kiểm tra nhanh hơn. Tuy nhiên, tôi nghĩ rằng điều này giới thiệu một vấn đề lớn hơn; các bài kiểm tra không còn bị cô lập và ngày càng khó hiểu và phân tích chúng.
Nó có thể chỉ là các thử nghiệm tích hợp không có nghĩa là được chạy thường xuyên như các thử nghiệm đơn vị; do đó hiệu suất thấp có thể được chấp nhận cho những người. Trong mọi trường hợp, sẽ rất tuyệt nếu biết ai đó đã đưa ra các giải pháp thay thế để cải thiện khả năng mở rộng.