這個周末基本上都在研究這玩意兒中度過了,雖然效率不高,英文文檔看得暈頭轉向,但是好歹弄出來了 有個結果測試也通過了現在粗略總結一下有時間補上更多詳細的例子。
首先使用py.test測試框架,可以做最簡單的了解在它們官網上https://pytest.org/
flask現在有個很尷尬的地方,我在github上面clone的最新版的flask 0.11dev上面,關於example里面的flaskr easy_blog_application的測試已經轉而使用py.test框架了,但是官網上的和倉庫里的文檔都還停留在使用自帶庫unittest框架測試。所以暫時處於一個沒有文檔參照的情況, 不過好消息是 有代碼可以參照。
直接上代碼
@pytest.fixture def client(request): app.config['TESTING'] = True # 得到測試客戶端 client = app.test_client() def teardown(): app.config['TESTING'] = False # 執行回收函數 request.addfinalizer(teardown) return client
這里的decorator @pytest.fixture 是一個類似於unittest框架里面 setup()/teardown()一套的東西,他里面還有個參數scope 默認情況下scope是function也就是每個函數執行的時候都會執行被這個decorator包裹的函數 具體參照 http://pytest.org/latest/fixture.html#fixture 這個文檔講的非常清楚
然后這里就是申明一個fixture 叫client 這個client 會幫我打開對應需要測試的app.config['testing']=True 然后幫我得到測試客戶端 也就是我的測試上下文。 然后返回這個測試上下文 最后將測試配置恢復原狀。request.addfinalizer 在上面那個文檔地址里面也有介紹到。大致做一個操作就是在操作函數執行結束之后 調用對應參數里面的函數進行收尾工作。
然后就是具體的test_case:
class TestOrder: # 最外層請求頭 _data = { 'api_key': api_key, 'version': '1', 'time': str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')), } def test_order_get_success(self, client): url = '/order/get' value = { 'tid': '20160104-165157704', # 'tid': '12031823' } self._data['param'] = simplejson.dumps(value) self._data['api_sign'] = make_sign(self._data) rv = client.post(url, data=self._data) assert simplejson.loads(rv.data)['success'] == True, '請求訂單失敗' # noqa
要特別注意 申明類也必須使用Test打頭,不然py.test框架會找不到對應的測試對象,然后申明具體的test case 這里是test_order_get_success同理要使用test作為函數的開頭,測試框架才能找到。然后這里傳入測試客戶端,也就是我們得到的測試上下文對象。 最后進行相應的操作就行了,然后調用斷言操作對需要檢查的項目進行檢查。 返回的數據通通保存在 測試對象的.data里 也就是這里的rv.data。 這里只需要對rv.data里面返回值進行校驗就可以達到單元測試的目的了。
流程大致就是這樣。這樣做的好處是,這樣的測試可以放在項目對應的tests目錄下,並且可以調用travis-ci這樣的持續集成進行測試,無需手動測試。方便而且高效可靠。
