什么是单元测试中使用的好的无效 IP 地址?

72

我正在为一个客户端库编写单元测试。我想测试连接到无效端口和无效IP地址。有没有一个合适的IP地址可以使用,不会被路由到某个地方?我不想对运行单元测试的机器所在的网络做任何假设。LOCALHOST似乎是一个糟糕的选择,因为它是运行服务器组件的有效机器,而我想单独测试一个无效端口。在IPv4规范中是否有保留的INVALID-IP呢?

5个回答

93
根据RFC 5737的规定:
“192.0.2.0/24(TEST-NET-1)”,“198.51.100.0/24(TEST-NET-2)”和“203.0.113.0/24(TEST-NET-3)”这些地址块供文档使用。
这意味着您可以从以下地址范围中选择IP地址:
- 192.0.2.0 - 192.0.2.255 - 198.51.100.0 - 198.51.100.255 - 203.0.113.0 - 203.0.113.255

1
文档和单元测试是两个不同的事情:“这些块不适用于本地使用,过滤器可以在本地和公共环境中使用”。我希望单元测试能够具有功能性,即使只是在测试期间。 (如果此单元测试根本不涉及任何连接,则可以正常工作。) - Bruno
7
@Bruno:问题是:“有没有一个好的IP地址可以使用,不会被路由到其他地方?”从链接的文档中可以看到:“网络运营商应该将 [TEST-NET-1、TEST-NET-2 和 TEST-NET-3 块] 添加到非可路由地址空间列表中;如果部署了数据包过滤器,则应将此地址块添加到数据包过滤器中。”听起来很不错。 - Jonathan
好的观点,我只是不确定原帖作者是否不想进行一些实际的内部连接。 - Bruno
2
为了完整起见,我认为2001:db8::/32也应该包含在这个答案中。 - kasperd
我自己一直在使用文档地址进行单元测试。但后来我开始思考是否在RFC 2544中定义的198.18.0.0/15可能是更好的选择。 - kasperd
我想知道在测试期间是否可以期望实际连接立即返回这些地址?在OSX上似乎不是这种情况。 - andig

14

如果你正在寻找真正的无效IP地址(与不可路由的地址相对),你可以利用一个事实,那就是A类地址的第一个字节不能为0

比如:

0.42.42.42

4
我认为在这种情况下使用无效的IP地址可能会有风险。如果应用程序正在测试时使用的外部组件/API在提供无效的IP地址时行为不同怎么办? (很难解释我的意思,但是假设您将IP地址保存在具有IP地址类型的列中的数据库中。数据库可能返回错误,因为提供的IP地址无效。当发生这种情况时,您的单元测试失败,但并非因为您自己的问题。) - Jonathan
1
@Jonathan,我怀疑提问者实际上希望单元测试以那种方式运行(请注意他还想使用无效端口,因此他可能首先编写了一个失败的测试)。无论如何,这并不重要,因为我们的答案互补:你的提供技术上有效但无法路由的地址,我的提供无效的地址 :) - Frédéric Hamidi
我想要得到一个连接超时的异常,所以@Jonathan给了我我想要的东西。使用一个真正的“无效”IP会导致我的套接字库抛出不同的异常...也许也可以测试一下这个。不过这是一个好观点(+1)。 - Ryan R.
为了在单元测试期间强制出现“连接超时”异常,更简单(且更快)的方法可能是模拟套接字库中的方法,使其仅抛出该异常。例如,请参见 [tag:mockito]。 - avandeursen

5

Jonathan的答案(以及评论)适用于IPv4。

如果您的测试支持IPv6,那么可以使用显式黑洞:0100::/64,这在RFC 6666中有定义。

使用254.254.254.254很诱人,因为它易于记忆,但在某些平台上,它会立即显示“传输失败。常规故障”而不是实际超时,这可能是无效的单元测试。


我是针对原问题提出的表述方式,但请记住这是一个死帖。我之所以添加它,是因为它是一个明确的黑洞,完全符合这种情况(如果我有足够的声望,我会将其作为对Jonathan最高评分答案的评论添加进去)。 - Chris Rudd
这是唯一带有IPv6的答案,因此这确实应该是一个答案,而不是评论。而且这也是一个很好的答案。 - Smar

2

以下是可用于此类事物的3个私有IP地址块:

10/8(10.0.0.0 -> 10.255.255.255)(旧式的A类网段)

172.16/12(172.16.0.0 -> 172.131.255.255)

196.168/16(192.168.0.0 -> 192.168.255.255)(旧式的B类网段)


0

254.254.254.254

应该在保留用于未来的域名中...

RFC 1700


239.0.0.0 到 255.255.255.255 都是保留供未来使用的,一般情况下不会在任何地方起作用。 - William Dwyer
事实上,“255.255.255.255”已被分配含义。因此,保留范围仅为“239.0.0.0” - “255.255.255.254”。 - kasperd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接