簡體   English   中英

單元測試python類的正確方法是什么?

[英]What's the right way of unit-testing a python class?

我不確定在python類的方法上構建獨立的單元測試的最佳方法是什么。 這是一個簡單的示例:

class MyClass(object):
  def __init__(self, data):
    self.data = data

  def myMethod(self):
    #do something
    return True

我正在建立這樣的單元測試:

class TestMyClass(unittest.TestCase):
  def test_init(self):
    mydata = mock.Mock()
    c = MyClass(mydata)
    self.assertEqual(c.data, mydata)

  def test_myMethod(self):
    mydata = mock.Mock()
    c = MyClass(mydata)
    self.assertTrue(c.myMethod())

好的,這是非常瑣碎的……但是重點是: test_myMethod()依賴於__init__因為我必須實例化對象本身:它並不是真正的孤立。 我想到解決此問題的唯一方法就是模擬對象本身...但是如何在模擬對象上測試真實方法呢?

我知道在現實世界中不可能實現完美的隔離,但是我很好奇是否有更好的方法。

它取決於您要測試的內容以及粒度。 例如,斷言c.data等於您在上一行實際測試中剛剛分配的數據到底是什么? 它僅測試一行實用代碼,並且測試不重要的實現細節。 這可能太麻煩了。

您要確保對象的行為與總體情況一樣。 這意味着您要測試可以實例化它,然后斷言

  1. 如果使用數據A實例化它,然后調用方法B,則結果將為C
  2. 如果使用數據D實例化它,然后調用方法B,則結果將為E
  3. 如果嘗試使用不正確的數據實例化它引發了錯誤

您的測試應專注於對象行為 ,而不是測試實現細節。 編寫測試,以便您可以放入替代對象,以不同的方式實現相同的行為而不會破壞測試。 您正在編寫該類來完成一些指定的任務; 測試您的實現可以完成那些任務,而不是如何完成它們。

示例:

def test_worksWithDataA(self):
    c = MyClass({'some': 'data'})
    self.assertTrue(c.myMethod())

def test_worksWithDataB(self):
    c = MyClass({'other': 'data'})
    self.assertFalse(c.myMethod())

def test_rejectsDataC(self):
    with self.assertRaises(SomeException):
        MyClass(None)

僅在需要傳遞依賴項時才需要模擬某些東西,但是該依賴項太復雜而無法為測試而實例化。 只要您的數據只是一個dict ,就不必模擬它。 如果您的數據本身就是一個復雜類型,那么您可能想對它進行模擬以測試MyClass ,而不必糾結於同時測試另一個類。 再次模擬時,模擬該類的預期行為 根據經驗,您在類中使用單元測試所斷言的所有行為都可以在其他地方進行模擬。

暫無
暫無

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

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