2015-11-02 16 views
5

hiện đại kiểm tra đơn vị khuôn khổ hỗ trợ chờ đợi kết quả của một thử nghiệm đơn vị không đồng bộ, như thế này:Advantage của async/chờ đợi trên chặn trong đơn vị kiểm tra

public async Task SomeTest() 
{ 
    var result = await SomeMethodAsync(); 
    // ... Verify the result ... 
} 

Có lợi thế của việc sử dụng phương pháp async này so với việc ngăn chặn?

public void SomeTest() 
{ 
    var result = SomeMethodAsync().Result; 
    // ... Verify the result ... 
} 

Liệu async chỉ mang lại lợi ích khi chạy thử nghiệm song song?

+0

Thực tế là Chủ đề chính cho một bộ kiểm tra tự động là miễn phí để thực hiện nhiều bài kiểm tra đơn vị song song, âm thanh đó giống như một lợi thế, thay vì bị chặn tại một cuộc gọi đồng bộ –

Trả lời

6

Những lợi ích chính của async mã là một giao diện người dùng đáp ứng về phía khách hàng, và khả năng mở rộng về phía máy chủ. Đối với các bài kiểm tra đơn vị, bạn sẽ có được một chút khả năng mở rộng (mà chuyển thành lợi ích tốc độ tổng thể vì các thử nghiệm đơn vị được tự nhiên bùng nổ).

Nhưng nó không phải là một lợi ích to lớn. Các bài kiểm tra của bạn (có lẽ) chạy nhanh hơn một chút.

Tôi thường sử dụng phương pháp async Task đơn vị kiểm tra vì những lý do:

  • Nếu bạn đang thử nghiệm mã trong một bối cảnh, sau đó chặn có thể gây ra vấn đề bế tắc cổ điển. Lưu ý rằng một số khung (ví dụ: xUnit) luôn cung cấp ngữ cảnh theo mặc định. Ngay cả đối với các khung công tác khác, nó thường cần thiết để cung cấp ngữ cảnh cho các ViewModels thử nghiệm đơn vị.
  • await không bao gồm ngoại lệ trong AggregateException.
  • Bạn nhận được một chút lợi ích về khả năng mở rộng (theo lý thuyết) cho phép các bài kiểm tra đơn vị của bạn chạy nhanh hơn tổng thể. Giả sử khung của bạn chạy thử nghiệm song song.
  • Tại sao không? Chúng dễ dàng như các phương thức đồng bộ. async Task phương pháp thử nghiệm đơn vị đã được hỗ trợ bởi tất cả các khuôn khổ thử nghiệm đơn vị chính kể từ năm 2012.
+3

Tất cả tốt và +1.Nhưng liên quan đến "Tại sao không": Bây giờ bạn không thể tạm dừng trình gỡ lỗi và xem nơi thử nghiệm bị ràng buộc IO bị dừng lại (thậm chí có thể treo) tại thời điểm đó. – usr

+0

@usr: Một điểm hợp lệ! –

+0

@usr Msft đang làm việc trên tính năng đó (hoặc đã lên kế hoạch. Không chắc chắn nơi tôi thấy điều đó). Hy vọng chúng tôi sẽ có một cửa sổ trình gỡ lỗi cho thấy các điểm chờ đợi nổi bật –

1

Có lợi thế nào khi sử dụng cách tiếp cận không đồng bộ này chỉ đơn giản là chặn không?

Tôi nghĩ rằng điều đó thực sự phụ thuộc vào những gì bạn đang thử nghiệm. Nếu bạn nhìn vào nó từ quan điểm của khung kiểm tra đơn vị, thì tôi không thấy bất kỳ lợi ích nào ở đây. Tôi không nghĩ rằng một khuôn khổ như vậy cần phải quy mô đối với IO. Điều duy nhất mà bạn đang làm là kiểm tra cách hoạt động của API async của bạn. Ví dụ, với tư cách là một tác giả thư viện, bạn có thể có một điểm cuối không đồng bộ và kiểm tra những gì xảy ra khi mã của bạn bị chặn bởi người gọi mà không hiểu cách sử dụng thư viện của bạn một cách chính xác.

Một ví dụ có thể là:

[TestClass] 
public class M 
{ 
    [TestMethod] 
    public void X() 
    { 
     var myService = new MyService(); 
     myService.FetchSomeDataAsync().Result; // Will this deadlock? 
    } 
} 
+0

Nếu điều này có thể là Deadlock, thì nó cũng có thể có cùng nhược điểm trong chế độ Async, mặc dù chủ đề chính là miễn phí nhưng hoạt động Async bị khóa và chờ, cho đến khi nó được giải phóng thông qua một cơ chế thay thế –

+0

@MrinalKamboj Tôi không hiểu ý anh là gì. –

+0

Tôi đã trả lời nhận xét trong câu trả lời của bạn - // Nếu bế tắc này, nếu có, thì nó sẽ đặt ra một vấn đề tương tự ở chế độ Async, sans chủ đề chính được tự do chạy thử nghiệm khác –