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

使用Java在Linux上模拟网络连接问题,java,linux,windows,selenium,networking,Java,Linux,Windows,Selenium,Networking,我希望对以下场景进行自动测试: 用户登录并执行一些“冗长”操作。例如,尝试上载文件 在漫长的操作过程中,与服务器的连接会丢失一段时间,然后恢复 在这种情况下,应用程序执行它应该执行的任何操作。例如,向用户显示一条消息,询问他们是否要重试 我想要第一步。三,。由硒来完成。问题是:我如何做步骤2。作为自动化测试的一部分 有关工具和环境的详细信息: Selenium使用Junit在Java上运行 测试必须在Linux和Windows上运行 它还将在3种浏览器上运行:Firefox、Chrome、IE1

我希望对以下场景进行自动测试:

  • 用户登录并执行一些“冗长”操作。例如,尝试上载文件
  • 在漫长的操作过程中,与服务器的连接会丢失一段时间,然后恢复
  • 在这种情况下,应用程序执行它应该执行的任何操作。例如,向用户显示一条消息,询问他们是否要重试
  • 我想要第一步。三,。由硒来完成。问题是:我如何做步骤2。作为自动化测试的一部分

    有关工具和环境的详细信息:

  • Selenium使用Junit在Java上运行
  • 测试必须在Linux和Windows上运行
  • 它还将在3种浏览器上运行:Firefox、Chrome、IE11
  • 我一直在考虑的两个解决方案:

    • 调用操纵计算机上连接的脚本
    • 操纵浏览器的代理设置(代理指向假地址,从而断开连接)
    • 使用真正的代理,它可以从代码中控制(例如,通过一些命令),因此它可以表现为“工作”或“断开”连接
    由于各种原因,这些解决方案都不理想


    那么:有人试图解决类似的问题吗?希望听到您认为可行的解决方案或替代方案。谢谢。

    您可以在windows on cmd上执行以下命令来断开和重新连接网络

    > ipconfig /release
    > ipconfig /renew
    
    使用该命令,您可以使用Java
    运行时
    类来执行该命令

    Runtime.getRuntime().exec("ipconfig /release");
    
    我已经在windows上测试过了,效果很好。 与cmd命令类似的Linux命令如下

    > sudo ifconfig eth0 up
    > sudo ifconfig eth0 down
    
    请注意,这里eth0是我的以太网连接的名称。您可以使用列出所有连接的名称

    > ifconfig -a
    
    您可以查看以下线程,通过Java执行bash-

    选项1 短截图

    您必须确定在实际场景中抛出异常的组件是什么,以及抛出异常的组件是什么。您可以很容易地做到这一点,在计算机中模拟场景,当抛出异常时,堆栈跟踪将确切地告诉您抛出异常的组件

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

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


    选择2 模拟

    在这种情况下,模拟真实的网络问题将过于复杂,其好处不值得付出努力(imo)

    无论如何。。。Linux有一个优秀的内置网络仿真层,名为,它允许与网络流量进行任何类型的无缝交互。此内核模块由
    tc
    命令行界面控制

    当您希望将这些条件应用于单个端口时,要正确执行这些条件并不容易,因为您必须:

    • 用于标记要限制的数据包的Netfilter规则
    • 交通管制政策
    • 筛选器将数据包绑定到策略
    一个简单的例子是,如果您希望整个eth0有10%的数据包丢失,在这种情况下,您将使用:

    tc qdisc change dev eth0 root netem loss 10%
    
    然后,您必须以某种java可控制的方式包装此功能。
    如果我没能让你失望,这里有一个很好的指南:

    只要拔出你的网线。@Thrarry Wombat:因为我想在自动测试中完成,所以我需要一个机器人,与selenium测试同步来完成。这里的问题是你说的“使用JAVA”。有一些答案,但您至少需要JNI,因为连接问题发生在低于java能力的层中access@snovelli:我应该能够以某种方式从Java控制它,但它不必是中断连接的Java代码。也就是说,如果您有另一个服务/组件/应用程序可以执行实际的中断,只要我可以从Java代码中告诉它该做什么就可以了。谢谢。尽管如果我必须通过脚本来完成,我还是宁愿使用或操作
    iptables
    ,因为禁用网络连接或释放IP与暂时失去网络连接完全不同。感谢您的详细回答。我们在单元测试级别上有选项1,但希望在用户级测试上有一些“更现实的”。