用鼻子进行单元测试:在编译时进行测试?

时间:2009-05-21 10:40:21

标签: python unit-testing 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()。有没有办法在编译阶段进行鼻子执行测试,同时让模块在使用后释放不必要的资源?

2 个答案:

答案 0 :(得分:2)

处理此问题的一种简单方法是使用TESTING标志,并写入:

if not TESTING:
    del x

但是,您将无法正确测试模块,因为测试将在不同情况下运行到您的代码中。

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

答案 1 :(得分:2)

根据鼻子的主要开发者Jason Pellerin,鼻子单元测试框架cannot run tests during compilation。如果模块“构造”和测试例程都需要访问某个变量(在没有测试的情况下将被删除),这是一个潜在的烦恼。

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

另一个,也许更清洁的选择是将一个模块专用于任务:该模块将包含由模块“本身”(即没有测试)和它的测试共享的变量(并且不需要共享它不适用于测试)。

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