代码之家  ›  专栏  ›  技术社区  ›  Eric O. Lebigot

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

  •  3
  • Eric O. Lebigot  · 技术社区  · 15 年前

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

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

    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 回复  |  直到 15 年前
        1
  •  2
  •   Singletoned    15 年前

    处理这一问题的一个简单方法是使用一个测试标志,并编写:

    if not TESTING:
        del x
    

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

    正确的答案是,您不应该真正费心手工清理变量,除非您确实因为这些变量而遇到了一些主要的性能问题。读起来 Premature Optimization 这是一个重要的概念。解决你的问题,而不是你可能有一天会遇到的问题。

        2
  •  2
  •   Eric O. Lebigot    15 年前

    根据Nose的主要开发人员Jason Pellerin的说法,Nose单元测试框架 cannot run tests during compilation . 如果模块“构造”和测试例程都需要访问某个变量(在没有测试的情况下会删除该变量),则这是一个潜在的麻烦。

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

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

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