2017-10-20 5 views
1

返されたdatetimeオブジェクトは、そのオブジェクトが絶えず変化している場合、どのように模擬しますか?py.test:常に変化しているdatetimeオブジェクトの模倣

たとえば、私はいくつかのtimeseriesデータを取得し、一連のdatetimeオブジェクトとして返すいくつかのコードを持っています。

だから、照会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 
} 

と私のコードは、この行います。上記のAPIデータの場合には、このようになります

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] 

を:

[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オブジェクトを作成することができますxampleは上記のとおりですが、返されるdatetimeオブジェクトの変更を模擬するのは本当に苦労しています。

すなわち time=datetime.datetime(2017, 10, 20, 11, 2)

誰も私にこれを行う方法上の任意のアイデアをしてください与えることはできますか?現時点では、私のリターンデータを1タイムリーに示すだけで時間価値をハードコーディングすることでこれを回避していますが、これは実際の世界テストではないと感じています。

PLEASEは、この例で使用される実際の値を無視し、私は彼らが間違っている知っているが、私は私が何を意味するかを説明するのに苦労していますので、これは説明目的のためだけです。

+0

テストしようとしているシンプルなコードの具体例を示し、テストがなぜ書きにくいのかを説明すると、より役立つ回答が得られます。私はあなたが意味するものを推測しましたが、わかりません。 –

答えて

1

「常に変化しています」という言い回しが正確ではないので、私は2つの推測を行い、両方に答えます。

私の最初の推測では、結果が現在の時間に依存する場合にユニットテストを書く方法が不思議です。そのため、出力が常に変化するため、テストを書くのは難しいです。

この問題を解決するために、私はテストしているコードに明示的な入力パラメータとして現在の時刻を渡すか、datetime.now()メソッドを偽装します。このようにして、単体テストは常に同じ時間に基づいて計算され、常に同じ結果を得なければなりません。これにより、サマータイムの変更など、面白いエッジケースをテストするのがずっと簡単になります。それぞれの異なる「現在の時間」を持つそれぞれの興味深いシナリオについて、別々のテストケースを書くことができます。

私の2番目の推測では、入力データに対して60種類の異なる日時の値のセットを作成する方法を尋ねています。おそらく最初のいくつかのエントリの興味深い値をいくつか計算し、残りをforループまたはrange()という式で生成するだけです。

関連する問題