簡體   English   中英

創建網絡錯誤以測試分布式系統

[英]Create network errors for testing a distributed system

我正在開發一個用於通過HTTP進行通信的Java庫,我想測試其可靠性和性能,以防網絡問題,如數據包丟失,高延遲,低帶寬和擁塞。 我正在使用Apache的httpclient庫從客戶端進行連接,而Java自己的com.sun.net.httpserver.HttpServer用於啟動HTTP服務器。

是否有可用的庫來做這種事情,或者我應該自己推出? 我想我可以嘗試將自己的org.apache.http.conn.scheme.SchemeSocketFactory插入客戶端,並模擬上面提到的幾個問題,但我更喜歡使用已經有效的東西:-)

這類似於為單元測試創​​建TCP網絡錯誤的問題,但我正在尋找在Linux上涉及Java的解決方案。 我看過針對該問題的建議點擊,但我不確定它能提供我正在尋找的東西。

如果您沒有對系統進行集成測試,IE運行與外部服務器等完整堆棧,那么使用模擬工具就是您正在尋找的。 它們允許您記錄您正在使用的庫的行為。 這可以節省您運行庫代碼的時間,這不需要驗證。

使用類似mockito的東西,或者如果需要PowerMock ,您可以告訴庫在調用您調用的方法時拋出異常。

例:

import static org.mockito.Mockito.mock
import static org.mockito.Mockito.when
...
@Test(expected=HttpException.class)
public void invockationThrowsHttpException() {
    ...
    HttpClient httpClient = mock(HttpClient.class)
    when(httpClient).executeMethod(args...).thenThrow(HttpException...)

    underTest.invokeCodeUnderTest(args...)
    ...
}

上面的例子假設是JUnit4。 Mockito網站上有一個非常好的教程。 如果你需要模擬mockito不模擬的東西(例如靜態或最終方法),則使用PowerMock。

順便說一下,我注意到Apache的HTTP客戶端處於生命終結狀態,他們建議切換到Apache HTTP Components。 如果您的項目仍處於早期階段,那么現在可能值得切換。

由於Java API無法訪問低級網絡API,因此模擬它將具有挑戰性。

另外,Apache HTTP Core組件庫可能有助於您模擬延遲和數據丟失以及可能的帶寬問題。 該庫具有注入您自己的會話輸入和輸出緩沖區的功能。 您可以在HTTP Core的高級功能中找到該文檔

通過注入自己的緩沖區

  • 延遲可以是注入和寫入的小延遲
  • 丟失數據丟失了一些字節。 它不是真正意義上的數據包丟失,因為沒有重復的重發。
  • 可以通過調整讀/寫和刷新操作來限制帶寬。
  • 除了讀取和寫入緩沖區的所有減速之外,流量很難模擬。

您還可以查看Grinder項目中提供的TCPProxy 我沒詳細看過它。 文檔以EchoFilter為例,但我認為應該可以擴展過濾器以延遲流中字節的發送和接收。 但是使用代理來模擬網絡問題是有意義的。 這樣,您的客戶端和服務器仍然對正在進行的測試一無所知。

在這兩種情況下,網絡問題的模擬似乎是Java中可能的最佳努力。 否則,您可以設置本地防火牆,並將其配置為攔截並播放它收到的數據包。

希望這有用。

您可以考慮使用WANEM等WAN仿真器,而不是嘗試實現網絡錯誤(在您的情況下,它可能意味着修改httpclient庫或模擬服務器中的錯誤和延遲)。 在我看來,這將是一個更簡單,更可行的解決方案。

暫無
暫無

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

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