Python 使用nose的单元测试:编译时的测试?

Python 使用nose的单元测试:编译时的测试?,python,unit-testing,nose,Python,Unit Testing,Nose,nose单元测试框架是否可以在模块的编译阶段执行测试 事实上,我想用以下结构测试一些东西: 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()。有没有一种方法可以让

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

事实上,我想用以下结构测试一些东西:

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()。有没有一种方法可以让nose在编译阶段执行测试,同时让模块在使用完不必要的资源后释放这些资源?

一种简单的处理方法是使用测试标志,并写入:

if not TESTING:
    del x
但是,您不会真正正确地测试您的模块,因为测试将在不同的环境下运行到您的代码中


正确的答案是,您不应该真的费心手动清理变量,除非您确实因为它们而遇到了一些重大的性能问题。仔细阅读,这是一个重要的概念。根据nose的主要开发人员Jason Pellerin(nose单元测试框架)的说法,解决您遇到的问题,而不是某一天可能遇到的问题。

。如果模块“构造”和测试例程都需要访问某个变量(在没有测试的情况下会被删除),那么这是一个潜在的麻烦

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

另一个可能更简洁的选择是将模块专用于任务:该模块将包含模块“自身”(即无测试)及其测试共享的变量(如果没有测试,则不必共享)


这些选项的问题在于,如果没有测试,可以删除的变量会保留在内存中,这只是因为测试代码使用它们更好。至少,有了以上两个选项,用户不应该试图使用这些变量,也不应该感到有必要怀疑它们是什么

你担心垃圾收集不起作用吗?@S.洛特:如果在我的示例中不执行“del x”,我不明白为什么会通过垃圾收集删除x,因为它是它所在模块的一个属性。因此,我相信垃圾收集,但是,除非我弄错了,否则它不会在我的示例中起作用。没有?谢谢你的回复!我不确定您建议的测试变量如何与自动(鼻子)测试相匹配。。。您是否建议使用一个实际设置变量的nose setup函数?我试图在nose setUp()函数中设置它,但这不起作用。我不会总是将删除不必要的变量称为过早优化:它还告诉用户某些变量变得不相关,并且对后面的代码没有影响。@EOL:如果您希望模块变量保持在模块的局部,请使用前导_。或者将测试打包到一个函数中,以便在函数退出时删除变量。@S.洛特:谢谢!我确实用了“u”;我真正想要的是删除不再使用的变量(它们用于构造类属性)。我不知道如何将它们放在测试函数中,因为它们必须在测试函数之外使用(在类构造期间)……看起来类构造中使用的临时变量和鼻子测试函数在一起发挥得不好,对吗?