2012-11-04 58 views
2

我正在爲已認證的RESTful API編寫Python包裝器。我正在編寫我的測試套件(此處也是第一次測試編寫器),但有幾個問題:單元測試API包裝器

1.a)我如何進行調用,但不必將憑據硬編碼到測試中我會把它扔在Github上?

1.b)我有點嘲笑,但不知道該怎麼去做。這是否允許我不必致電實際服務?什麼是最好的方式去做這件事?

2)我測試什麼 - 只要確保我的方法正在傳遞字典中的某些項目?

3)我應該在這裏遵循任何最佳實踐?

回答

4

嗨TJ如果你能給我看一個你正在編寫的函數的例子(代碼在測試中,而不是測試代碼),那麼我可以給你一個示例測試。

但是總的來說:

1.A你會嘲笑調用外部API,你是不是想測試他們的認證機制,或者您的網絡連接是否正常工作。你只是試圖測試你是否用正確的簽名來調用他們的api。

1.b Python中的嘲諷相對比較簡單。我通常使用mocking library written by Michael Foordpip 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_funcmy_module。模擬對象記錄對它做了什麼。記住其中要修補很重要。您不會修補您從中導入對象的位置。您將其修補到您將使用它的位置。

  1. 您測試了您的代碼是否在給定輸入時執行了正確的操作。測試純函數(在函數編程意義上是純粹的)非常簡單。你斷言給定一個輸入a,這個函數返回輸出b。當你的函數有很多副作用時,它會變得有點棘手。

  2. 如果您發現測試某個函數/方法太困難或複雜,那可能意味着它是一段寫得不好的代碼。嘗試把它分解成可測試的塊,而不是將對象傳遞給函數,儘可能地嘗試傳遞原語。