Python で小さなジョブ スケジューラを作成しています。スケジューラには、一連の呼び出し可能オブジェクトと依存関係を与えることができ、呼び出し可能オブジェクトを実行する必要があります。これにより、先行タスクの前にタスクが実行されないようにする必要があります。
私はテスト駆動型のアプローチに従おうとしていますが、依存関係の処理をテストする際に問題が発生しました。私のテストコードは次のようになります。
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"])
問題は、依存関係処理コードを追加する前でも、このテストが (場合によっては) 機能していたことです。これは、タスクを特定の順序で実行する必要があると仕様に記載されていないためです。したがって、依存関係情報が無視されたとしても、正しい順序は完全に有効な選択です。
この種の「偶然の」成功を避けるためにテストを書く方法はありますか? これはかなり一般的な状況のように思えます。特に、テスト駆動型の「テストに失敗しない限りコードを書くな」というアプローチを取る場合はそうです。