Tôi đã đi qua một bài kiểm tra đơn vị đó là không liên tục vì thời gian trôi qua không phải là những gì tôi mong đợi nó được.Chính xác Thread.Sleep (TimeSpan) như thế nào?
Một ví dụ về những gì thử nghiệm điều này có vẻ như là:
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
TimeSpan oneSecond = new TimeSpan(0, 0, 1);
for(int i=0; i<3; i++)
{
Thread.Sleep(oneSecond);
}
stopwatch.Stop();
Assert.GreaterOrEqual(stopwatch.ElapsedMilliseconds, 2999);
Phần lớn thời gian này trôi qua nhưng nó đã không thành công trên ít nhất là trên một lần thất bại vì:
dự kiến: lớn hơn hoặc bằng đến 2999 Nhưng là: 2998
Tôi không hiểu cách nó có thể nhỏ hơn 3 giây. Có vấn đề về độ chính xác với Thread.Sleep hoặc có thể Đồng hồ bấm giờ mà tôi không biết?
Cũng giống như bản cập nhật cho một số câu hỏi bên dưới. Kịch bản đang được kiểm thử đơn vị là một lớp cho phép người ta gọi một phương thức để thực hiện một số hành động và nếu nó không đợi một giây và nhớ lại phương thức đó. Các thử nghiệm được hiển thị ở trên chỉ là một xấp xỉ của những gì đang xảy ra.
Giả sử tôi muốn gọi phương thức DoSomething() ... nhưng trong trường hợp ngoại lệ bị DoSomething ném() tôi muốn có thể thử gọi lại tối đa 3 lần nhưng đợi 1 giây giữa mỗi lần thử. Mục đích của thử nghiệm đơn vị, trong trường hợp này, là để xác minh rằng khi chúng tôi yêu cầu 3 lần thử lại với 1 giây chờ giữa mỗi lần thử lại, tổng thời gian thực hiện lớn hơn 3 giây.
Chỉ vì tò mò, tại sao bạn có bài kiểm tra đơn vị kiểm tra Thread.Sleep() theo cách này? Tôi đoán rằng bạn đang thực sự thử nghiệm để xem liệu một số hoạt động khác hoàn thành trong chưa đầy 3 giây, nhưng tại sao không chỉ gọi Thread.Sleep (3000)? – MusiGenesis
@MusiGenesis Tôi đã cập nhật câu hỏi để cố gắng làm rõ mọi thứ một chút. – mezoid
Chỉ để biết thông tin. Kể từ khi tôi phát hiện ra mã nhỏ này, tôi sử dụng nó ở mọi nơi: http://www.codeproject.com/KB/cs/highperformancetimercshar.aspx – sabiland