setUpModule,tearDownModule和import可以在鼻子下乱序

时间:2013-01-16 20:28:31

标签: python unit-testing nose nosetests

我有一些Python单元测试,我发现并运行鼻子。我观察到setUpModule(),tearDownModule()和测试模块导入的奇怪排序。我有这个(示例)目录结构:

test1.py
test_dir/test2.py

test1.py和test2.py都是这样的:

import sys
import unittest

def flushwrite(text):
    sys.stdout.write(text + '\n')
    sys.stdout.flush()

flushwrite("import %s" % __name__)

def setUpModule():
    flushwrite("setUp %s" % __name__)

def tearDownModule():
    flushwrite("tearDown %s" % __name__)

class Test(unittest.TestCase):
    def test1(self):
        flushwrite("running %s.test1" % __name__)

当我运行nosetests -s test1.py test_dir/test2.py时,我看到了这个序列:

  1. import test1
  2. import test2
  3. setUp test1
  4. 正在运行test1.test1
  5. tearDown test1
  6. setUp test2
  7. 运行test2.test1
  8. tearDown test2
  9. 这是我期望/渴望的。当我运行nosetests -s test1.py test_dir(使用测试发现来查找test2.py)时,我看到了这个序列:

    1. import test1
    2. import test2
    3. setUp test1
    4. 正在运行test1.test1
    5. setUp test2
    6. 运行test2.test1
    7. tearDown test2
    8. tearDown test1
    9. 请注意,test1的tearDown在test2的测试后执行。这意味着当test2运行时系统不处于干净状态!显然,在从大型目录树中发现的数千个测试的生产环境中,这可能是一个问题。

      怎么了?我误会了什么吗?有没有办法确保在每个测试模块之后运行tearDownModule?

1 个答案:

答案 0 :(得分:3)

由于您的test2.py文件与test1.py位于同一模块下,setUpModule中的tearDownModuletest1.py方法均适用于test2.py

我只使用setUpClasstearDownClass并将它们放在Test类中。这样你就可以确保setUp和tearDown分别绑定到每个类。