我正在爲已認證的RESTful API編寫Python包裝器。我正在編寫我的測試套件(此處也是第一次測試編寫器),但有幾個問題:單元測試API包裝器
1.a)我如何進行調用,但不必將憑據硬編碼到測試中我會把它扔在Github上?
1.b)我有點嘲笑,但不知道該怎麼去做。這是否允許我不必致電實際服務?什麼是最好的方式去做這件事?
2)我測試什麼 - 只要確保我的方法正在傳遞字典中的某些項目?
3)我應該在這裏遵循任何最佳實踐?
我正在爲已認證的RESTful API編寫Python包裝器。我正在編寫我的測試套件(此處也是第一次測試編寫器),但有幾個問題:單元測試API包裝器
1.a)我如何進行調用,但不必將憑據硬編碼到測試中我會把它扔在Github上?
1.b)我有點嘲笑,但不知道該怎麼去做。這是否允許我不必致電實際服務?什麼是最好的方式去做這件事?
2)我測試什麼 - 只要確保我的方法正在傳遞字典中的某些項目?
3)我應該在這裏遵循任何最佳實踐?
嗨TJ如果你能給我看一個你正在編寫的函數的例子(代碼在測試中,而不是測試代碼),那麼我可以給你一個示例測試。
但是總的來說:
1.A你會嘲笑調用外部API,你是不是想測試他們的認證機制,或者您的網絡連接是否正常工作。你只是試圖測試你是否用正確的簽名來調用他們的api。
1.b Python中的嘲諷相對比較簡單。我通常使用mocking library written by Michael Foord。 pip install mock
會讓你開始。然後,你可以做這樣的事情
import unittest
from mock import call, patch
from my_module import wrapper_func
class ExternalApiTest(unittest.TestCase):
@patch('my_module.api_func')
def test_external_api_call(self, mocked_api_func):
response = wrapper_func('user', 'pass')
self.assertTrue(mocked_api_func.called)
self.assertEqual(
mocked_api_func.call_args_list,
[call('user', 'pass')]
)
self.assertEqual(mocked_api_func.return_value, response)
在這個例子中,我們用一個模擬對象替換api_func
內my_module
。模擬對象記錄對它做了什麼。記住其中要修補很重要。您不會修補您從中導入對象的位置。您將其修補到您將使用它的位置。
您測試了您的代碼是否在給定輸入時執行了正確的操作。測試純函數(在函數編程意義上是純粹的)非常簡單。你斷言給定一個輸入a,這個函數返回輸出b。當你的函數有很多副作用時,它會變得有點棘手。
如果您發現測試某個函數/方法太困難或複雜,那可能意味着它是一段寫得不好的代碼。嘗試把它分解成可測試的塊,而不是將對象傳遞給函數,儘可能地嘗試傳遞原語。