Tôi làm việc với rất nhiều ứng dụng web được điều khiển bởi các cơ sở dữ liệu có độ phức tạp khác nhau trên phần phụ trợ. Thông thường, có một lớp ORM tách biệt với logic trình bày và kinh doanh. Điều này làm cho việc kiểm thử đơn vị logic kinh doanh khá đơn giản; mọi thứ có thể được thực hiện trong các mô-đun riêng biệt và bất kỳ dữ liệu nào cần thiết cho thử nghiệm có thể được làm giả thông qua việc chế nhạo đối tượng.
Nhưng việc kiểm tra ORM và bản thân cơ sở dữ liệu luôn gặp nhiều vấn đề và thỏa hiệp.
Trong những năm qua, tôi đã thử một vài chiến lược, không có chiến lược nào hoàn toàn làm tôi hài lòng.
Tải một cơ sở dữ liệu thử nghiệm với dữ liệu đã biết. Chạy thử nghiệm đối với ORM và xác nhận rằng dữ liệu phù hợp sẽ quay trở lại. Nhược điểm ở đây là DB thử nghiệm của bạn phải theo kịp mọi thay đổi lược đồ trong cơ sở dữ liệu ứng dụng và có thể không đồng bộ. Nó cũng dựa trên dữ liệu nhân tạo và có thể không để lộ các lỗi xảy ra do đầu vào của người dùng ngu ngốc. Cuối cùng, nếu cơ sở dữ liệu kiểm tra nhỏ, nó sẽ không tiết lộ sự thiếu hiệu quả như một chỉ mục bị thiếu. (OK, cái cuối cùng không thực sự nên sử dụng thử nghiệm đơn vị nào, nhưng nó không gây hại.)
Tải một bản sao của cơ sở dữ liệu sản xuất và kiểm tra chống lại điều đó. Vấn đề ở đây là bạn có thể không biết DB trong sản xuất tại bất kỳ thời điểm nào; các bài kiểm tra của bạn có thể cần phải được viết lại nếu dữ liệu thay đổi theo thời gian.
Một số người đã chỉ ra rằng cả hai chiến lược này đều dựa trên dữ liệu cụ thể và thử nghiệm đơn vị chỉ nên kiểm tra chức năng. Cuối cùng, tôi đã thấy đề xuất:
- Sử dụng máy chủ cơ sở dữ liệu giả và chỉ kiểm tra xem ORM đang gửi các truy vấn chính xác để đáp ứng với một cuộc gọi phương thức đã cho.
Những chiến lược nào bạn đã sử dụng để thử nghiệm các ứng dụng dựa trên cơ sở dữ liệu, nếu có? Điều gì đã làm việc tốt nhất cho bạn?