我在调试模式下运行单元测试时使用WinPython 2.7.5.3在PyCharm 3.0.2中工作,所有这些都在传递。但是,如果我正常运行它,我会失败 - 特别是下面代码的结果会在结果列表中返回一个额外的意外项目。
这是失败的测试:
def test4(self):
bz = BezNet()
bz.insert([P(1, 1), P(2, 3)])
bz.insert([P(1, 10), P(2, 30)])
nodes = [n for n in bz.nodes]
self.assertEqual(len(nodes), 4)
edges = [e for e in bz.edges]
self.assertEqual(len(edges), 2)
bbzz = bz.separate()
self.assertEqual(len(bbzz), 2) # assertioin fails (len==3) but ONLY in run mode
这是正在测试的班级BezNet
部分的摘录。
....
def _visit(self, a, nodes, edges):
if a in nodes:
return None
for b in a._out:
edges[a, b] = self._edges[a, b]
self._visit(b, nodes, edges)
nodes.add(a)
def separate(self):
result = []
while len(self._nodes):
nodes = set()
edges = {}
for x in self._nodes:
start = x
break
self._visit(start, nodes, edges)
part = BezNet()
part._nodes = nodes
self._nodes.difference_update(nodes)
part._edges = edges
for e in edges:
del self._edges[e]
result.append(part)
return result
....
课程的其余部分相当大,所以我不会在这里包括它,除非有人认为它可能有错,在这种情况下我会编辑。 [我不是在寻找我的代码中的错误的解决方案,只是在工具播放时如何跟踪它]
我的问题是引发这种情况可能会发生什么,以及可以用什么策略来追踪问题?
答案 0 :(得分:2)
在这种特殊情况下,当set
类型被迭代时,Heisenbug是由于任意排序,这种类型恰好是可重复的,但在运行模式和调试模式之间有所不同,请参阅this discussion ...我的不好。< / p>
最后,解决方案来自丰富的印刷语句,并等待那些需要仔细检查的文档的灵感闪现。