用于调试python unittest断言的策略,该断言仅在未调试时失败

时间:2014-01-03 19:49:46

标签: python debugging pycharm methodology

我在调试模式下运行单元测试时使用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
....

课程的其余部分相当大,所以我不会在这里包括它,除非有人认为它可能有错,在这种情况下我会编辑。 [我不是在寻找我的代码中的错误的解决方案,只是在工具播放时如何跟踪它]

我的问题是引发这种情况可能会发生什么,以及可以用什么策略来追踪问题?

1 个答案:

答案 0 :(得分:2)

在这种特殊情况下,当set类型被迭代时,Heisenbug是由于任意排序,这种类型恰好是可重复的,但在运行模式和调试模式之间有所不同,请参阅this discussion ...我的不好。< / p>

最后,解决方案来自丰富的印刷语句,并等待那些需要仔细检查的文档的灵感闪现。