使用nose进行单元测试:编译时测试?

3 投票
2 回答
956 浏览
提问于 2025-04-15 11:44

请问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在编译阶段就进行测试,同时在使用完模块后释放不必要的资源呢?

2 个回答

2

处理这个问题的一个简单方法是设置一个测试标志,然后写:

if not TESTING:
    del x

不过,这样做的话,你实际上并不能真正测试你的模块,因为测试是在和你的代码不同的环境下运行的。

正确的做法是,除非你真的因为变量而遇到了一些严重的性能问题,否则不需要手动清理变量。可以了解一下过早优化这个概念,它非常重要。解决你现在遇到的问题,而不是去担心将来可能会出现的问题。

2

根据nose的主要开发者Jason Pellerin的说法,nose这个单元测试框架在编译时无法运行测试。如果模块的“构建”和测试程序都需要访问某个变量(而这个变量在没有测试的情况下会被删除),这可能会让人感到烦恼。

一个解决办法是通过在变量名前加上“__”来提醒用户不要使用这些不必要保存的变量(这个方法同样适用于类构建中使用的变量:它们可以是这些“私有”的全局变量)。

另一个可能更好的办法是专门创建一个模块来处理这个问题:这个模块会包含一些变量,这些变量是模块“本身”(也就是没有测试时)和它的测试共享的(如果没有测试,这些变量就不需要共享)。

这些方法的问题在于,如果没有测试的话,这些本可以被删除的变量却因为测试代码的需要而一直保留在内存中。至少,采用上述两种方法后,用户就不会被诱惑去使用这些变量,也不需要去想它们是什么了!

撰写回答