针对像 redis 这样的第三方软件编写测试的方法是什么
What is the way to write tests against a 3rd party software like redis
我不确定这是不是问这个问题的正确论坛,如果不是请指出正确的方向。
我想为类似于 redis 的第 3 方工具创建一个 library/client。对于 unit/integration 测试,我看到在 predis 库中,他们有直接与 运行 redis 实例交互的测试,还有使用模拟的测试。
所以我的问题是,如果我针对第 3 方工具的实际实例编写测试 运行 是否可以,还是我应该一直使用模拟?
编写单元测试时,重要的是只测试您感兴趣的功能。当您拥有第三方库时,运行 测试时您会对以下两件事之一感兴趣:
第三方软件是否正常运行
您可以为第三方库编写测试并将该工具视为 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())
在这种情况下,更改第三方工具不会影响测试。如果您更改配置以向该值添加或删除时间戳,测试仍然是正确的。如果您在代码中手动添加时间戳,它将失败。这正是您想要的 - 您的测试仅因一个明确的原因而失败。
我不确定这是不是问这个问题的正确论坛,如果不是请指出正确的方向。
我想为类似于 redis 的第 3 方工具创建一个 library/client。对于 unit/integration 测试,我看到在 predis 库中,他们有直接与 运行 redis 实例交互的测试,还有使用模拟的测试。
所以我的问题是,如果我针对第 3 方工具的实际实例编写测试 运行 是否可以,还是我应该一直使用模拟?
编写单元测试时,重要的是只测试您感兴趣的功能。当您拥有第三方库时,运行 测试时您会对以下两件事之一感兴趣:
第三方软件是否正常运行
您可以为第三方库编写测试并将该工具视为 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())
在这种情况下,更改第三方工具不会影响测试。如果您更改配置以向该值添加或删除时间戳,测试仍然是正确的。如果您在代码中手动添加时间戳,它将失败。这正是您想要的 - 您的测试仅因一个明确的原因而失败。