我可以在Nose中嵌套测试用例吗?

5 投票
2 回答
2113 浏览
提问于 2025-04-17 09:44

我最近对嵌套测试用例的结构产生了兴趣,像在 RSpec 和 Jasmine 这样的工具中都能看到这种用法。我在想,是否有 Nose 的插件可以实现一个测试查找器,让你可以像上下文一样嵌套类。这样写出来的测试大概会像下面这样:

from nose.tools import *
from mysystem import system_state

class TestMySystem (TestCase):
    def setUp(self):
        system_state.initialize()

    class WhenItIsSetTo1 (TestCase):
        def setUp(self):
            system_state.set_to(1)

        def test_system_should_be_1 (self):
            assert_equal(system_state.value(), 1)

    class WhenItIsSetTo2 (TestCase):
        def setUp(self):
            system_state.set_to(2)

        def test_system_should_be_2 (self):
            assert_equal(system_state.value(), 2)

在上面的假设案例中,system_state.initialize() 会在每个测试之前被调用。我知道有 PyVows 可以做到类似的事情,而且看起来不错,但我想找一个可以直接用在我当前项目中的工具,因为我的项目里已经有很多 unittest 或 nose 风格的测试了。

2 个回答

0

我知道的情况是这样,似乎没有直接的方法,但你可以通过在模块和包的层面上使用设置和拆除的方法来实现类似的效果。

你的例子可以变成:

def setup():
    system_state.initialize()

def teardown():
    system_state.teardown()

class WhenItIsSetTo1 (TestCase):
    def setUp(self):
        system_state.set_to(1)

    def test_system_should_be_1 (self):
        assert_equal(system_state.value(), 1)

class WhenItIsSetTo2 (TestCase):
    def setUp(self):
        system_state.set_to(2)

    def test_system_should_be_2 (self):
        assert_equal(system_state.value(), 2)
4

听起来你想让一些测试从其他测试中继承设置代码:

from nose.tools import *
from mysystem import system_state

class TestMySystem (TestCase):
    def setUp(self):
        system_state.initialize()

class WhenItIsSetTo1 (TestMySystem):
    def setUp(self):
        super(WhenItIsSetTo1, self).setUp()
        system_state.set_to(1)

    def test_system_should_be_1 (self):
        assert_equal(system_state.value(), 1)

class WhenItIsSetTo2 (TestMySystem):
    def setUp(self):
        super(WhenItIsSetTo2, self).setUp()
        system_state.set_to(2)

    def test_system_should_be_2 (self):
        assert_equal(system_state.value(), 2)

在这样做的时候要小心;如果父类里有实际的测试方法,当子类运行时,这些方法也会被执行(当然啦)。我在做这件事的时候,喜欢创建纯粹的父类测试,只提供设置和清理的代码,比如 setUp、tearDown 以及 classSetup/classTearDown。

这样做可以让你有任意层级的嵌套,不过一旦这样做了,你可能还需要为你的单元测试写单元测试……

撰写回答