Tôi đang viết một trình lập lịch biểu công việc nhỏ bằng Python. Bộ lập lịch có thể được cung cấp một loạt các cuộc gọi cộng với các phụ thuộc, và nên chạy các cuộc gọi, đảm bảo rằng không có nhiệm vụ nào được chạy trước bất kỳ người tiền nhiệm nào của nó.Thử nghiệm một hàm có thể trả về kết quả không xác định bằng cách sử dụng Python unittest
Tôi đang cố gắng tuân theo phương pháp thử nghiệm theo hướng thử nghiệm và tôi đã gặp phải sự cố khi kiểm tra việc xử lý phụ thuộc. Mã thử nghiệm của tôi trông giống như sau:
def test_add_dependency(self):
"""Tasks can be added with dependencies"""
# TODO: Unreliable test, may work sometimes because by default, task
# running order is indeterminate.
self.done = []
def test(id):
self.done.append("Test " + id)
s = Schedule()
tA = Task("Test A", partial(test, "A"))
tB = Task("Test B", partial(test, "B"))
s.add_task(tA)
s.add_task(tB)
s.add_dependency(tA, tB)
s.run()
self.assertEqual(self.done, ["Test B", "Test A"])
Vấn đề là thử nghiệm này (đôi khi) hoạt động ngay cả trước khi tôi thêm mã xử lý phụ thuộc. Điều này là do đặc điểm kỹ thuật không tuyên bố rằng các nhiệm vụ phải được chạy theo một thứ tự cụ thể. Vì vậy, thứ tự đúng là một sự lựa chọn hoàn toàn hợp lệ ngay cả khi thông tin phụ thuộc bị bỏ qua.
Có cách viết bài kiểm tra nào để tránh loại thành công "ngẫu nhiên" này không? Dường như với tôi rằng đây là một loại tình huống khá phổ biến, đặc biệt là khi tham gia thử nghiệm "không viết mã mà không có một thử nghiệm thất bại" phương pháp tiếp cận.
Tôi biết về lịch trình cố ý sử dụng ngẫu nhiên (thường được bật bởi cờ "chế độ thử nghiệm") khi chọn một trong nhiều lựa chọn có thể. Với điều đó, bạn có thể chạy thử nghiệm của bạn một vài lần và kiểm tra xem * tất cả * kết quả là chính xác. Đây không phải là một giải pháp thực sự, tuy nhiên, vì bạn không bao giờ biết bao nhiêu vòng bạn cần. – rainer
Mặc dù các đề xuất để thử nghiệm rất hữu ích, tôi nghĩ rằng vấn đề thực sự của tôi là với ý tưởng "thử nghiệm hướng" mà tôi không nên viết mã trừ khi tôi có kiểm tra không thành công. Trong trường hợp này, đặc điểm kỹ thuật cố tình để lại một mức độ linh hoạt mà làm cho việc viết một bài kiểm tra như vậy là không thể. Đây luôn là nơi tôi gặp khó khăn với cách tiếp cận thử nghiệm, nhưng thông thường chỉ vì tôi quá lười để viết một bài kiểm tra tốt, không phải vì tôi không thể :-) –