【问题标题】:Strategy for debugging a python unittest assertion that only fails when not debugging调试仅在不调试时失败的python unittest断言的策略
【发布时间】:2014-01-21 14:12:43
【问题描述】:

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

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

我的问题是,在幕后可能发生了什么,以及可以使用哪些策略来追踪问题?

【问题讨论】:

  • 看起来你有自己的Heisenbug
  • @MartijnPieters 谢谢,他们说命名问题是解决方案的一半(或类似的东西)

标签: python debugging pycharm methodology


【解决方案1】:

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

最终,解决方案来自大量的打印声明,并等待灵感闪现以仔细检查哪些文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    相关资源
    最近更新 更多