代码之家  ›  专栏  ›  技术社区  ›  OLIVER.KOO

python unittest阻止抽象测试基类测试本身

  •  0
  • OLIVER.KOO  · 技术社区  · 7 年前

    我拥有的:

    我有一个 TestBase.py 我将其用作抽象测试类。

    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 一切正常。如果我没有预期的日期,我会得到 NotImplementedError 如果我没有 test_command_OK 方法I获取 NotImplementedError: subclasses must override test_command()!

    问题:

    当我从安装程序运行测试套件时。py公司 python setup.py test 事情破裂了。我认为设置的原因。py正在运行 测试基地 单独和在 测试基地 expectedData None 所以它没有通过测试。

    ====================================================================== 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()!
    

    如果我打印出来 print(self.__class__) 在我的 test_check_expectData(self) 我得到的方法 <class '__main__.TestDemo'> 当我直接运行TestDemo时,一切正常。我明白了 myProject.tests.TestDemo.TestBase 当我跑步时 python设置。py试验 .

    我有办法告诉你吗 setup.py 不运行 测试基地 班大概 @unittest.skipis , @unittest.skipif, @unittest.skipunless ? 但我不希望子类跳过这些require测试,因为我希望所有子类都有expectData。TestBase旨在用作模板,强制/检查子测试类具有以下所有要求 expectData . 但它不应该单独运行。我怎样才能通过这个问题?我不介意建议,即使这意味着要重新调整我当前的测试框架

    1 回复  |  直到 7 年前
        1
  •  0
  •   OLIVER.KOO    7 年前

    显然,如果子类 super() 这个 TestBase

    from unittest.case import SkipTest
    
        def test_check_expectData(self):
            if self.expectData is None:
                raise SkipTest