008、【疑問】 unittest , 關於 loadTestsFromModule() 動態導模塊的問題


 

  現象 : 使用 unittest 寫的代碼(  其中含有  loader.loadTestsFromModule( )  ) ,用 pytest 執行測試,搜集不到測試用例 。

   疑問:難道用 pytest 執行  unittest 測試用例,動態導模塊時,一定需要把類也導入 ?

1、項目結構層級如下:

     

 

2、各目錄代碼如下:

  test_aa.py 代碼:

class TestAA:
    def __init__(self, a, b):
        self.a = int(a)
        self.b = int(b)

    def add(self):
        return self.a + self.b

  test_bb.py 代碼如下:

from unittest import TestCase
from aa.test_aa import TestAA


class TestBB(TestCase):
    def setUp(self):
        print("開始測試")

    def test_add(self):
        add = TestAA(3,5)
        actually_result = add.add()
        except_result = 8
        self.assertEqual(actually_result,except_result)

    def test_add_02(self):
        add = TestAA(2,5)
        actually_result = add.add()
        except_result = 7
        self.assertEqual(actually_result,except_result)


    def tearDown(self):
        print("測試結束")

  test_cc.py  代碼如下:

 
         
from bb.test_bb import TestBB
import importlib

from unittest import TestLoader, TestSuite


test_modlue = importlib.import_module('.test_bb', package='bb') #相對導入


suite = TestSuite()
loader = TestLoader()
suite.addTest(loader.loadTestsFromModule(test_modlue))
# suite.addTest(loader.loadTestsFromTestCase(TestBB))

 

 用pytest 的方式執行

 

  執行結果如下,搜集不到測試用例:

 

D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day14\venv\Scripts\python.exe "C:\SkyWorkSpace\WorkTools\PyCharm\PyCharm_Community_Edition_202003\PyCharm Community Edition 2020.3\plugins\python-ce\helpers\pycharm\_jb_pytest_runner.py" --path D:/SkyWorkSpace/WorkSpace/Pytest/Temp/day14/cc/test_cc.py
Testing started at 0:11 ...
Launching pytest with arguments D:/SkyWorkSpace/WorkSpace/Pytest/Temp/day14/cc/test_cc.py in D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day14\cc

============================= test session starts =============================
platform win32 -- Python 3.8.6, pytest-6.2.4, py-1.10.0, pluggy-0.13.1 -- D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day14\venv\Scripts\python.exe
cachedir: .pytest_cache
rootdir: D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day14\cc
collecting ... collected 0 items

============================== warnings summary ===============================
C:\SkyWorkSpace\WorkTools\python\Python38\lib\unittest\loader.py:66
C:\SkyWorkSpace\WorkTools\python\Python38\lib\unittest\loader.py:66: PytestCollectionWarning: cannot collect test class 'TestLoader' because it has a __init__ constructor (from: test_cc.py)
class TestLoader(object):

C:\SkyWorkSpace\WorkTools\python\Python38\lib\unittest\suite.py:92
C:\SkyWorkSpace\WorkTools\python\Python38\lib\unittest\suite.py:92: PytestCollectionWarning: cannot collect test class 'TestSuite' because it has a __init__ constructor (from: test_cc.py)
class TestSuite(BaseTestSuite):

-- Docs: https://docs.pytest.org/en/stable/warnings.html
============================= 2 warnings in 0.01s =============================

Process finished with exit code 5

Empty suite

 

 

1)如果我在 test_cc.py文件中加入導入類  from bb.test_bb import TestBB ,則執行成功。 為什么會是這樣呢? 

   代碼如下:

from bb.test_bb import TestBB
import importlib

from unittest import TestLoader, TestSuite


test_modlue = importlib.import_module('.test_bb', package='bb') #相對導入


suite = TestSuite()
loader = TestLoader()
suite.addTest(loader.loadTestsFromModule(test_modlue))
# suite.addTest(loader.loadTestsFromTestCase(TestMy))
View Code

  執行結果如下:

D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day14\venv\Scripts\python.exe "C:\SkyWorkSpace\WorkTools\PyCharm\PyCharm_Community_Edition_202003\PyCharm Community Edition 2020.3\plugins\python-ce\helpers\pycharm\_jb_pytest_runner.py" --path D:/SkyWorkSpace/WorkSpace/Pytest/Temp/day14/cc/test_cc.py
Testing started at 23:36 ...
Launching pytest with arguments D:/SkyWorkSpace/WorkSpace/Pytest/Temp/day14/cc/test_cc.py in D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day14\cc

============================= test session starts =============================
platform win32 -- Python 3.8.6, pytest-6.2.4, py-1.10.0, pluggy-0.13.1 -- D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day14\venv\Scripts\python.exe
cachedir: .pytest_cache
rootdir: D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day14\cc
collecting ... collected 2 items

test_cc.py::TestBB::test_add <- ..\bb\test_bb.py PASSED                  [ 50%]開始測試
測試結束

test_cc.py::TestBB::test_add_02 <- ..\bb\test_bb.py PASSED               [100%]開始測試
測試結束


============================== warnings summary ===============================
C:\SkyWorkSpace\WorkTools\python\Python38\lib\unittest\loader.py:66
  C:\SkyWorkSpace\WorkTools\python\Python38\lib\unittest\loader.py:66: PytestCollectionWarning: cannot collect test class 'TestLoader' because it has a __init__ constructor (from: test_cc.py)
    class TestLoader(object):

C:\SkyWorkSpace\WorkTools\python\Python38\lib\unittest\suite.py:92
  C:\SkyWorkSpace\WorkTools\python\Python38\lib\unittest\suite.py:92: PytestCollectionWarning: cannot collect test class 'TestSuite' because it has a __init__ constructor (from: test_cc.py)
    class TestSuite(BaseTestSuite):

-- Docs: https://docs.pytest.org/en/stable/warnings.html
======================== 2 passed, 2 warnings in 0.02s ========================

Process finished with exit code 0
View Code

 

2)如果我用 suite.addTest(loader.loadTestsFromTestCase(TestMath)) 替換   suite.addTest(loader.loadTestsFromModule(test_modlue))   是 正常的 。

 

 動態導模塊參考: https://blog.csdn.net/edward_zcl/article/details/88809212

 

 

二:單獨做了個實驗 ( 在不導入類的情況下 ,動態導入模塊),如下,是成功的 :

 

 疑問:難道用 pytest 執行 測試用例,動態導包時,一定需要把類也導入 ?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM