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.istest和nose.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)