Tại nơi làm việc, một trong những dự án của tôi chủ yếu là lấy dữ liệu được truyền từ máy khách bên ngoài và duy trì nó trong cơ sở dữ liệu. Đó là một ứng dụng doanh nghiệp Java sử dụng JPA và hầu hết logic của chúng tôi xoay quanh các hoạt động CRUD.
Phần lớn các lỗi của chúng tôi liên quan đến JPA bằng cách này hay cách khác.
- Ví dụ 1: Nếu bạn nhấp vào nút lưu hai lần, JPA có thể cố gắng chèn cùng một thực thể vào cơ sở dữ liệu lần thứ hai, gây ra vi phạm khóa chính.
- Ví dụ 2: Bạn truy xuất một thực thể từ cơ sở dữ liệu, chỉnh sửa nó và cố gắng cập nhật dữ liệu của nó. JPA có thể cố gắng tạo một phiên bản mới thay vì cập nhật phiên bản cũ.
Thường thì giải pháp là cần thêm / xóa / thay đổi chú thích JPA. Những lần khác, nó phải làm với việc sửa đổi logic DAO.
Tôi không thể tìm ra cách lấy niềm tin vào mã của chúng tôi bằng các bài kiểm tra đơn vị và TDD. Tôi không chắc liệu đó có phải là do các bài kiểm tra đơn vị và TDD không phù hợp hay không, nếu tôi tiếp cận vấn đề sai.
Các bài kiểm tra đơn vị có vẻ không phù hợp vì tôi chỉ có thể phát hiện ra những vấn đề này khi chạy và tôi cần triển khai đến một máy chủ ứng dụng để tái tạo các vấn đề. Thông thường cơ sở dữ liệu cần phải được tham gia mà tôi cho là nằm ngoài định nghĩa của kiểm tra đơn vị: Đây là các kiểm tra tích hợp.
TDD có vẻ như không phù hợp vì vòng lặp phản hồi triển khai + kiểm tra quá chậm nên khiến tôi rất không hiệu quả. Vòng lặp phản hồi triển khai + kiểm tra mất hơn 3 phút và đó chỉ là khi tôi chạy thử nghiệm cụ thể về mã tôi đang viết. Để chạy tất cả các bài kiểm tra tích hợp mất hơn 30 phút.
Có mã bên ngoài khuôn này và tôi luôn kiểm tra đơn vị bất cứ khi nào tôi có thể. Nhưng phần lớn các lỗi của chúng tôi và thời gian chìm lớn nhất luôn liên quan đến JPA hoặc cơ sở dữ liệu.
Có một câu hỏi khác tương tự , nhưng nếu tôi làm theo lời khuyên, tôi sẽ gói phần không ổn định nhất trong mã của mình (JPA) và kiểm tra mọi thứ trừ nó. Trong bối cảnh câu hỏi của tôi, tôi sẽ ở trong tình trạng tồi tệ tương tự. Bước tiếp theo sau khi gói JPA là gì? IMO câu hỏi đó (có lẽ) là một bước để trả lời câu hỏi của tôi, nhưng không phải là một câu trả lời cho nó.
unit testing != TDD
)