2014-04-01 73 views
1

我在模塊pigso中單元測試一個Pigso類。清除導入的單元測試用例的正確方法是什麼?

class Pigso(object): 

    _count = 0 

    def __init__(self): 
     self.__class__._count += 1 
     self.ident = self.__class__._count 


我成立了一個單元測試與檢查第三Pigso對象有self.ident == 3

import unittest 
import pigso 


class TestPigID(unittest.TestCase): 

    def setUp(self): 
     reload(pigso) 
     from pigso import Pigso 
     self.pig1 = Pigso() 
     self.pig2 = Pigso() 
     self.pig3 = Pigso() 

    def test_dummy(self): 
     self.assertEqual(2 + 2, 4) 

    def test_pig_ident(self): 
     self.assertEqual(self.pig3.ident, 3, 
         msg="Pigso 'ident' {0} should be 'ident' 3" 
         .format(self.pig3.ident)) 

的意圖我有兩個問題:

1)什麼是關於爲什麼這種方法需要'導入','重新加載'和'從模塊導入'的'三重模式'的大概情況? (它是根據錯誤消息猜測而開發的)

2)是否有更優雅的pythonic方法?我的理解是單元測試方法要求對每個測試用例徹底清理和重建環境。如果我是正確的,那麼需要一種方法將導入的單元和類恢復到它們首次加載到測試單元時的狀態。

...後...
理論的響應和許多進一步的研究,我來認爲,正確的Python的方式是顯式或隱式刪除超對象†在燈具的拆解。 如果它是隱式的,那麼unittest需要修改。如果它是明確的,那麼我需要在Pigso.destroy.__superclass__()上添加tearDown方法。據我所知,該功能尚未在Python中可用。
我的確認爲在unittest導入部分和fixture setUp中組織刪除超類對象並不是pythonic,也不符合單元測試的核心設計概念。

我會很樂意聽到別人對此的意見,特別是關於如何實施Pigso.destroy.__superclass__的想法。

†我對'超類對象'的理解是,這是_count所在的地方。

回答

0
  1. 的大背景是,所有的單元測試應該運行相互獨立的,這就是爲什麼你有一個設置功能運行的每個測試用例之前調用。您已經在設置中重新加載,因爲沒有它,如果模塊的狀態改變了您的測試將不再是獨立的。你從聲明中檢索你的對象是不可避免的。

  2. 根據你提供的測試,如果你只是檢查縮進,你可以刪除test_dummy,確保只有一個測試用例,這樣你就可以刪除導入和重載語句。

+0

謝謝你的回覆。 'test_dummy'對於這個示例代碼是必須的,這個代碼被減少到了其他人測試或者玩的最小值。 test_dummy()函數由於unittest操作的方式而有副作用。如果Pigso超類對象沒有被正確刪除,那麼在'pig3.ident'在'test_pig_ident'和'self.pig3.ident == 6'中測試之前,將創建6個Pigso對象,以便測試失敗。 – lemi57ssss

+0

你可以把重新加載到拆卸方法....或者只是將類的計數變量設置爲零 –

+0

將導入模塊和重新加載(模塊)語句重新定位到tearDown方法是行不通的。任何閱讀代碼的人都會有所幫助,因爲它將這些陳述與拆卸過程聯繫起來。 我不熟悉在tearDown方法中重置單個類的屬性。例如:如果測試夾具A清除其自己的類屬性,但具有改變測試夾具B中使用的類屬性的副作用,則B不能使用單元測試所需的隔離進行操作。 – lemi57ssss

相關問題