3

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

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

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

4

2 回答 2

2

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

if not TESTING:
    del x

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

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

于 2009-05-21T11:14:36.893 回答
2

根据nose 的主要开发者Jason Pellerin 的说法,nose 单元测试框架在编译期间无法运行测试。如果模块“构造”和测试例程都需要访问某个变量(在没有测试的情况下将被删除),这将是一个潜在的烦恼。

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

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

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

于 2009-05-24T20:23:12.557 回答