根据doctest

时间:2018-01-07 21:35:13

标签: python

以下doctests失败,因为第一个会影响下一个。

def createNode(type):
  """Create a new node of `type`

  Example:
    >>> node = createNode("transform", name="myNode")
    >>> node == "myNode"
    True

  """

def getAttr(path):
  """Get attribute from `path`

  Example:
    >>> node = createNode("transform", name="myNode")
    >>> node == "myNode"
    True
    >>> getAttr(node + ".translateX")
    0.0

  """

我需要重置外部资源 - 在这种情况下是Autodesk Maya的场景图 - 在运行每个单独的doctest之前,使用这样的函数。

def setup():
  cmds.file(new=True, force=True)

当然,我可以在每次测试时调用上面的一次,直到我找到解决方案,但是为了这个项目的可读性和维护,我更喜欢将设置存放到专用功能中,因为当它增长并且需要时变化

Python的原生doctestnose都支持调用setup / teardown函数,但只支持每个文件级别。

我很高兴使用任何框架,我也会接受任何级别的黑客攻击它。它适用于大约30-100个doctests的单个模块,可以通过GitHub在Travis上运行。

1 个答案:

答案 0 :(得分:0)

不幸的是,最简单,最准确 - 尽管不是最快 - 的选项是在你建议的每次测试之前重置场景。除了一些应用程序级别全局变量,您将在每次测试之前重置所有场景内容。

然而,即使是微不足道的测试(创建一个立方体,删除它等),你将花费大量时间创建和删除空场景 - 不幸的是,Maya的任务很慢。尽管如此,这是最好的选择,因为否则需要复杂的代码来管理测试中的不变量 - 失败的测试可能很容易在场景中留下状态"更聪明"更快的重置方法将会错过,从而搞乱了测试运行。

许多maya人会尽可能使用模拟而不是场景测试:保证每次都以相同的顺序对cmds或api进行相同系列的调用,而不保证结果。作为测试,这不太令人满意,但会跑得更快并且会发生许多意外的变化。

你可能想看看doctest约束是否可以协商 - doctest必须是exec或类似的,所以你不会在与用户代码相同的范围内运行你的测试(至少,不一定)这也提高了代码在测试中运行良好但在运行时失败的可能性。

如果您使用maya.standalone实例运行测试,您将能够更快地完成测试; GUI延迟是使用cmds.file()时速度问题的重要部分。只要您不在代码中使用GUI元素进行测试 - 无论如何都要避免这种情况,因为GUI测试是一项复杂得多的业务 - 你应该没问题