我有一個這樣的功能:
def function(df, path_write):
df['A'] = df['col1'] * df['col2']
write(df, path)
該函式并不那么簡單,但問題是,如果函式不回傳任何值,我該如何進行單元測驗?
如果函式回傳新的 df 很簡單,只需:
assert_frame_equal從庫中from pandas.testing import assert_frame_equal模擬 write 方法。
但沒有那個回報,我怎么能測驗 df 線?
uj5u.com熱心網友回復:
一般來說,我只能想到兩種函式:回傳值的函式和產生副作用的函式。
對于第二種,您通常不希望在測驗期間實際發生副作用。例如,如果您的函式將某些內容寫入磁盤或將某些資料發送到 Internet 上的某個 API,您通常不希望它在測驗期間實際這樣做,您只想確保它嘗試做正確的事情。
將磁盤 I/O 的例子作為一個副作用:您通常會有一些函式來實際寫入被function測驗呼叫的檔案系統。假設它被命名為write. 典型的方法是write在您的測驗中模擬該功能。然后,您需要驗證是否write使用您期望的引數呼叫了該 mocked。
假設您有以下code.py示例:
def write(thing: object, path: str) -> None:
print("Some side effect like disk I/O...")
def function(thing: object, file_name: str) -> None:
...
directory = "/tmp/"
write(thing, path=directory file_name)
為了測驗function,我建議如下test.py:
from unittest import TestCase
from unittest.mock import MagicMock, patch
from . import code
class MyTestCase(TestCase):
@patch.object(code, "write")
def test_function(self, mock_write: MagicMock) -> None:
test_thing = object()
test_file_name = "test.txt"
self.assertIsNone(code.function(test_thing, test_file_name))
mock_write.assert_called_once_with(
test_thing,
path="/tmp/" test_file_name,
)
查看unittest.mock有關使用標準庫進行模擬的更多詳細資訊。我強烈建議使用那里的工具而不是自定義猴子補丁。后者當然是可能的,但總是存在您忘記在每次測驗后將修補物件恢復到其原始狀態的風險。這可能會破壞整個其余的測驗用例,并且取決于您如何修補猴子,由此產生的錯誤的來源可能會變得非常難以追蹤。
希望這可以幫助。
uj5u.com熱心網友回復:
在模擬中,write()您可以添加斷言陳述句以確保形式符合df您的預期。例如:
def _mock_write(df, path):
assert path == '<expected path value>'
assert_frame_equal(df, <expected dataframe>)
所以完整的測驗用例將是:
def test_function(self, monkeypatch):
# Define mock function
def _mock_write(df, path):
assert path == '<expected path value>'
assert_frame_equal(df, <expected dataframe>)
# Mock write function
monkepyatch.setattr(<MyClass>, 'write', _mock_write)
# Run function to enter mocked write function
function(test_df, test_path_write)
注意這是假設您使用pytest支持設定和拆卸的測驗運行器monkeypatch。其他答案顯示了標準unittest框架的用法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/515037.html
標籤:Python熊猫单元测试python-unittest
上一篇:使用干凈架構進行單元測驗
