【问题标题】:Unit testing with nose: tests at compile time?用鼻子进行单元测试:编译时的测试?
【发布时间】:2010-10-27 21:32:03
【问题描述】:

鼻子单元测试框架是否可以在模块的编译阶段执行测试?

其实我想测试一下结构如下:

x = 123
# [x is used here...]
def test_x():
  assert (x == 123)
del x  # Deleted because I don't want to clutter the module with unnecessary attributes

nosetests 告诉我 x 未定义,因为它显然在导入模块后运行 test_x() 。有没有办法让鼻子在编译阶段执行测试,同时让模块在使用它们后释放不必要的资源?

【问题讨论】:

  • 您是否担心垃圾回收不起作用?
  • @ S. Lott:如果你在我的示例中不执行“del x”,我不明白为什么 x 会通过垃圾收集被删除,因为它是它的模块的属性坐在里面。因此,我相信垃圾收集,但是,除非我弄错了,否则它不会在我的示例中起作用。没有?

标签: python unit-testing nose


【解决方案1】:

处理这个问题的一个简单方法是有一个 TESTING 标志,然后写:

if not TESTING:
    del x

但是,您不会真正正确地测试您的模块,因为测试将在与您的代码不同的环境下运行。

正确的答案是您不应该真正为手动清理变量而烦恼,除非您实际上因此而遇到了一些重大的性能问题。阅读Premature Optimization,这是一个重要的概念。解决您遇到的问题,而不是您可能有一天会遇到的问题。

【讨论】:

  • 感谢您的回复!我不确定您建议的 TESTING 变量如何适合自动(鼻子)测试...您是否建议使用实际设置变量的鼻子设置功能?我试图将它设置在一个鼻子 setUp() 函数中,但这不起作用。我不会总是把删除不必要的变量称为过早优化:它还告诉用户一些变量变得无关紧要,对后面的代码没有影响。
  • @EOL:如果您希望模块变量保持在模块的本地,请使用前导 _。或者将您的测试打包在一个函数中,以便在函数退出时删除变量。
  • @S. Lott:谢谢!我确实使用“_”;我真正想要的是删除不再使用的变量(它们用于构造类属性)。我不知道如何将它们放在测试函数中,因为它们必须在它之外使用(在类构造期间)......看起来类构造中使用的临时变量和鼻子测试函数不能很好地结合在一起,对吧?
【解决方案2】:

据nose 的主要开发者Jason Pellerin 介绍,nose 单元测试框架cannot run tests during compilation。如果模块“构造”和测试例程都需要访问某个变量(在没有测试的情况下会被删除),这可能会带来麻烦。

一种选择是通过在名称前加上“__”来阻止用户使用这些不必要的保存变量(这也适用于类构造中使用的变量:它们可以是这些“私有”全局变量之一)。

另一个可能更简洁的选择是将模块专用于该任务:该模块将包含由模块“本身”(即没有测试)及其测试共享的变量(如果它不需要共享的话)不适用于测试)。

这些选项的问题是如果没有测试可以删除的变量被保存在内存中,只是因为测试代码使用它们更好。至少,通过以上两个选项,用户不应该试图使用这些变量,也不应该觉得有必要想知道它们是什么!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    相关资源
    最近更新 更多