【问题标题】:What is the way to write tests against a 3rd party software like redis针对像 redis 这样的 3rd 方软件编写测试的方法是什么
【发布时间】:2019-08-22 06:03:13
【问题描述】:

如果不是请指出正确的方向,我不确定这是否是提出这个问题的正确论坛。

我想为类似于 redis 的 3rd 方工具创建一个库/客户端。对于单元/集成测试,我看到在 predis 库中,它们有直接与正在运行的 redis 实例交互的测试,还有一些使用模拟的测试。

所以我的问题是,是否可以编写针对 3rd 方工具的实际实例运行的测试,还是应该一直使用模拟?

【问题讨论】:

  • 你在测试什么?您是在测试工具还是您的代码?如果您正在测试 3rd 方工具,那会有点不寻常,但您可以编写一个单元测试并将其视为黑盒。我想如果您决定将第 3 方工具换成其他工具并希望确保新工具的行为与您预期的相同,那么它可能会起作用。另一方面,如果您正在测试自己的代码,则不应该真正关心该工具。理想情况下,你会在单元测试中模拟它,因为你想隔离你的功能。但是,如果它至少是 a) 困难 b) 微不足道的一项,你也可以离开它
  • 是的。我在找这个,我应该把它当作黑匣子。如果您可以将其写为答案,那就太好了。

标签: javascript php unit-testing testing integration-testing


【解决方案1】:

在编写单元测试时,重要的是只测试您感兴趣的功能。如果您有第三方库,则在运行测试时您对以下两件事感兴趣:

第三方软件是否正常运行

您可以为第三方库编写测试并将该工具视为black box,因此您不是在测试内部,但如果它表现一致.此类测试的伪代码

//testing if a value is automatically timestamped
expected = "expected value"
tool.setValue("myKey", expected)

actual = tool.getValue("myKey")

assertThat(actual, endsWith(expected))
assertThat(actual, startsWith(dateToday()))

此测试将正式确定您对行为的假设和期望,如果您更改第三方工具并希望查看它是否仍按您预期的方式运行,该测试可能会很有用。你不关心内部结构,只关心你如何使用它。这对于在升级到工具本身的较新版本时进行验证或您切换到替代方案并希望确保它以相同的方式工作时很有用。需要注意的重要一点是,就您的期望而言,它的工作方式是相同的 - 无论您更改为什么都可能更快,或者可能通过网络进行通信或产生一些您不关心的其他效果。

您的代码行为是否正确

在这种情况下,您将编写一个仅测试您自己的代码的测试。单元测试隔离了功能,因此您可以用模拟替换该工具,以便仅验证您自己的代码是否正确。例如,如果您切换到不做时间戳的新版本工具,不要因为外部原因而让您的测试。

下面是一个测试样例的伪代码:

//check your code inserts the correct values without modifying them
mockTool = mock(SomeThirdPartyTool)
testInstance = new MyClass(mockTool)

expected = "some value"
expect(mockTool.insertValue()).toBeCalledWith(expected)

testInstance.insertValue(expected)

assertThat(expectationSatisfied())

在这种情况下,对第三方工具的更改不会影响测试。如果您更改配置以向该值添加或删除时间戳,则测试仍然是正确的。如果您在代码中手动添加时间戳,它将失败。这正是您想要的 - 您的测试仅因一个明确的原因而失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-19
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多