Có ổn không để tránh kiểm tra các lớp cơ sở?


15

Tôi có một lớp cơ sở với một lượng "lập trình meta" hợp lý để cung cấp cho nó tính linh hoạt / trừu tượng mà nó cần phải khá chung chung.

Tôi có rất nhiều lớp con sử dụng các phương thức phổ biến trong lớp cơ sở và tôi có các bài kiểm tra đơn vị định hướng hành vi bao gồm tất cả các trường hợp trong mỗi lớp con.

Có thể bỏ qua việc kiểm tra lớp cơ sở không?


1
Một điều tôi đôi khi làm khi tôi bắt đầu tự hỏi mình câu hỏi này là cố gắng phá mã. Ném đầu vào không hợp lệ vào nó, chỉ định các giá trị cấu hình sai, v.v.
Zymus

Câu trả lời:


31

Để xác minh xem bạn có đủ kiểm tra hay không, bạn có thể kiểm tra phạm vi bảo hiểm mã và phạm vi bảo hiểm chi nhánh của bạn do các thử nghiệm gây ra (có thể bằng cách sử dụng công cụ bảo hiểm, có thể bằng cách xem xét các đường dẫn mã hoặc bằng cách sử dụng trình gỡ lỗi).

Nếu bạn đi đến kết luận, các bài kiểm tra cho các lớp con cung cấp cho bạn mức độ bao phủ đủ cao cho mã lớp cơ sở của bạn, thì việc thêm các bài kiểm tra tiếp theo rõ ràng sẽ không mang lại cho bạn nhiều lợi ích. Mặt khác, nếu có các đường dẫn mã, bạn chỉ có thể kiểm tra bằng cách thêm trực tiếp các kiểm tra cụ thể bằng cách sử dụng lớp cơ sở, thì bạn nên đi theo lộ trình này.

Một lý do có thể khác để "kiểm tra trực tiếp lớp cơ sở của bạn" là bạn muốn kiểm tra một chức năng cụ thể của lớp đó "trong sự cô lập". Đôi khi có thể dễ dàng hơn để thiết kế các trường hợp kiểm thử trực tiếp cho một phương thức cụ thể, thay vì chỉ kiểm tra phương thức đó một cách gián tiếp bằng cách gọi các phương thức của các lớp con của bạn sử dụng phương thức đó.

Lưu ý rằng khi bạn có một lớp cơ sở chung mà kịch bản sử dụng điển hình lấy được một lớp con, lớp cơ sở của bạn có thể là trừu tượng. Vì vậy, để kiểm tra một lớp như vậy, bạn cần phải tạo ra một dẫn xuất nào. Đối với tình huống này, việc kiểm tra "lớp cơ sở trực tiếp" có thể có nghĩa là thêm một dẫn xuất đặc biệt chỉ cho mục đích thử nghiệm, tất nhiên.


Có, tôi đồng ý với các thử nghiệm đơn vị trực tiếp trên lớp cơ sở cho các phương thức được xác định rõ ràng hơn. Những gì tôi không muốn làm là kiểm tra tất cả các chương trình meta kể từ khi đơn vị kiểm tra trên các lớp con hoàn toàn kiểm tra thứ đó.
Nathan

4
Thiết kế một lớp mở rộng lớp cơ sở / lớp trừu tượng chỉ tồn tại trong thư mục thử nghiệm và chỉ dùng để phơi bày / khởi tạo lớp cơ sở là một cách tiếp cận hoàn toàn hợp pháp và hợp lý để có được mức độ phù hợp của lớp cơ sở và đảm bảo rằng các phương thức bên dưới là làm việc chính xác trong sự cô lập của các lớp phức tạp hơn được sử dụng.

@MichaelT: vâng. Câu trả lời của tôi có vẻ như tôi có ý kiến ​​khác về điều đó?
Doc Brown

@DocBrown hoàn toàn không - bạn đã nói rõ điểm đó. Tôi chỉ thêm giải thích thêm rằng tôi sẽ viết bằng câu trả lời của riêng mình (nếu bạn chưa nói điều đó). Tôi không muốn viết một câu trả lời đã bắt đầu "Tôi đồng ý với tất cả những gì Doc nói, nhưng muốn đặc biệt gọi ra và viết thêm về ..."

2

Kiểm thử tự động được tạo ra vì lợi ích của lập trình viên, lập trình viên không được tạo để phục vụ các bài kiểm tra.

Chúng tôi có các thử nghiệm để làm cho chúng tôi làm việc hiệu quả hơn và để giảm số lượng các vấn đề mà khách hàng của khiếu nại về khiếu nại.

Vì vậy, nếu bạn có các bài kiểm tra đơn vị định hướng hành vi bao gồm tất cả các trường hợp trong mỗi lớp con, không có lợi ích nào cho khách hàng của bạn cũng kiểm tra trực tiếp lớp cơ sở. Điều này có thể được xác nhận bằng cách thay đổi một số mã trong lớp cơ sở và xem thử nghiệm có thất bại hay không, ví dụ như phổ biến một dòng mã hoặc thêm một mã không phải là một tên lửa nếu một câu lệnh. (Chỉ cần kiểm tra xem mọi dòng mã được bao phủ bởi các bài kiểm tra là không đủ.)

Sau đó chúng tôi sẽ hỏi xem thử nghiệm có giúp bạn làm việc hiệu quả hơn không . Điều này có thể xảy ra theo một vài cách.

  • Để bạn nghĩ rõ hơn về mã - vì mã được viết nên điều này khó xảy ra trong trường hợp này.
  • Để bạn kiểm tra một số mã trong lớp cơ sở một cách cô lập, do đó, gỡ lỗi nhanh hơn, một lần nữa không thể xảy ra trong trường hợp vì mã đã hoạt động.
  • Để bạn thay đổi mã trong lớp cơ sở mà không cần phải hiểu chi tiết về logic trong các lớp con - có thể nếu bạn đang cấu trúc lại mã ???

Vì vậy, do các lớp con đang hoạt động, tôi không thấy bất kỳ điểm nào khi viết các bài kiểm tra trực tiếp cho lớp cơ sở. Điều này không phải là ngày nay, rằng sẽ không có lợi ích khi viết các bài kiểm tra này ở trạng thái sớm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.