在Linux上使用Java模拟网络连接问题

3
我想要针对以下场景设置自动化测试:
1. 用户登录并执行一些“耗时”的操作,例如尝试上传文件。
2. 在这个耗时的操作中途,与服务器的连接断开了一段时间,然后恢复了。
3. 应用程序在这种情况下会执行它应该执行的操作。例如向用户显示一个消息,询问他们是否要重试。
我希望使用Selenium完成步骤1和3。问题是:如何将步骤2作为自动化测试的一部分?
工具和环境的详细信息如下:
1. Selenium使用Java和Junit。
2. 测试必须在Linux和Windows上运行。
3. 它还将在3个浏览器上运行:Firefox、Chrome和IE 11。
我考虑了几种解决方案:
1. 调用一些脚本来操纵机器上的连接。
2. 操纵浏览器的代理设置(代理指向虚假地址,因此连接被断开)。
3. 使用真正的代理,可以从代码中控制(例如通过某些命令),因此它可以表现为“工作”或“断开”的连接。
由于各种原因,这些解决方案都不是理想的。
所以:有人尝试过解决类似的问题吗?希望听到您的解决方案或您认为可能有效的替代想法。谢谢。

1
只需拔掉您的网络电缆即可。 - Scary Wombat
1
@Scary Wombat:鉴于我想在自动化测试中完成这项任务,我需要一个机器人,与Selenium测试同步进行。 - timbre timbre
这里的问题在于你说了“使用JAVA”。虽然有一些解决方案,但至少需要JNI,因为连接问题发生在Java无法访问的更低层。 - snovelli
@snovelli:我应该能以某种方式从Java控制它,但断开连接的代码不一定非得是Java代码。也就是说,如果你有另一个可以实际断开连接的服务/组件/应用程序,只要我能够从Java代码告诉它该怎么做就可以。 - timbre timbre
2个回答

2

选项1

桩测试

您需要确定真实情况下会抛出什么异常以及哪个组件会抛出它。您可以轻松地模拟场景,并在引发异常时,堆栈跟踪将准确告诉您哪个组件引发了它。

然后,您需要扩展引发异常的组件并将其注入到适当的位置,最终创建一个触发该异常的API。

如果您认为需要一个框架来自动化此类测试,请查看Fitnesse


选项2

模拟

模拟真实网络问题会非常复杂,而且在这种情况下收益不值得努力(个人认为)。

无论如何...... Linux具有称为netem的出色内置网络仿真层,可实现与网络流量的任何种类的无缝交互。此内核模块由tc命令行界面控制。

如果要将这些条件应用于单个端口,那么正确使用它并不容易,因为您需要:

  • Netfilter规则以标记要限制的数据包
  • Traffic Control策略
  • 将数据包绑定到策略的过滤器

一个简单的例子是如果您想在整个eth0上有10%的数据包丢失,那么您将使用:

tc qdisc change dev eth0 root netem loss 10%

接下来,您需要以某种可控的Java方式封装此功能。 如果我没有打击您的积极性,这是一个很好的指南:TrafficControl


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - timbre timbre

1
在Windows的命令提示符上,您可以执行以下命令来断开和重新连接网络。
> ipconfig /release
> ipconfig /renew

使用这个方法,您可以使用Java的Runtime类来执行命令。

Runtime.getRuntime().exec("ipconfig /release");

我已在 Windows 上测试过了,可以正常工作。Linux 中 cmd 命令的等价物如下:

> sudo ifconfig eth0 up
> sudo ifconfig eth0 down

请注意,这里的eth0是我的以太网连接的名称。您可以使用以下命令列出所有连接的名称。
> ifconfig -a

你可以查看以下帖子以通过Java执行bash - 如何在Java中使用sudo特权执行bash命令?

谢谢。虽然如果我必须通过脚本来完成,我宁愿使用tc或操作iptables,因为禁用网络连接或释放IP与暂时失去网络连接是非常不同的。 - timbre timbre

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