我正在用 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"])
问题是这个测试(有时)甚至在我添加依赖处理代码之前就已经工作了。这是因为规范没有说明任务必须以特定的顺序运行。所以即使依赖信息被忽略,正确的顺序也是一个完全有效的选择。
有没有办法编写测试来避免这种“意外”成功?在我看来,这是一种相当普遍的情况,尤其是在采用测试驱动的“不要在没有失败测试的情况下编写代码”方法时。