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

Bor*_*ris 7 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))
Run Code Online (Sandbox Code Playgroud)

这是"直截了当"的方式,它是所有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])
Run Code Online (Sandbox Code Playgroud)

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

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

Bak*_*riu 15

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

class Something(unittest.TestCase):
    ...
Run Code Online (Sandbox Code Playgroud)

给出完全相同的结果.我认为你不应该继承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):
        ...
Run Code Online (Sandbox Code Playgroud)

另一种方法是将类的__test__属性设置为False:

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


class TestCase1(TestSomething):
    __test__ = True  #must put this
    def setUp(self):
        ...
Run Code Online (Sandbox Code Playgroud)

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

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

@tools.istest
class TestCase1(TestSomething):
    sef setUp(self):
        ...
Run Code Online (Sandbox Code Playgroud)