如何为模块内的所有测试定义设置和拆除

时间:2014-05-12 16:32:35

标签: python automated-tests nose nosetests

我使用nosetest作为我的测试框架,我的所有测试都是函数 测试函数不在类中。

我没有用设置来装饰每个功能,而是希望定义一个设置&拆解功能,一次写入并在模块中每次测试之前和之后运行。

有没有人知道这是一种优雅的方式?

2 个答案:

答案 0 :(得分:2)

这是unittest的默认行为:

test.py:
import unittest

class TestFixture(unittest.TestCase):
    def setUp(self):
        print "setting up"

    def tearDown(self):
        print "tearing down"

    def test_sample1(self):
        print "test1"

    def test_sample2(self):
        print "test2"

这是做什么的:

    $ python -m unittest test
    setting up
    test1
    tearing down
    .setting up
    test2
    tearing down
    .
    ----------------------------------------------------------------------
    Ran 2 tests in 0.000s

    OK

答案 1 :(得分:1)

这可能不太优雅,但它会完成工作。首先,在定义测试的包中,写入decorators.py文件:

def setup_func():
    "set up test fixtures"

def teardown_func():
    "tear down test fixtures"

然后,在tests.py文件中,导入以下内容:

from decorators import setup_func, teardown_func
from inspect import getmodule
from nose.tools import with_setup
from types import FunctionType

从这里开始,您可以像往常一样定义所有测试。完成后,在文件的最底部写下:

for k, v in globals().items():
    if isinstance(v, FunctionType) and getmodule(v).__name__ == __name__:
        v = with_setup(setup_func, teardown_func)(v)

这将使用设置和拆卸程序修饰tests.py中定义的每个函数(而不是导入的函数)。

但重要的是,即使是不符合nose测试标准的功能也会被修饰。因此,辅助函数和实用函数将被装饰以及其他函数。在绝大多数情况下,这将是一个相当安全的操作。但是,如果你担心它会以某种方式破坏你的实际测试,你可以在另一个模块中定义它们并将它们导入。

编辑:所以这一切都有效,它适合您正在寻找的非常狭窄的解决方案。没有课程,每个功能装饰,没有手动@with_setup装饰等。但是,我强烈建议您将测试功能移到TestCase。它是无痛的,便携式的,它是对具有相同设置和拆卸的测试进行分组的标准方法。