2011-08-31 59 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 

你需要根用戶可以使用它,但它確實具有無需觸摸您的服務器或客戶端配置的優勢。

相關問題