python unittest 防止抽象 testBase class 测试自身

python unittest prevent abstract testBase class test itself

我有:

我有一个 TestBase.py 用作抽象测试 class。

from abc import abstractmethod

class TestBase:

    expectData = None

    def test_check_expectData(self):
        if self.expectData is None:
            raise NotImplementedError('you must have expectData')

    @abstractmethod
    def test_command_OK(self):
        raise NotImplementedError('subclasses must override test_command()!')

我想让别人继承TestBase。例如 TestDemo.py

import unittest
from TestBase import TestBase

class TestDemo(unittest.TestCase, TestBase):

    expectData = ["someData"]

    def test_command_OK(self):
        self.assertTrue(True)

if __name__ =='__main__':
    unittest.main()

如果我 运行 python TestDemo.py 一切正常。如果我没有 expectedDate 我会得到一个 NotImplementedError 如果我没有 test_command_OK 方法我会得到一个 NotImplementedError: subclasses must override test_command()!

问题:

当我 运行 来自 setup.py python setup.py test 的测试套件出现问题时。我认为 setup.py 的原因是 运行 单独 TestBase class 而 TestBase class expectedDataNone 所以它没有通过测试。

====================================================================== ERROR: myProject.tests.TestDemo.TestBase.test_check_expectData
---------------------------------------------------------------------- Traceback (most recent call last):   File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)   File "/Users/z002x6m/Desktop/myProject/tests/TestBase.py", line 49, in test_check_expectData
    if self.expectData is None: AttributeError: TestBase instance has no attribute 'expectData'
====================================================================== ERROR: myProject.tests.TestDemo.TestBase.test_command_OK
---------------------------------------------------------------------- Traceback (most recent call last):   File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)   File "/Users/z002x6m/Desktop/myProject/tests/TestBase.py", line 57, in test_command_OK
    raise NotImplementedError('subclasses must override test_command()!') NotImplementedError: subclasses must override test_command()!

如果我在 test_check_expectData(self) 方法中打印出 print(self.__class__),当我直接 运行 TestDemo 时我会得到 <class '__main__.TestDemo'>,这时一切正常。我得到 myProject.tests.TestDemo.TestBase 当我 运行 python setup.py test.

有没有办法让我告诉setup.py不要运行TestBaseclass?也许 @unittest.skipis , @unittest.skipif, @unittest.skipunless?但我不希望 subclass 跳过这些要求测试,因为我希望所有 subclass 都有 expectData。 TestBase 旨在用作模板,force/check 子测试 classes 具有 expectData 等所有要求。但它本身不应该是 运行。我该怎么做才能解决这个问题?我不介意建议,即使这意味着重新构建我当前的测试框架

显然,使用 SkipTest 会跳过测试 if subclass super() the TestBase class

from unittest.case import SkipTest

    def test_check_expectData(self):
        if self.expectData is None:
            raise SkipTest