2013-02-11 13 views
6

對於那些知道Perl的人,我正在尋找類似於Python中的Test::Deep::is_deeply()的東西。如何比較兩個嵌套數據結構進行單元測試?

Python's unittest我可以方便地比較嵌套的數據結構已經,如果我希望他們是平等的:

self.assertEqual(os.walk('some_path'), 
       my.walk('some_path'), 
       "compare os.walk with my own implementation") 

然而,以期望測試,文件在os.walk元組的各個子列表的順序應毫無顧慮。

如果只是這個測試,那麼編寫簡單的解決方案就沒關係。但是我想象了幾個不同結構的嵌套數據的測試。我希望有一個通用的解決方案。

我檢查了Python自己的unittest documentation,看着pyUnitnose and it's plugins。主動維護也是使用的一個重要方面。

的終極目標,我將有一組描述類型的像UnorderedIterableSubsetOfSupersetOf,等這才叫來形容一個嵌套的數據結構,然後用這樣的描述比較兩個實際的數據集。

在我想是這樣的os.walk例如:

comparison = OrderedIterable(
       OrderedIterable(
       str, 
       UnorderedIterable(), 
       UnorderedIterable() 
       ) 
      ) 

以上描述的數據結構,即list(os.walk())將返回。對於數據在單元測試A和數據B的比較,目前的路徑名稱將被轉換成str(),和DIR和文件列表將比較與忽略順序:

self.assertDeep(A, B, comparison, msg) 

是那裏有什麼?或者人們自己編寫這樣一個微不足道的任務?我覺得這樣做很舒服,但我不想重塑,特別是不想編碼完整的正交類型集合,爲那些測試等。簡而言之,我不會發布它,因此下一個再次改寫......

回答

1

不是一個解決辦法,但目前實施的變通方法來解決這個問題列出具體的例子:

os_walk = list(os.walk('some_path')) 
    dt_walk = list(my.walk('some_path')) 
    self.assertEqual(len(dt_walk), len(os_walk), "walk() same length") 
    for ((osw, osw_dirs, osw_files), (dt, dt_dirs, dt_files)) in zip(os_walk, dt_walk): 
     self.assertEqual(dt, osw, "walk() currentdir") 
     self.assertSameElements(dt_dirs, osw_dirs, "walk() dirlist") 
     self.assertSameElements(dt_files, osw_files, "walk() fileList") 

我們可以從這個例子的實現,是相當多的代碼中看到的。正如我們還可以看到的,Python的單元測試擁有大部分所需要的成分

3

Python Deep似乎是一個項目來重新實現perl的Test :: Deep。它由Test :: Deep本人的作者撰寫。最後的發展發生在2008年夏季。

更新:我已經將模塊移植到Python3上this branch

相關問題