Thích thử nghiệm giao diện hơn thử nghiệm trên thực hiện.
Theo hiểu biết của tôi thì phương pháp riêng tư là không thể đo lường được
Điều này phụ thuộc vào môi trường phát triển của bạn, xem bên dưới.
[phương thức riêng tư] không nên lo lắng vì API công khai sẽ cung cấp đủ thông tin để xác minh tính toàn vẹn của đối tượng.
Đúng vậy, TDD tập trung vào kiểm tra giao diện.
Các phương thức riêng là một chi tiết triển khai có thể thay đổi trong bất kỳ chu kỳ tái tạo yếu tố nào. Có thể tính lại yếu tố mà không thay đổi giao diện hoặc hành vi hộp đen . Trên thực tế, đó là một phần lợi ích của TDD, việc bạn có thể tạo sự tự tin khi thay đổi nội bộ thành một lớp sẽ không ảnh hưởng đến người dùng của lớp đó.
Chà, tôi có thể tạo ra một đối tượng chỉ có phương thức riêng tư và tương tác với các đối tượng khác bằng cách lắng nghe các sự kiện của họ. Điều này sẽ được gói gọn, nhưng hoàn toàn không thể kiểm chứng.
Thậm chí nếu lớp không có phương pháp nào, đó là xử lý sự kiện là nó public interface , và nó chống lại rằng giao diện nào mà bạn có thể kiểm tra.
Vì các sự kiện là giao diện nên nó là các sự kiện mà bạn sẽ cần tạo để kiểm tra đối tượng đó.
Nhìn vào việc sử dụng các đối tượng giả làm keo cho hệ thống thử nghiệm của bạn. Có thể tạo một đối tượng giả đơn giản tạo ra một sự kiện và chọn ra sự thay đổi trạng thái kết quả (có thể bởi một đối tượng giả khác của người nhận).
Ngoài ra, nó được coi là thực hành xấu để thêm các phương pháp cho mục đích thử nghiệm.
Tuyệt đối, bạn nên rất cảnh giác khi phơi bày trạng thái nội bộ.
Điều này có nghĩa là TDD có mâu thuẫn với việc đóng gói? Sự cân bằng thích hợp là gì?
Tuyệt đối không.
TDD không nên thay đổi việc triển khai các lớp của bạn ngoài việc đơn giản hóa chúng (bằng cách áp dụng YAGNI từ một điểm trước đó).
Thực hành tốt nhất với TDD giống hệt với thực tiễn tốt nhất mà không có TDD, bạn chỉ cần tìm hiểu tại sao sớm hơn, bởi vì bạn đang sử dụng giao diện khi bạn đang phát triển nó.
Bây giờ tôi có xu hướng công khai hầu hết hoặc tất cả các phương pháp của mình ...
Điều này sẽ tốt hơn là ném em bé ra ngoài với nước tắm.
Bạn không cần phải công khai tất cả các phương thức để bạn có thể phát triển theo cách TDD. Xem ghi chú của tôi dưới đây để xem các phương pháp riêng tư của bạn thực sự là không thể kiểm chứng.
Một cái nhìn chi tiết hơn về thử nghiệm phương pháp riêng tư
Nếu bạn hoàn toàn phải kiểm tra đơn vị một số hành vi riêng tư của một lớp, tùy thuộc vào ngôn ngữ / môi trường, bạn có thể có ba tùy chọn:
- Đặt các bài kiểm tra trong lớp bạn muốn kiểm tra.
- Đặt các bài kiểm tra trong một tệp lớp / nguồn khác và hiển thị các phương thức riêng tư mà bạn muốn kiểm tra như các phương thức công khai.
- Sử dụng một môi trường thử nghiệm cho phép bạn tách riêng mã thử nghiệm và mã sản xuất, nhưng vẫn cho phép mã thử nghiệm truy cập vào các phương thức riêng của mã sản xuất.
Rõ ràng là lựa chọn thứ 3 cho đến nay là tốt nhất.
1) Đặt các bài kiểm tra trong lớp bạn muốn kiểm tra (không lý tưởng)
Lưu trữ các trường hợp thử nghiệm trong cùng một tệp lớp / nguồn như mã sản xuất được thử nghiệm là tùy chọn đơn giản nhất. Nhưng không có nhiều chỉ thị hoặc chú thích của bộ xử lý trước, bạn sẽ kết thúc với mã kiểm tra làm phồng mã sản xuất của mình một cách không cần thiết, và tùy thuộc vào cách bạn đã cấu trúc mã của mình, cuối cùng bạn có thể vô tình phơi bày việc triển khai nội bộ cho người dùng mã đó.
2) Đưa ra các phương thức riêng tư mà bạn muốn kiểm tra như các phương thức công khai (thực sự không phải là một ý tưởng hay)
Theo đề xuất, đây là cách thực hành rất kém, phá hủy đóng gói và sẽ phơi bày việc triển khai nội bộ cho người dùng mã.
3) Sử dụng môi trường thử nghiệm tốt hơn (tùy chọn tốt nhất, nếu có)
Trong thế giới Eclipse, 3. có thể đạt được bằng cách sử dụng các đoạn . Trong thế giới C #, chúng ta có thể sử dụng các lớp một phần . Các ngôn ngữ / môi trường khác thường có chức năng tương tự, bạn chỉ cần tìm nó.
Giả sử mù quáng 1. hoặc 2. là các tùy chọn duy nhất có thể dẫn đến việc phần mềm sản xuất bị đầy mã kiểm tra hoặc các giao diện lớp khó chịu có thể giặt đồ vải bẩn ở nơi công cộng. *số 8')
- Tất cả trong tất cả - tốt hơn hết là không kiểm tra chống lại việc thực hiện riêng tư.