【问题标题】:How to test python code on command line如何在命令行上测试python代码
【发布时间】:2011-05-30 20:41:44
【问题描述】:

在编写和测试 python 方法时,我目前正在使用以下方法:

import foo as f
bar = f.bar()

bar.runMyMethodAndSeeIfItWorks()

如果我更改了方法中的某些内容,并且需要重新测试它,我必须执行以下操作:

f = reload(foo)
bar = f.bar()

bar.runMyMethodAndSeeIfItWorks()

我想知道是否有更简单的方法来解决这个问题

【问题讨论】:

    标签: python class command-line module reload


    【解决方案1】:

    编写一个真正的单元测试,并从命令行运行它。我发现这是采用单元测试的最令人信服的原因之一:无论如何,您将需要在编写方法时尝试它们,您最好以一种此后可以运行的形式进行测试。

    【讨论】:

    • 单元测试很棒,但它们无助于调试代码(除非您在单元测试中明确打印)。在命令行中运行 python 函数允许您调试代码,因为您可以直接访问变量。但是,这涉及重新加载模块并在该模块中重新实例化类。我想知道是否有更简单的方法来做到这一点?
    • 根据您运行单元测试的方式,您可以很好地在代码中进行调试。在你的代码中添加import pdb;pdb.set_trace(),你就在调试器中了。
    • @Newton:是的,有。这叫做“设计”。严重地。在编写代码之前,您应该花一些时间勾勒您的想法。您可以尝试新概念。然后完成您的设计,编写代码和单元测试。如果你把时间花在设计和理解上,那么“调试”就没什么用了。
    【解决方案2】:

    您必须指的是使用reloadPython shell [x] 进行测试。在这种情况下,reload 很好 - 我不会担心。您还可以:

    import foomodule
    

    后来:

    reload(foomodule)
    

    [x] 不要只使用 vanilla shell(在命令行上运行 python)- 而是尝试 IPython 或 Spyder 之类的东西。

    【讨论】:

    • 我使用 shell 来调试代码,因为我可以访问命名空间中的变量。问题是每次小的更改我都必须重新加载模块,然后重新实例化该类时,它会变得乏味。例如,在 matlab 上,当我进行更改时,我只是保存它并执行我正在测试的方法。更好的问题可能是如何在 Matlab 中测试 python 代码。这可以与 IPython 或 Spyder 一起使用吗?
    • @Newton:一些搜索告诉我 IPython 有一个自动重新加载扩展,您可能会发现它很有用 - 请参阅此处:projects.scipy.org/ipython/ipython/ticket/154
    【解决方案3】:

    您应该查看Doctests。这是学习测试的一种非常简单的方法。 本质上,您在交互式解释器中编写测试,然后您可以将它们复制/粘贴到函数的文档字符串中。 示例(来自 Python 文档)

    def factorial(n):
    """Return the factorial of n, an exact integer >= 0.
    
    If the result is small enough to fit in an int, return an int.
    Else return a long.
    
    >>> [factorial(n) for n in range(6)]
    [1, 1, 2, 6, 24, 120]
    >>> [factorial(long(n)) for n in range(6)]
    [1, 1, 2, 6, 24, 120]
    >>> factorial(30)
    265252859812191058636308480000000L
    >>> factorial(30L)
    265252859812191058636308480000000L
    >>> factorial(-1)
    Traceback (most recent call last):
        ...
    ValueError: n must be >= 0
    
    Factorials of floats are OK, but the float must be an exact integer:
    >>> factorial(30.1)
    Traceback (most recent call last):
        ...
    ValueError: n must be exact integer
    >>> factorial(30.0)
    265252859812191058636308480000000L
    
    It must also not be ridiculously large:
    >>> factorial(1e100)
    Traceback (most recent call last):
        ...
    OverflowError: n too large
    """
    <do stuff>
    
    
    if __name__ == "__main__":
    import doctest
    doctest.testmod()
    

    tldr; 您在要测试的代码行前面加上“>>>”,在它下面的行上显示预期的结果。还有更多内容,但这应该足以让您入门。

    【讨论】:

      猜你喜欢
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 2011-07-16
      • 2019-05-13
      • 1970-01-01
      • 2014-02-18
      相关资源
      最近更新 更多