Làm thế nào để thực hiện kiểm tra đơn vị trên một phương pháp mất thời gian trôi qua?


8

Tôi hiện đang ở giữa tái cấu trúc một phương pháp quan trọng trong một hệ thống cũ. Gần như không có thử nghiệm nào cho đến khi tôi bắt đầu làm việc với nó và tôi đã thêm khá nhiều để đảm bảo công việc chính xác sau khi tái cấu trúc.

Bây giờ tôi đã đi qua phần quan trọng nhất: thuật toán tính toán một chỉ báo. Nó giống như

indicator = (OneNumberFromA + AnotherNumberFromB) / elapsedTime;

Làm cách nào tôi có thể kiểm tra hành vi chính xác cho Chức năng này bằng các bài kiểm tra Đơn vị?

Ngoài ra còn có một số thuật toán hơi khác nhau trong các hàm, mà chương trình đạt được trong một số trường hợp - nhưng trong tất cả chúng, điều elapsedTimenày rất quan trọng đối với kết quả.

Câu trả lời:


11

Giống như cách bạn giải quyết hầu hết mọi vấn đề với các bài kiểm tra đơn vị: bạn chế giễu thời gian đã trôi qua.

Tôi khuyên bạn nên sử dụng một phương pháp được tiêu chuẩn hóa để có được thời gian hệ thống trong toàn hệ thống, và sau đó làm cho phương thức đó trở nên quá mức, để các bài kiểm tra đơn vị của bạn có toàn quyền kiểm soát. Các bài kiểm tra sau đó sẽ chứa rất nhiều cuộc gọi tiện lợi như Time.fake(timeA), hoặc thậm chí Time.stop().


Thời gian thực sự có được thông qua Hệ thống. Phương thức hàm lưu trữ loginTime và tính toán thời gian trôi qua DateTime.Now - loginTime. Tôi sẽ cố gắng chế giễu điều đó. Cảm ơn đã chỉ cho tôi theo hướng đó.
mhr

5
Sau đó, cấu trúc lại nó và thay thế mọi cuộc gọi System.currentTimeMillis()bằng một phương thức Time.now(), thường làm như vậy, nhưng trong thử nghiệm có thể được thực hiện để trả về bất kỳ giá trị nào bạn muốn. Điều này có thể mất một số nỗ lực, nhưng nó không có khả năng phá vỡ bất cứ điều gì, vì đó là một thay đổi rất tập trung và chứa đựng.
Kilian Foth

1

Đo thời gian & đánh giá chỉ số nên ở các chức năng khác nhau. Trong trường hợp của bạn, elapsedTimenên là một đầu vào của chức năng đánh giá. Bằng cách đó, mã đánh giá của bạn có thể được kiểm tra và dễ hiểu hơn.

Bây giờ bạn vẫn có vấn đề kiểm tra chức năng đo thời gian, nhưng điều này nằm ngoài phạm vi của câu hỏi này.


Đó là một trong những điều tôi sẽ hướng tới, nhưng ngay bây giờ, thời gian trôi qua được tính trong hàm. Tôi không chắc có tốt không khi trích xuất phần này mà không cần kiểm tra để đảm bảo hành vi có thể quan sát được giữ nguyên - điều quan trọng liên quan đến Tái cấu trúc Fowlers .
mhr
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.