2017-10-20 77 views
1

如果該對象不斷變化,如何模擬返回的日期時間對象?py.test:嘲諷不斷變化的日期時間對象

例如,我有一些代碼查詢API,獲取一些時間序列數據並將其作爲一系列日期時間對象返回。

因此,從查詢API返回的數據看起來類似:

{ 
    'from_date': 1497881400000.0, 
       'group_by': [], 
       'message': '', 
       'query': 'avg:system.load.norm.5{role:lb}', 
       'res_type': 'time_series', 
       'resp_version': 1, 
       'series': [{'aggr': 'avg', 
            'attributes': {}, 
            'display_name': 'system.load.norm.5', 
            'end': 1497709799000, 
            'expression': 'avg:system.load.norm.5{role:lb}', 
            'interval': 1, 
            'length': 60, 
            'metric': 
            'avg:system.load.norm.5{role:lb}', 
            'pointlist': [[1497881400000.0, 
            0.06923198629355053], 
            [.. 60 more points]], 
            'query_index': 0, 
            'scope': 'role:lb', 
            'start': 1497709742000, 
            'unit': [None, None]}], 
       'status': 'ok', 
       'to_date': 1497709800000 
} 

和我的代碼做到這一點:

from typing import NamedTuple 

class SampleMetric(NamedTuple): 
    query: str 
    time: datetime.datetime 
    value: int 

pointlist = api_query['series'][0]['pointlist'] 
return [SampleMetric(query=metric, 
          time=datetime.datetime.fromtimestamp(
           point[0]/1000), 
          value=point[1]) for point in pointlist] 

這在上述API數據的情況下會是這個樣子:

[SampleMetric(query='avg:system.load.norm.5{role:lb}', time=datetime.datetime(2017, 10, 20, 11, 2), value=231.8605833053589), 
SampleMetric(query='avg:system.load.norm.5{role:lb}', time=datetime.datetime(2017, 10, 20, 11, 3), value=243.17432022094727),...] 

因此,我可以很容易地創建一個模擬api對象,返回一個字典作爲我們的e xample在上面做了,但我真的很努力地模擬返回的日期時間對象。

time=datetime.datetime(2017, 10, 20, 11, 2)

誰能給我如何做到這一點,請任何想法?目前我已經解決了這個問題,只有一個時間點指向我的返回數據並對時間值進行了硬編碼,但我認爲這不是真正的世界測試,因爲它應該返回60個結果。

忽略在這個例子中使用的實際值,我知道他們是錯誤的,但這只是爲了說明的目的,因爲我努力解釋我的意思。

+0

如果您可以給出您想要測試的一些簡單代碼的具體示例,並描述測試難寫的原因,那麼您會得到更有幫助的答案。我猜想你的意思,但我不確定。 –

回答

1

我不確定你的意思是什麼「不斷變化」,所以我會採取兩個猜測,並回答他們兩個。

我的第一個猜測是你想知道當結果取決於當前時間時如何編寫單元測試。這使得輸出不斷變化,所以測試很難寫。

爲了解決這個問題,我將當前時間作爲明確的輸入參數傳遞給我正在測試的代碼,或者我嘲笑datetime.now()方法。這樣,單元測試總是基於同一時間進行計算,並且應該始終得到相同的結果。這也使得測試有趣的邊緣情況變得更加容易,例如夏令時的變化。您可以爲每個有趣的場景分別編寫一個單獨的測試用例,每個用戶都有不同的「當前時間」。

我的第二個猜測是,你問如何爲你的輸入數據創建一組60個不同的日期時間值。我可能會計算前幾個條目的一些有趣值,然後用for循環或range()表達式生成剩餘的值。