Python鼻子测试继承:从子类加载单元测试装置

时间:2013-02-18 02:39:30

标签: python unit-testing nose nosetests

我正在将Python项目的测试套件从unittest转换为nose。该项目的现有框架(基于unittest)相当笨重,包含大量用于测试发现和运行的高度定制的代码,所以我试图迁移到鼻子以使一切更加简化。

然而,我遇到了生成测试套件的代码问题。

项目的框架有两种运行测试的方法。一个是

class TestSomething(unittest.TestCase):

    def setUp(self):
        ...

    def test_x(self):
        ...

    def test_y(self):
        ...

suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestSomething))

这是“直截了当”的方式,它是所有Nose示例和教程显示的,并且它的工作原理。但是,第二种方法是定义一个包含所有测试逻辑的测试类,然后在包含不同设置配置的各个子类中创建测试用例,并从超类继承测试:

class TestSomething(unittest.TestCase):

    def test_x(self):
        ...

    def test_y(self):
        ...

class TestCase1(TestSomething):

    def setUp(self):
        ...

class TestCase2(TestSomething):

    def setUp(self):
        ...

suite = unittest.TestSuite()

cases = [TestCase1,TestCase2]
suite.addTests([unittest.makeSuite(case) for case in cases])

这就是Nose失败的原因。它首先尝试运行测试方法,这显然不起作用,因为超类中没有setUp(),并且还没有定义test_x()和test_y()中使用的许多变量。

我没有在任何地方找到任何这样做的例子,并且Nose的(相当稀疏且难以导航)文档似乎也没有提到它。如何使用鼻子?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:15)

首先,正如unutbu所指出的那样,您不应该向TestSomething提供以Test开头的名称,因为nose会自动将此类视为测试用例。此外,nose运行他找到的所有TestCase个子类,从而执行:

class Something(unittest.TestCase):
    ...

给出的结果与您完全相同。我认为你不应该继承TestCase并将该类用作混合:

class Something(object):
    def test_x(self):
        # here the various assertEqual etc. do not resolve, but you can use them
        # as if they were present, since in real test-cases they will be inherited
        # from unittest.TestCase.
        ...
    ...

class TestCase1(unittest.TestCase, Something):
    def setUp(self):
        ...

另一种方法是将班级的__test__属性设置为False

class TestSomething(unittest.TestCase):
    __test__ = False
    def test_x(self):
        ...


class TestCase1(TestSomething):
    __test__ = True  #must put this
    def setUp(self):
        ...

或者,您可以使用nose.istestnose.nottest来标记哪个类是测试用例,哪个类不是:

@tools.nottest
class TestSomething(unittest.TestCase):
    def test_x(self):
        ...

@tools.istest
class TestCase1(TestSomething):
    sef setUp(self):
        ...
相关问题