7

我正在将 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))

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

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])

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

我在任何地方都没有找到任何这样的例子,而且 Nose 的(相当稀疏且难以导航)文档似乎也没有提到它。这怎么能和鼻子一起工作?任何帮助将不胜感激。

4

1 回答 1

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.istestandnose.nottest标记哪个类是测试用例,哪个不是:

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

@tools.istest
class TestCase1(TestSomething):
    sef setUp(self):
        ...
于 2013-02-18T06:52:02.873 回答