Làm cách nào để mô phỏng các sự kiện gây ra ngoại lệ để kiểm tra các khối thử / bắt?


14

Tôi hiểu cách các ngoại lệ hoạt động và cách bắt và xử lý chúng trong C # nhưng làm cách nào tôi có thể mô phỏng các sự kiện có thể gây ra ngoại lệ để đảm bảo rằng nó được bắt chính xác? Ví dụ: có thể chạy một ứng dụng trong một loại giường thử nghiệm để có thể mô phỏng các sự cố mạng, sự cố cơ sở dữ liệu, v.v. không? Các ngoại lệ do bản chất của chúng có vẻ khó tái tạo, do đó, khó đảm bảo mã của bạn có thể đối phó với chúng.

Mặc dù tôi chủ yếu phát triển bằng C # /. NET / Visual Studio, câu trả lời hoặc tài nguyên liên quan đến các ngôn ngữ khác có thể hữu ích.


Một giải pháp khả thi khác được mô tả trong bài viết MSDN này: Thử nghiệm tiêm lỗi với TestApi
Giorgi

Câu trả lời:


13

1) Nếu bạn đã theo mô hình tiêm phụ thuộc, bạn có thể thay thế việc triển khai thực tế của một số bộ phận bằng các mô hình giả sẽ ném ngoại lệ khi bạn cần chúng. Tuy nhiên, điều đó đòi hỏi bạn phải thiết kế ứng dụng của mình theo cách cụ thể hoặc hoàn toàn tái cấu trúc nó.

Giống:

public class SqlUsersRepository : IUsersRepository
{
    public void RegisterNewUser (User newUser)
    {
        throw new SqlException ("Connection timeout");
    }
}

Tuy nhiên, ở đây chúng ta sẽ gặp vấn đề là mã người tiêu dùng không nên quan tâm đến việc xử lý các ngoại lệ triển khai cụ thể.

2) Một cách tiếp cận khác là thay thế các cuộc gọi phương thức nhất định bằng các trình bao bọc tùy chỉnh của bạn.

Thay vì:

FileStream fs = File.OpenRead (path);

bạn dùng:

FileStream fs = File.OpenRead_Test (path);

bằng cách cung cấp một phương thức mở rộng tùy chỉnh (chỉ là một ý tưởng nhanh):

public static FileStream OpenRead_Test (this System.IO.File file, string path)
{
    throw new FileNotFoundException ();
}

3

Bạn cần nhìn vào khuôn khổ chế giễu.

Với những điều này, bạn sử dụng phép nội xạ phụ thuộc để gọi cơ sở dữ liệu giả (nói) chứ không phải là cơ sở dữ liệu thực. Điều này có nghĩa là bạn có toàn quyền kiểm soát những gì được trả lại cho mỗi cuộc gọi.

Sau đó, bạn thiết lập một bài kiểm tra mà khi được gọi đơn giản sẽ ném ngoại lệ mong muốn:

public void Test1()
{
    throw new NullArgumentException();
}

Thử nghiệm của bạn vượt qua khi mã của bạn xử lý chính xác điều này.


3

Mocking và tiêm chỉ có thể giúp bạn cho đến nay và yêu cầu thay đổi lớn trong cách tiếp cận trong một số trường hợp.

Nếu bạn không muốn thiết kế lại ứng dụng của mình để phù hợp với khung thử nghiệm thì điều bạn thực sự cần là máy chủ hoặc môi trường bị lỗi. Có nhiều cách để mô phỏng mạng chậm của chúng tôi (ngay cả các công cụ kiểm tra của Microsoft cũng có một chút điều này trong khu vực kiểm tra web). Tôi đã thành công nhất với việc đặt các máy phía sau bộ định tuyến có thể bị can thiệp để thay đổi mô phỏng phối hợp với bộ cơ sở dữ liệu để tạo ra lỗi và tập lệnh để thay đổi lỗi mà cơ sở dữ liệu tạo ra.

Ngay cả với điều đó nếu bạn đi đủ nhanh hoặc đủ xa về phía phần cứng, vẫn có những lỗi như sự cố đồng thời và lỗi viết bị trì hoãn mà bạn không thể mô phỏng được. Đôi khi bạn phải gây ra chúng cho thực tế và những lần khác bạn chỉ phải làm việc mà không có mạng lưới an toàn.


Đồng ý - trong một số trường hợp, bạn không thể đủ khả năng chi trả từ việc tiêm phụ thuộc vào mã phát hành của mình. Không phải là một vấn đề hàng ngày, nhưng nó có thể xảy ra.
Steve314
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.