我正在将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的(相当稀疏且难以导航)文档似乎也没有提到它。如何使用鼻子?任何帮助将不胜感激。
答案 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.istest
和nose.nottest
来标记哪个类是测试用例,哪个类不是:
@tools.nottest
class TestSomething(unittest.TestCase):
def test_x(self):
...
@tools.istest
class TestCase1(TestSomething):
sef setUp(self):
...