您将如何使用 TDD 开发用于 API 响应解析的函数?

How would you develop a function for API response parsing using TDD?

提问人:Javed 提问时间:8/26/2023 最后编辑:jonrsharpeJaved 更新时间:8/26/2023 访问量:41

问:

我刚刚读了 Kent Beck 的《Test Driven Development: By Example》,并尝试将其应用到我当前的项目中。

给定一个 API 响应,我需要从中提取信息。API 响应是一个 JSON 数组:

[
 {"1789484079": "event1", "1531059415": "event2"},
 {},
 {},
 {"1234256612": "event3"}
]

该数组中的每个对象可以有多个键,每个键都是一个时间戳。对象可能为空。

任务是根据给定的时间戳查找最近的“事件”。例如:

  • 如果给定的时间戳1889484079则返回“event1”;
  • 如果给定的时间戳1689484079则“event2”是正确的选择。

因此,按照本书的指导,一个测试和一个返回常量的朴素实现:

def parse_response(response, timestamp):
    return "event1"


def test_api_response_parsing_returns_correct_events():
    response = [{1789484079: "event1", 1531059415: "event2"}]
    timestamp = 1889484079
    assert parse_response(response, timestamp) == "event1"

现在我需要让测试失败,这样我才有改进的余地。

def test_api_response_parsing_returns_correct_events():
    response = [{1789484079: "event1", 1531059415: "event2"}]
    timestamp = 1889484079
    assert parse_response(response, timestamp) == "event1"
    timestamp = 1689484079
    assert parse_response(response, timestamp) == "event2"

如果我们想像肯特·贝克(Kent Beck)在他的书中建议的那样,继续小步前进,下一步会是什么?

再引入 2 个常量?

def parse_response(response, timestamp):
    if timestamp == 1889484079:
        return "event1"
    else:
        return "event2"

这开始看起来像是重复,我们必须摆脱它。我们将如何做到这一点?我对下一步的想法是,我们有时间戳,所以为了消除重复,我们必须遍历响应,同时根据函数必须遵循的规则检查时间戳,但这难道不是一个很大的飞跃,而不是一小步吗?response

如果你遵循TDD原则,你会如何开发这个功能?

蟒蛇 TDD

评论

0赞 quamrana 8/26/2023
您现在可以只使用该参数。如果实现只是:.这只会让两个测试都通过,你可以开始考虑你想要测试的下一个功能是什么。responsereturn response[0][timestamp]
0赞 Javed 8/26/2023
嗨,@quamrana!不幸的是,它会失败并出现“KeyError”异常,传递的时间戳在 中不是必需的,它被用作我们在搜索正确事件时应该考虑的参数,大于传递的时间戳将被忽略response
0赞 quamrana 8/26/2023
好的,我明白发生了什么。那么,为什么在第一个测试中,您传入并期望在该时间戳不在参数中时收到反馈呢?timestamp = 1889484079event1response
0赞 jonrsharpe 8/26/2023
那是因为你的例子已经有点太复杂了。最简单的测试是 -> :如果只有一个事件,它总是最新的。然后 -> :如果有多个事件,则取最后一个事件。然后,根据您的上下文和需求,您可能会考虑例如“如果时间戳在最后一个事件之前怎么办?”或“如果数组中有多个对象怎么办?”下一步(保持示例与实际结构一致 - 例如,最新事件是否总是在数组中的最后一个对象中?)[{"0": "event1"}]"event1"[{"0": "event1", "1": "event2"}]"event2"
1赞 Javed 8/30/2023
@VoiceOfUnreason,嗨!认为你是对的,这或多或少是关于讨论的,但找不到更好的地方开始,谢谢你的链接:)

答: 暂无答案