Gần đây tôi đã xem Các bài kiểm tra tích hợp là một trò lừa đảo của JB Rainsberger và hiện đang tìm kiếm thêm tài liệu về chủ đề này. Tôi phải nói rằng, tôi bị sốc bởi chúng ta đã làm sai bao nhiêu, (tức là kiểm tra tích hợp khi chúng ta nên kiểm tra đơn vị), bị thu hút bởi các khái niệm được mô tả bởi Rainsberger nhưng cũng bối rối về cách áp dụng chúng. Tôi muốn có thêm các bài kiểm tra hợp tác được mô tả và kiểm tra hợp đồng nhưng tôi không biết bắt đầu từ đâu.
Điều duy nhất bị mắc kẹt trong tâm trí tôi là 4 câu hỏi mà các bài kiểm tra cần đặt ra:
Bên một:
Do I ask the right question?
Can I deal with the answer?
Bên B:
Can I answer a question?
Do I answer correctly?
Nhưng làm thế nào để tôi áp dụng điều này cho một số phương thức ngẫu nhiên trong ngăn xếp ứng dụng của tôi?
Có một cuốn sách hoặc một hướng dẫn hoặc ví dụ ngoài đó lấy một ví dụ trong thế giới thực và áp dụng những ý tưởng của các bài kiểm tra vi mô bị cô lập? Lý tưởng nhất là ví dụ sử dụng Java, Spring + PowerMock / Mockito / EasyMoock
Bất kỳ tài liệu nào liên quan đến các khái niệm này nói chung và giúp tôi hiểu chúng tốt hơn sẽ được đánh giá cao.
Ngoài ra nếu có các diễn đàn ngoài đó, nơi tôi có thể đặt câu hỏi chi tiết hơn về cách tiến hành kiểm tra đơn vị chính xác và thậm chí có thể tái cấu trúc mã hiện tại và các ví dụ bài đăng sẽ rất hay.
Cảm ơn!
Chỉnh sửa - một số suy nghĩ bổ sung:
Có một quy tắc chung, khi nào nên sử dụng một bản giả và khi nào còn sơ khai để cô lập một lớp đang thử nghiệm với các cộng tác viên của nó? Nó có thể được áp dụng cho 4 câu hỏi không?
Các khung mô phỏng tốt nhất dường như là PowerMock, cho phép tôi xác định chính xác cho mỗi bài kiểm tra mà tôi muốn chế giễu và lớp nào sẽ trả về hoặc có điều gì tốt hơn mà bạn đã sử dụng để hỏi các câu hỏi trên không? Có những hướng dẫn tốt ngoài kia sử dụng PowerMock để áp dụng một số hoặc tất cả các nguyên tắc nhất định cho một phần của ngăn xếp ứng dụng trong thế giới thực, nói DAO hoặc GUI?
Chỉnh sửa 2 - một ví dụ
Chỉ là một số ví dụ về loại phương pháp tôi muốn kiểm tra và suy nghĩ của tôi ..
Tôi có một dịch vụ web tiết kiệm đơn hàng. Ở giai đoạn này, chúng tôi không quá lo lắng về bảo mật tốt nhất, vì vậy để có một số dịch vụ, dịch vụ cũng sẽ lấy tên người dùng và mật khẩu để xác thực yêu cầu lưu. Sau khi xác thực, OrderManager
được gọi để lưu Order
. Trong nội bộ người quản lý quyết định nếu đó là một đơn đặt hàng mới để nó phải được tạo ra hoặc một đơn hàng hiện có phải được cập nhật. (Điều đó không quan trọng với WebSerice, phải không?)
@WebService
public class OrderService {
@Inject
private AuthenticationManager authenticationManager;
@Inject
private OrderManager orderManager;
public void save(String username, String password, Order order) {
authenticationManager.authenticate(username, password);
try {
orderManager.save(orde);
} finally {
authenticationManager.logout();
}
}
Bây giờ tôi tự hỏi: chính xác những gì tôi đang thử nghiệm ở đây? Tôi nghĩ nên có những thử nghiệm để xác thực thành công và thất bại và để tiết kiệm thành công và thất bại.
Nhưng làm thế nào tôi có thể chia nó thành 4 câu hỏi? Lớp học của tôi dưới Test rõ ràng là OrderService
(HĐH) và các cộng tác viên là OrderManager
(OM) và AuthenticationManager
. (AM) Vì vậy, tôi có các bài kiểm tra sau, xin vui lòng sửa cho tôi ở đây, tôi chỉ đang suy nghĩ lớn:
Hệ điều hành <-> OM
- Hệ điều hành yêu cầu OM lưu một đơn đặt hàng (loại thử nghiệm nào khác mà tôi kiểm tra ở đây?
null
VàOrder
? Có vấn đề gì nếuOrder
được khởi tạo chính xác không?) - OM trả lời cuộc gọi lưu bằng cách gọi một số phương thức nội bộ khác, kiểm tra II nếu phương thức đó được gọi?!
- Hệ điều hành không nên thất bại nếu OM không bị lỗi
- Hệ điều hành sẽ bị lỗi nếu OM bị lỗi
... Còn gì nữa không?
Và dĩ nhiên, hệ điều hành <-> AM :
- Hệ điều hành yêu cầu AM xác thực - Tôi đoán tôi kiểm tra xem AM phản ứng thế nào với các loại tên người dùng / mật khẩu khác nhau?
- ...
Bây giờ kết luận đầu tiên của tôi :
Theo như các WebSerice là có liên quan tôi chỉ có thể kiểm tra 2 trong số 4 câu hỏi sau: A. Side Bây giờ tôi phải nhìn vào OrderManager
và AuthenticationManager
và xem họ có thể trả lời các câu hỏi của bên B. Phải không?
Thứ hai - truy cập cơ sở dữ liệu:
Xác thực và đặt hàng vẫn tồn tại rõ ràng đòi hỏi một số dữ liệu trong cơ sở dữ liệu trong môi trường sản xuất. Tuy nhiên, đối với các bài kiểm tra đơn vị của tôi, tôi sẽ không cần chúng vì vậy tôi sẽ chỉ chế giễu các cuộc gọi để trả về kết quả mong muốn, phải không? Nhưng làm thế nào để tôi chế nhạo điều này?
Tôi không cần phải AuthenticationManager.authenticate
làm gì nhiều, vì trong trường hợp xác thực thất bại, nó sẽ ném Exception
, nếu không nó có kiểu trả về void
. Làm thế nào để tôi nói với tôi OrderService.save()
để sử dụng chế giễu của tôi AuthenticationManager.authenticate()
?
Và làm thế nào để tôi thiết lập AuthenticationManager
không làm gì hoặc ném ngoại lệ?
Tôi có thể bảo Spring tiêm một thứ nhạo báng AuthenticationManager
sẽ không làm gì / ném Exception
vào OrderService
bài kiểm tra của tôi không?