簡體   English   中英

如何在Java中模擬服務器停機/可用?

[英]How to simulate server down/available in java?

我們的應用程序具有服務器/客戶端。 客戶端支持離線和在線工作模式。 因此,當服務器關閉時,我需要測試客戶端,以恢復連接狀態。

問題來了。 如何模擬服務器停機。 使用代碼從關閉狀態切換為就緒狀態,或從就緒狀態切換為關閉狀態。

提前致謝。

約瑟夫


更新:實際上,我無法擴展服務器接口以響應不正確的狀態。 在我的測試方案中,服務器是透明的。 因此,錯誤的url +端口是解決此問題的方法。 但是,當會話有效時,我無法修改url。 另一種方法是修改主機文件以執行此操作。 我必須面對Windows中的特權問題。

取決於您所說的“服務器停機”。 可能的選項是:

  1. 編寫一個偽造/虛擬的服務器,該服務器可以返回與測試失敗有關的錯誤消息。

  2. 將客戶端要查找的服務器的IP地址更改為不存在的IP地址,以使其認為服務器已完全關閉。

在測試服務器停機時,提供任何不正確的URL或端口(首選)。 為了恢復,請提供正確的URL /端口。

基本思想是以某種方式模擬服務器的行為。 您可以使用模擬框架來做到這一點。

您也可以創建手動模擬來進行測試。 讓客戶端上服務器的“代理”實現此接口:

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();
    }
}

這取決於您在哪里進行測試。 如果您正在進行單元測試,最好的選擇是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

您需要使用root acces才能工作,但這確實具有不需要觸摸服務器或客戶端配置的優點。

為了模擬服務器宕機的情況,您可以編寫一個ServerAlwaysDown類來擴展您的實際服務器,但是會為每個連接拋出ServerException(HTTP 500)。

如果要徹底使用,請始終與測試的生產環境保持最接近的狀態,將客戶端和服務器放在不同的計算機上並切斷連接,然后恢復連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM