簡體   English   中英

使用Python 3在unittest中測試未知模塊

[英]Testing not known module in unittest with Python 3

我觀察到Python 3 unittest的奇怪行為。 在函數testValue測試之后,存在一個不存在的模塊。

import sys
import unittest

class ModuleTest(unittest.TestCase):

    def testValue(self):
        import unknown_module
        result = unknown_module.value

        self.assertEqual(0.0, result)


if __name__ == "__main__":
    print(sys.version)
    unittest.main()

Python2正確地給出了以下輸出:

2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)]
E
======================================================================
ERROR: testValue (__main__.ModuleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\bin\WinPython-64bit-2.7.5.1\workspace\unknown_module_test.py", line 7, in testValue
    import unknown_module
ImportError: No module named unknown_module

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (errors=1)

但是當引用unknown_module.value時,Python 3聲明了一個AttributeError。

3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (Intel)]
E
======================================================================
ERROR: testValue (__main__.ModuleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "unknown_module_test.py", line 8, in testValue
    result = unknown_module.value
AttributeError: 'module' object has no attribute 'value'

----------------------------------------------------------------------
Ran 1 test in 0.016s

FAILED (errors=1)

為什么不像Python 2那樣拋出Python 3一個ImportError呢?

您正在導入隱式命名空間包。 引用Python 3.3什么是新頁面

對不需要__init__.py標記文件的包目錄的本機支持,並且可以自動跨越多個路徑段(受各種第三方方法命名空間包的啟發,如PEP 420中所述)

PEP 420隱式命名空間包

如果掃描完成而未返回模塊或包,並且至少記錄了一個目錄,則會創建命名空間包。 新的命名空間包:

  • __path__屬性設置為在掃描期間找到並記錄的路徑字符串的可迭代。
  • 沒有__file__屬性。

命名空間包和常規包非常相似。 不同之處是:

  • 部分命名空間包不一定都來自相同的目錄結構,甚至來自同一個加載器。 常規包是自包含的:所有部分都位於同一目錄層次結構中。
  • 命名空間包沒有__file__屬性。
  • 命名空間包的__path__屬性是字符串的只讀可迭代,在修改父路徑時會自動更新。
  • 命名空間包沒有__init__.py模塊。
  • 命名空間包的__loader__屬性具有不同類型的對象。

sys.path刪除unknown_module目錄,測試將失敗,就像在早期Python版本中那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM