Cả hai.
Các xét nghiệm xác định và không xác định có các trường hợp sử dụng khác nhau và các giá trị khác nhau cho bộ của bạn. Nói chung không xác định không thể cung cấp chính xác tương tự như kiểm tra xác định, mà đã dần dần phát triển thành "kiểm tra không xác định cung cấp không có giá trị." Điều này là sai. Chúng có thể ít chính xác hơn, nhưng chúng cũng có thể rộng hơn nhiều, có lợi ích riêng của nó.
Hãy lấy một ví dụ: bạn viết một hàm sắp xếp danh sách các số nguyên. Điều gì sẽ là một số bài kiểm tra đơn vị xác định mà bạn thấy hữu ích?
- Một danh sách trống
- Một danh sách chỉ có một yếu tố
- Một danh sách với tất cả các yếu tố giống nhau
- Một danh sách có nhiều yếu tố độc đáo
- Một danh sách có nhiều yếu tố, một số trong đó là trùng lặp
- Một danh sách với
NaN
, INT_MIN
vàINT_MAX
- Một danh sách đã được sắp xếp một phần
- Một danh sách với 10.000.000 phần tử
Và đó chỉ là một chức năng sắp xếp! Chắc chắn, bạn có thể lập luận rằng một số trong số này là không cần thiết, hoặc một số trong số này có thể được loại trừ với lý do không chính thức. Nhưng chúng tôi là các kỹ sư và chúng tôi đã thấy lý do không chính thức nổ tung trong khuôn mặt của chúng tôi. Chúng tôi biết rằng chúng tôi không đủ thông minh để hiểu hoàn toàn các hệ thống chúng tôi đã xây dựng hoặc hoàn toàn giữ được sự phức tạp trong đầu. Đó là lý do tại sao chúng tôi viết bài kiểm tra ở nơi đầu tiên. Thêm kiểm tra không xác định chỉ nói rằng chúng ta có thể không nhất thiết phải đủ thông minh để biết tất cả các bài kiểm tra tốt một tiên nghiệm. Bằng cách ném dữ liệu bán ngẫu nhiên vào chức năng của bạn, nhiều khả năng bạn sẽ tìm thấy một trường hợp cạnh bạn đã bỏ lỡ.
Tất nhiên, điều đó cũng không loại trừ kiểm tra xác định. Thử nghiệm không phá hủy giúp tìm ra lỗi trong các khu vực lớn của chương trình. Tuy nhiên, khi bạn đã tìm thấy các lỗi, bạn cần một cách có thể lặp lại để cho thấy rằng bạn đã sửa nó. Vì thế:
- Sử dụng các thử nghiệm không xác định để tìm lỗi trong mã của bạn.
- Sử dụng các bài kiểm tra xác định để xác minh các bản sửa lỗi trong mã của bạn.
Lưu ý rằng điều này có nghĩa là rất nhiều lời khuyên chắc chắn về các bài kiểm tra đơn vị không nhất thiết phải áp dụng cho các bài kiểm tra không xác định. Ví dụ, họ phải nhanh. Các thử nghiệm thuộc tính cấp thấp phải nhanh, nhưng thử nghiệm không xác định như "mô phỏng người dùng nhấp ngẫu nhiên vào nút trên trang web của bạn và đảm bảo bạn không bao giờ gặp lỗi 500" nên ưu tiên tính toàn diện hơn tốc độ. Chỉ cần có một thử nghiệm như thế chạy độc lập với quá trình xây dựng của bạn để nó không làm chậm quá trình phát triển. Ví dụ, chạy nó trên hộp dàn riêng của nó.