Tôi có nên sử dụng thử bắt trong phương pháp thử nghiệm của tôi?


18

Tôi đang làm thử nghiệm đơn vị.

Tôi đang cố gắng để kiểm tra một chức năng.

Tôi gọi nó từ thành phần thử nghiệm của tôi. Nhưng nếu chức năng từ xa không thể xử lý ngoại lệ thì thành phần thử nghiệm của tôi cũng sẽ có ngoại lệ, tôi đoán vậy.

Vì vậy, tôi có nên lo lắng về việc có ngoại lệ trong thành phần thử nghiệm của tôi?

Cảm ơn.

BIÊN TẬP:

Tái bút

Ném một lỗi là tốt, nhưng chỉ cho các chức năng khác, không cho người dùng cuối cho đến khi nó là một lựa chọn cuối cùng!

OMG Tôi đã viết một trích dẫn lập trình !!


Tôi mới thử nghiệm và tôi chỉ nên kiểm tra hành vi của chức năng. Tôi nghĩ rằng nó được gọi là thử nghiệm hộp đen và whitebox. Ồ tôi nhớ điều đó. Tôi đã học điều đó ở trường đại học!
Vikas

Ngôn ngữ và khung xUnit nào bạn đang sử dụng cụ thể? Tôi sẽ tranh luận có trong một số trường hợp.
Greg K

Tôi đang sử dụng MXUnit với MockBox và ColdBox cho ngôn ngữ ColdFusion.
Vikas

Câu trả lời:


23

Câu trả lời ngắn gọn: KHÔNG.

Đừng bắt ngoại lệ trong các bài kiểm tra đơn vị. Bạn đang thử nghiệm đơn vị để tìm lỗi và tình huống trong đó các ngoại lệ được nêu ra.

Khung kiểm tra đơn vị nên xử lý các trường hợp ngoại lệ một cách lành mạnh. Hầu hết (nếu không phải tất cả) các khung xUnit đều có cấu trúc để mong đợi một số ngoại lệ nhất định mà bạn sử dụng khi bạn muốn tạo ra một điều kiện ngoại lệ cụ thể trong hệ thống đang thử nghiệm và có một thử nghiệm vượt qua nếu ngoại lệ dự kiến ​​được đưa ra nhưng không thành công nếu không.


Tôi nghĩ khung thử nghiệm nâng cao có thể xử lý ngoại lệ rất tốt, thậm chí tôi thấy rằng trong Visual studio chúng ta có thể kiểm tra chống lại các ngoại lệ như bạn đã nói "ngoại lệ dự kiến". Vì vậy, nó tốt để biết và chia sẻ. Cảm ơn ..
Vikas

Thỉnh thoảng, bạn muốn kiểm tra xem Ngoại lệ có bị ném hay không, bởi vì kiểm tra tốt không chỉ kiểm tra các trường hợp là mọi thứ hoạt động, mà cả các trường hợp khi chúng thất bại.
deadalnix

1
Bạn muốn bắt ngoại lệ, vì bạn muốn kiểm tra các tình huống xảy ra ngoại lệ (đặc biệt là ngoại lệ của riêng bạn). Nếu bạn viết mã được thiết kế để thất bại với một ngoại lệ trong một số điều kiện nhất định, những điều kiện đó sẽ là một phần của bộ kiểm tra của bạn và do đó nên được kiểm tra. Theo các thử nghiệm đó, những ngoại lệ đó cần được nắm bắt và phân tích.
jwenting

1
@Jwenting Đọc đoạn thứ hai - Các khung kiểm tra đơn vị nắm bắt các ngoại lệ và cho phép các kiểm tra vượt qua nếu một số ngoại lệ nhất định được đưa ra và thất bại nếu chúng không
phá hủy

5

(Trái ngược với câu trả lời của maptle) Câu trả lời dài: KHÔNG ... hầu hết thời gian

Khi bạn nói rằng bạn mong đợi một bài kiểm tra đưa ra một ngoại lệ cụ thể, bạn sẽ biết khi nào BẤT K line dòng nào trong bài kiểm tra đó làm tăng ngoại lệ cụ thể đó.

Điều đó không hoàn toàn giống với việc biết rằng phương pháp được thử nghiệm đưa ra ngoại lệ.

Nếu thử nghiệm của bạn liên quan đến việc thiết lập một đối tượng hoặc bối cảnh (trong thử nghiệm, không phải trong phiên bản khung của bạn SetUp), bạn có thể tốt hơn nên gói một dòng duy nhất mà bạn thực sự muốn thử trong một lần thử / bắt, có thể với một người trợ giúp.

Ví dụ,

public static class AssertHelper {
    public delegate void Thunk();

    public static void DoesNotThrow<T>(Thunk thunk, string message = "")
        where T: Exception {
        try {
            thunk.Invoke();
        } catch(T) {
            Assert.Fail(message);
        }
    }
}

và sau đó

[TestMethod]
public void assertHelperInAction() {
    // Random setup stuff here that's too annoying to put in my SetUp
    // method.
    AssertHelper.DoesNotThrow<IllegalArgumentException>(() =>
        {/* My random method under test */})
}

Nếu thử nghiệm này thất bại, tôi biết rằng phương pháp của tôi trong thử nghiệm đã ném ngoại lệ và không phải là thứ gì đó trong công cụ thiết lập ngẫu nhiên.

(Bạn nên thử và tránh các công cụ thiết lập ngẫu nhiên. Đôi khi, có một số mã thiết lập trong thử nghiệm sẽ dễ dàng hơn.)


Ví dụ tốt! Tôi cố gắng hết sức cẩn thận trong việc giới hạn giai đoạn "thử nghiệm" chỉ trong thử nghiệm chính xác, nhưng tôi sẽ nhớ thủ thuật này khi tôi không thể tìm ra cách để loại bỏ điều đó (ví dụ: khi kiểm tra điều kiện cuộc đua và cần 'thiết lập' gần với 'thử nghiệm' để đạt điều kiện).
Ethel Evans

1

Nói chung, bạn chỉ nên để ngoại lệ ra ngoài, và khung kiểm tra sẽ cung cấp cho bạn một báo cáo hay với tất cả thông tin bạn cần.


Nhưng trong phương pháp TDD, chúng tôi dự kiến ​​sẽ làm theo các bước đó:

  1. Viết một bài kiểm tra
  2. Xem nó thất bại, và làm cho lỗi dễ hiểu
  3. Sửa mã
  4. Tái cấu trúc mã và kiểm tra

Khi bạn để một ngoại lệ, nếu lỗi rõ ràng, thì nó vẫn ổn. Nhưng đôi khi ngoại lệ là tối nghĩa, hoặc thậm chí sai lầm. Làm thế nào bạn có thể để điều đó trong mã của bạn (cho bạn sau này khi bạn sẽ quên, hoặc cho một thành viên trong nhóm sẽ mất thời gian lớn để tìm ra vấn đề)? Vì vậy, chính sách của tôi là: " Nếu cần phải làm rõ một thất bại, bạn cần phải nắm bắt ngoại lệ ".

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.