代码之家  ›  专栏  ›  技术社区  ›  izrik

unittest发现-继承的测试方法被执行两次

  •  2
  • izrik  · 技术社区  · 8 年前

    情况1

    假设我有一个想重用的测试类, test_doubled.py :

    import unittest
    
    class BaseTestCase(unittest.TestCase):
        def test_something(self):
            self.assertTrue(True)
    

    BaseTestCase ,继承自 unittest.TestCase

    从命令行运行测试会按预期生成以下输出:

    $ python -m unittest discover -p test_doubled.py -v
    test_something (test_doubled.BaseTestCase) ... ok
    
    ----------------------------------------------------------------------
    Ran 1 test in 0.000s
    
    OK
    

    情况2

    现在假设我添加第二个模块, test_doubled_2.py ,如下所示:

    from test_doubled import BaseTestCase
    
    class DerivedTestCase(BaseTestCase):
        pass
    

    它继承自 基本测试用例 ,因此我希望它将具有相同的测试方法,并且该测试方法将得到执行。然而,当我运行它时,我得到以下输出:

    $ python -m unittest discover -p test_doubled_2.py -v
    test_something (test_doubled.BaseTestCase) ... ok
    test_something (test_doubled_2.DerivedTestCase) ... ok
    
    ----------------------------------------------------------------------
    Ran 2 tests in 0.000s
    
    OK
    

    它似乎运行该方法两次,一次用于派生类,一次用于基类。这根本不是我所期望的。

    情况3

    我的怀疑是 基本测试用例 从…起 测试2。py公司 基本测试用例 类正在执行。这似乎可以通过运行两个测试模块得到证实:

    $ python -m unittest discover -p test_doubled\*.py -v
    test_something (test_doubled.BaseTestCase) ... ok
    test_something (test_doubled.BaseTestCase) ... ok
    test_something (test_doubled_2.DerivedTestCase) ... ok
    
    ----------------------------------------------------------------------
    Ran 3 tests in 0.000s
    
    OK
    

    运行两个模块执行相同的测试方法 三次 ,而我希望它只执行两次。


    更新

    澄清一下 它本身应该是一个可用的测试,所以将其作为一个混合将不起作用。我只想防止它被额外执行。

    以下是预期结果:

    1. 只运行 基本测试用例 在中测试

      $python-m unittest discover-p test_加倍。py-v
      test_something(test_加倍。BaseTestCase)。。。好啊
      
      ----------------------------------------------------------------------
      在0.000秒内运行1次测试
      
      好啊
      

    2. 只运行 DerivedTestCase 在里面 测试2。py公司

      $ python -m unittest discover -p test_doubled_2.py -v
      test_something (test_doubled_2.DerivedTestCase) ... ok
      
      ----------------------------------------------------------------------
      Ran 2 tests in 0.000s
      
      OK
      

      它应该只执行 衍生测试用例 这个 基本测试用例 .

    3. 同时运行:

      $ python -m unittest discover -p test_doubled\*.py -v
      test_something (test_doubled.BaseTestCase) ... ok
      test_something (test_doubled_2.DerivedTestCase) ... ok
      
      ----------------------------------------------------------------------
      Ran 3 tests in 0.000s
      
      OK
      

      测试方法精确执行两次,每次一次 BaseTestcase 一次 衍生测试用例 .

    2 回复  |  直到 8 年前
        1
  •  2
  •   user8651755 user8651755    8 年前

    # mixin.py
    class TestMixin(object):
    
        def test_something(self):
            self.assertTrue(True)
    
    
    # test_base.py
    import unittest
    from .mixin import TestMixin
    
    class BaseTestCase(TestMixin, unittest.TestCase):
    
        pass
    
    
    # test_derived.py
    import unittest
    from .mixin import TestMixin
    
    class DerivedTestCase(TestMixin, unittest.TestCase):
    
        pass
    
        2
  •  2
  •   harmv    6 年前

    不要使用多重继承,它稍后会咬到你。

    使用中建议的包装方法 https://stackoverflow.com/a/25695512/328384