如果一个返回的datetime对象一直在变化,那么如何模拟该对象?你知道吗
例如,我有一些代码查询一个api,获取一些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
}
我的代码是这样的:
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),...]
因此,我可以像上面的示例那样轻松地创建一个返回字典的mock api对象,但是我很难模拟返回的不断变化的datetime对象。你知道吗
即。
time=datetime.datetime(2017, 10, 20, 11, 2)
有人能告诉我怎么做吗?目前,我只在返回数据中有一个timeseries点并对时间值进行硬编码,但我觉得这并不是一个真正的测试,因为它应该返回60个结果。你知道吗
请忽略本例中使用的实际值,我知道它们是错误的,但这只是为了说明,因为我正在努力解释我的意思。你知道吗
我不太清楚你所说的“不断变化”到底是什么意思,所以我要做两个猜测并回答两个问题。你知道吗
我的第一个猜测是,当结果取决于当前时间时,您想知道如何编写单元测试。这使得输出不断变化,因此测试很难编写。你知道吗
为了解决这个问题,我要么将当前时间作为显式输入参数传递给正在测试的代码,要么模拟
datetime.now()
方法。这样,单元测试总是基于相同的时间进行计算,并且应该总是得到相同的结果。这也使得测试有趣的边缘案例变得更加容易,比如夏时制的改变。您可以为每个有趣的场景编写一个单独的测试用例,每个场景中都有不同的“当前时间”。你知道吗我的第二个猜测是,您正在询问如何为输入数据创建一组60个不同的datetime值。我可能会为前几个条目计算几个有趣的值,然后用
for
循环或range()
表达式生成其余的条目。你知道吗相关问题 更多 >
编程相关推荐