2010-05-20 28 views
6

Nhìn vào phạm vi mã của chúng tôi về các bài kiểm tra đơn vị của chúng tôi, chúng tôi khá cao. Nhưng vài% cuối cùng là khó khăn bởi vì rất nhiều người trong số họ đang bắt những thứ như ngoại lệ cơ sở dữ liệu - mà trong hoàn cảnh bình thường chỉ không xảy ra. Ví dụ, mã ngăn các trường quá dài vv, do đó, ngoại lệ cơ sở dữ liệu duy nhất có thể là nếu DB bị hỏng/giảm hoặc nếu lược đồ được thay đổi dưới chân chúng ta.Cách chính xác cho các vùng thử nghiệm đơn vị xung quanh ngoại lệ

Vì vậy, cách duy nhất để Mock các đối tượng như vậy mà ngoại lệ có thể được ném? Điều đó có vẻ hơi vô nghĩa. Có lẽ tốt hơn là chỉ chấp nhận không nhận được bảo hiểm mã 100%?

Cảm ơn, Dan

+3

Một vài điểm phần trăm cuối cùng thường không đáng để gặp rắc rối (ngoại trừ khóa học nếu tính năng chúng thực hiện là yêu cầu cốt lõi, sau đó bạn bắt đầu với sai điểm phần trăm ;-)). –

+1

Mã xử lý ngoại lệ thường có đầy đủ các lỗi - kiểm tra giá trị chắc chắn. – Peli

+0

Tôi phải đồng ý với Peli, chúng tôi đang thực hiện 100% và chúng tôi đã tìm thấy hàng tấn và rất nhiều lỗi có thể xảy ra. – roundcrisis

Trả lời

1

Thông thường khi chạy vào các ngoại lệ cấp thấp, như IOException hoặc SQLException trong Java, tôi đưa chúng vào một ngoại lệ mở rộng RuntimeException. Tôi cảm thấy thử nghiệm hành vi này là khá quan trọng bởi vì nếu không có khả năng rất khó chịu vô tình nuốt các ngoại lệ.

Vì vậy, tôi khuyên bạn nên thử nghiệm chúng, nếu bạn thực sự làm điều gì đó khi một ngoại lệ cấp thấp được ném.

Chỉnh sửa: Đã thêm ví dụ.

public void store(User user) { 
    try { 
     userDao.store(user); 
    } catch (IOException e) { 
     // Logging, perhaps some logic. 
     throw new ServiceException(e); 
    } 
} 

@Test(expected = ServiceException.class) 
public void Store_Fail() { 
    UserDao userDaoMock = createMock(UserDao.class); 
    User user = // Create test user. 
    userDaoMock.store(user); 
    replay(userDaoMock); 
    userService.store(user); 
    verify(userDaoMock); 
} 

Không có nhiều điều để kiểm tra ở đây, nhưng nếu logic yêu cầu một ServiceException phải được giải thích tại sao không thử nghiệm nó?

+0

Ok. Vậy làm thế nào để bạn thử nghiệm của bạn? Bạn có giả lập lỗi, hay bạn tìm cách kích hoạt nó bằng cách nào đó? – Codek

+0

@Codek Tôi đi với chế nhạo. Trong trường hợp thử nghiệm cụ thể đó, tôi đưa một đối tượng giả vào lớp được thử nghiệm và buộc nó ném một ngoại lệ trong cuộc gọi thử nghiệm. Tôi không cố gắng gây ra bất kỳ loại tập tin hoặc cơ sở dữ liệu lỗi bởi vì nó là rất tốn thời gian và đôi khi nó thậm chí không rõ ràng lý do tại sao phương pháp sẽ ném ngoại lệ kiểm tra. – ponzao

1

Một thực tế phổ biến khi một mục tiêu phủ sóng 100% được quy định là để trang trải càng nhiều mã càng tốt bằng cách thử nghiệm và trang trải một vài phần trăm còn lại bằng cách xem xét mã.

+0

Bạn có nên để phần còn lại của mã bằng cách xem xét mã không? – Mark

+0

Tất nhiên là có. Tuy nhiên, bài đánh giá cụ thể này nhằm mục đích giải thích tại sao phần mã đó không được kiểm tra và tại sao nó không gây hại để không thử nghiệm nó. – mouviciel

+0

Ok. Tuy nhiên có thể đánh dấu mã là "không được bảo hiểm" không? Tại thời điểm này chúng tôi không có cách rõ ràng để xác định từ báo cáo bảo hiểm mà mã đã được "mã xem xét" và được coi là ok và hasnt? Vì vậy, tôi muốn nhận được một loại bảo hiểm giả 100%, nơi tất cả các mã đã được kiểm tra, hoặc xem xét. (Công cụ chúng tôi sử dụng là EclEmma) – Codek

0
Vì vậy, cách duy nhất để Mock các đối tượng như vậy mà ngoại lệ có thể được ném?

Tôi tin rằng đó sẽ là cách dễ nhất, nhưng bạn cũng có thể làm một bài sơ khai (còn gọi là một đối tượng mở rộng đối tượng thực, và lực lượng cư xử như ném một ngoại lệ mọi lúc). Hoặc bạn có thể sử dụng AOP, nhưng tôi nghĩ sử dụng một thư viện như easymock hoặc jmock sẽ là cách dễ nhất để đi.

Điều đó có vẻ hơi vô nghĩa. Có lẽ tốt hơn là chỉ chấp nhận không nhận được bảo hiểm mã 100%?

Bất cứ khi nào tôi nói về chủ đề này, tôi muốn thay đổi suy nghĩ của mọi người vì lo lắng về một tỷ lệ phần trăm bảo hiểm nhất định và thay vào đó sử dụng tỷ lệ phần trăm làm công cụ để giúp bạn trở thành nhà phát triển tốt hơn. Đặt một cách khác có mức độ phủ sóng 100% hoặc độ che phủ 50% không nhất thiết có nghĩa là mã của bạn được viết tốt hoặc thậm chí hoạt động nhưng sử dụng Mã Bảo mật làm chỉ báo chính khi bạn đang phát triển mã như nếu bạn chưa viết bài kiểm tra vv ... một ý kiến ​​hay.

Ý kiến ​​cá nhân của tôi về câu hỏi của bạn là nếu đó là logic ứng dụng của bạn đang làm, thì nó là giá trị thử nghiệm. Vì vậy, nếu bạn đang bắt và ngoại lệ và retuning sai từ phương pháp, bạn nên có một thử nghiệm cho điều đó. Nếu bạn đang bắt ngoại lệ và gói nó trong trường hợp ngoại lệ khác, bạn nên kiểm tra điều đó. Nếu bạn bắt được ngoại lệ và không làm gì cả, thì đó sẽ là một mùi mã cần phải được sửa vì nó có thể dẫn đến tất cả các loại tác dụng phụ không thể quản lý được.

Để biết liệu 100% có phải là không khơi dậy, tôi sẽ nói có, nó không đáng giá. Bạn nên tìm một mức độ thoải mái tốt cho chính mình (có thể 80%, có thể là 90%) và gắn bó với nó. Nhưng tôi sẽ không căn cứ vào các loại kiểm tra (như kiểm tra logic ngoại lệ) nó chỉ nên dựa trên tổng số vùng phủ sóng và được xem như một chỉ báo cho thấy bạn không viết các bài kiểm tra khi bạn thực hiện mã.

Các vấn đề liên quan