2016-07-07 75 views
1

有沒有現有的測試套件可以用來測試IOBase的實現?如果可能的話,我想詳盡地測試一個新的實現,但是有很多測試需要手動編寫。例如,假設我有一個不可查找的,不可寫的數據流。我想驗證我的read的實現是否符合要求,並且所有其他方法都會引發正確的錯誤。這樣的類可能是這樣的:如何驗證python的IOBase的實現?

import io 


class NonSeekableReader(io.RawIOBase): 
    def __init__(self, b=b''): 
     super(NonSeekableReader, self).__init__() 
     self._data = io.BytesIO(b) 

    def seekable(self): 
     return False 

    def writable(self): 
     return False 

    def readable(self): 
     return True 

    def read(self, n=-1): 
     return self._data.read(n) 

也許讀作品我最初預期,但也許也有優勢情況下,我會用更復雜的實現錯過。實驗表明,文檔對於預期的行爲至少是混淆的。

基礎上python docs我可以看到,通過定義writeable返回Falsewrite要引起OSError(在Python 3.5)。這實際上並非如此,當從RawIOBaseAttributeError繼承從IOBase繼承時它將引發NotImplementedError。此行爲在seekable中不重複,即致電.tell()會產生正確的錯誤。要解決這個問題,我定義write像這樣:

def write(self, b): 
    raise io.UnsupportedOperation("write") 

值得注意的是,一個文件,打開'r'產生預期的錯誤類。

由於在鏈接文檔頁面之外沒有實現這些接口的一般指導,我甚至不會想要檢查這個問題。預先存在的測試套件可以解決這個問題。否則,對必要的測試或邊緣案例的描述將引導我圍繞這些問題。

這樣的指導是否存在我根本找不到的地方?

+0

'RawIOBase'和'IOBase'是* *基類。這是你的責任,編寫具體的課程,使他們符合 –

+1

正確的,但我正在尋找更嚴格的指導如何驗證。有一些非顯而易見的邊緣案例和我想避免的mixin潛在問題。 –

回答

1
  • Python文檔是唯一的官方,包括對股票實施的行爲,承諾/保證權威人士 - 但只是沒有其他正式出版。如果沒有記錄,則不存在不應被依賴。

    • 有對io模塊,test_io.py單元測試,在源回購(你也可以選擇安裝測試套件的解釋)。根據您在下一段中的回答,注意具體實施細節。
      • 也看具體的執行io基類的細節:as Andrea Corbellini noted,有一個基類規範並沒有爲它的衍生物的規範。
  • 有些行爲是實現特定的,確實Python實現之間的不同(如IronPython中,sys.maxsize是大的離譜「因爲有一個在.NET中沒有這樣的機制,所有的字符串都是Unicode,即使它實現的Python 2)。

    • 這裏的問題是:是你的目標compilance與規範或用具體實施?答案取決於你想要兼容多少(以及寫得多好(或者說,很糟糕,即不可重寫))代碼。
      • 由於我們在這裏討論的是抽象類,除了相關實體中的小的默認/非抽象代碼之外,沒有真正的「具體實現」。所以差異很小。
  • 現在,確有情況下,規範遺漏,或者是模糊的,一些關鍵細節(我親自跑成至少兩種情況​​)。這是因爲它是作爲用戶而不是實現者指南編寫的。

    • 在這裏除了堅持規範和修正它們,你可以在這裏做任何事情。在含糊的情況下,您可以檢查執行情況,但一定要找出理由(它是概念上打算使用的)來決定什麼適合您的情況。畢竟,如果您要更換內部模塊,您怎麼知道其他內部模塊依賴的非文檔行爲?
      • 對於Python開發人員來說,後一種情況應該是非常罕見的,因爲他們遵守鬆耦合原則併力求在模​​塊間交互中堅持規範(有規範的地方)。
+0

哎呀,剛剛意識到我忘了標記爲已回答。 –