2011-08-31 18 views
1

我们的应用程序有服务器/客户端。客户端支持离线和在线工作模式。 所以我需要在服务器关闭时测试客户端,重新获得连接。如何模拟服务器停机/在Java中可用?

问题来了。如何模拟服务器关闭。使用代码从关闭切换到就绪状态,或从准备状态切换到关闭状态。

在此先感谢。

约瑟夫


更新: 其实,我不能在服务器接口扩展到响应不正确的状态。在我的测试场景中,服务器是透明的。所以不正确的url + port是解决方案。 但是当会话有效时,我无法修改网址。另一种方法是修改hosts文件来执行此操作。我必须面对Windows中的特权问题。

+0

在这种情况下,只需从客户端拔下网线?! :) –

+0

是的。合理。这是另一种情况。尽管它们属于相同的情况:无法访问服务器。 – Joseph

回答

2

取决于“服务器关闭”的含义。可能的选项有:

  1. 编写一个假/假服务器,可以返回对应于关闭的错误消息以用于测试目的。

  2. 更改您的客户端查找到服务器的IP地址一个不存在的一个,这样它会认为服务器是完全下来。

0

为了模拟服务器关闭的情况下,你可以写一个ServerAlwaysDown类扩展实际的服务器,而是抛出ServerException(HTTP 500)为每个连接。

1

测试时关闭服务器,给任何不正确的URL或端口(首选)。为了恢复,请提供正确的URL /端口。

0

如果你想成为彻底的使用总是你有最近到生产环境的测试,把客户端和服务器在不同的机器上,并切断连接,然后将其还原。

1

的基本思路是模拟您的服务器的行为莫名其妙。您可以使用mocking frameworks来这样做。

你也可以为测试目的创建手动模拟。让客户端上的服务器的“代理”实现这个接口:

public interface IServer 
{ 
    bool foo(); 
} 

您可以创建一个“假”的实现,服务器和返回任何你想

public class FakeOfflineServer implements IServer 
{ 
    public bool foo() 
    { 
     // throw some exception here. 
    } 
} 

这种方法允许你假的不同的场景(没有网络连接,无效的凭证等)

你也可以使用组合物从在您的测试,以升降开关:

public bool FakeServer implements IServer 
{ 
    private IServer offline = new FakeOfflineServer(); 
    private IServer online = new Server(); 

    public bool isUp = false; 

    private IServer getServer() 
    { 
     return isUp ? online : offline; 
    } 

    public bool foo() 
    { 
     return getServer().foo(); 
    } 
} 
1

这取决于您正在测试的位置。如果你是单元测试,最好的选择是Bryan Menard提出的嘲讽。

如果您在集成或生产环境中进行测试,您可以切实切断您与服务器之间的连接。

根据您的操作系统,您可以通过多种方式执行此操作。

对于基于Windows的系统,Fiddler是太棒了。你几乎可以模拟任何事情,包括延迟请求,实际上只是抛出请求。它不需要Windows的管理员访问权限。

对于基于Linux的系统,我曾经使用过的一种技术是使用代理服务器,或者在操作系统级别切断端口。例如你可以做到这一点使用iptables:

否认(在这种情况下,25)接入到特定端口

/sbin/iptables -I OUTPUT -p tcp --dest 127.0.0.1 --dport 25 -j DROP 

,并再次允许它:

/sbin/iptables --delete OUTPUT 1 

你需要根用户可以使用它,但它确实具有无需触摸您的服务器或客户端配置的优势。