4

我正在嘗試加載測試Web服務。Visual Studio Load Test以數據驅動的方式模擬許多用戶?

我有一個簡單的方法,需要2個參數發送到Web服務並返回響應,並且我從這個方法創建了一個單元測試。

因爲我 需要測試各種不同的輸入有效地測試服務,我建立一個CSV與約1000行作爲單元測試的數據源。

我可以運行這一個單元測試,它會旋轉所有行,依次調用具有不同值的Web服務。

但是,這不是我所需要的。我需要每一行對應於一個不同的用戶在不同的線程,使用負載測試配置,以包括思考時間,斜坡上升用戶提供步驟負荷,測試組合的配置等

我可以通過除去達到這個從單元測試和硬編碼值,我的數據源.. 但是這是一個根本性的缺陷測試:爲了真正測試Web服務,我需要每個用戶被髮送不同的價值觀和獲得不同的結果。

...

那麼,如何可以掛鉤一個數據源到負載測試和有負荷試車開始與不同值的單元測試的每個用戶的實例?

回答

4

最後我用這個答案作爲指導:https://stackoverflow.com/a/7813465/237723

而不是創建控制檯應用程序的方法和負載測試單元測試單元測試,我創建了一個簡單的ASP.NET Web表單,它接受輸入並調用Web服務。

我使用這個新窗體記錄了Web性能測試,並創建了一個負載測試來運行該WPTest。


  1. 記錄測試後,我添加了CSV作爲一個DataSource本試驗。

  2. 有2個「請求」記錄:最初的GET &後續POST。 請確保您將它們都留在!我刪除了favicon.ico請求,因爲它不存在。 (這些預防措施可以避免)

  3. 通過擴展POST請求,我修改了與我的2個Web服務輸入相對應的TextBox參數的屬性,以從CSV中的相應列中獲取它們的值。

  4. 我改變了數據源訪問方法爲「不要自動移動光標」(你必須要擴大數據源表中,並通過修改其屬性右擊/ F4)。

  5. 然後我創建的WebTestPlugin(根據鏈接的答案)根據正在運行的用戶ID(一個int)手動移動光標。這將對應於負載測試根據步驟計劃加速的用戶實例。創建此類後,構建該項目,然後將其添加到Web性能測試中。


public class webtestplugin : WebTestPlugin 
{ 
    public override void PreWebTest(object sender, PreWebTestEventArgs e) 
    { 
     base.PreWebTest(sender, e); 
     e.WebTest.MoveDataTableCursor("DataSource1", "addresses#csv", e.WebTest.Context.WebTestUserId);       
    } 
} 
2

只是爲了回答你的問題,我敢肯定,這不能在MSTest和NUnit的框中完成(this approach不會堅持在這種情況下)。


但是,恕我直言,只是不要去那裏......從我的經驗,模擬〜1000個用戶了一臺機器會產生不良結果的,因爲測試中會遇到各種各樣的客戶端限制 - 線程池問題,傳出和傳入流量問題等等。我並不是說這無法克服,但它扭曲的程度足以考慮不同的方法。

在這種情況下,我實際上不推薦使用負載測試工具(其中有許多工具),因爲它足夠簡單,可以編寫您自己的小工具,並跳過配置問題和學習曲線第三方。

我所推薦的是編寫自己的工具,並從單獨的機器運行它。它不一定要通過測試框架來運行(我不能讓自己把它稱爲單元測試,因爲它不是),控制檯應用程序將會做到這一點。下面是一些代碼,讓你開始:

private ConcurrentBag<string> logs = new ConcurrentBag<string>(); 

public void GetLoad(int numberOfUsers, List<string> myParams) 
{ 
    var users = new string[numberOfUsers]; 
    for (int i = 0; i < numberOfUsers; i++) 
    { 
     users[i] = string.Format("LoadTest{0}", i + 1); 
    } 

    var userThreads = new List<Thread>(); 
    for (int i = 0; i < numberOfUsers; i++) 
    { 
     int index = i; 
     userThreads.Add(new Thread(()=> CallWebService(users[index], myParams[index]))); 
    } 

    Parallel.ForEach(userThreads, thread=>thread.Start()); 
    foreach (var userThread in userThreads) 
    { 
     userThread.Join(); 
    } 
    var outputFilename = string.Format("LoadTest.{0}Users.txt", numberOfUsers); 
    File.AppendAllLines(outputFilename, logs); 
} 
+0

我不會同時模擬1000個用戶。我的步驟程序僅將其記錄到250(在另一個測試中發現這是一個許可證問題)。但是我想在並行執行過程中用1000個不同的輸入測試Web服務方法。 – JoeBrockhaus

+0

我之前應該提到我寫了一個小應用來啓動線程並將並行流量推送到Web服務,就像您在這裏提到的那樣。當我開始增加更復雜的工作以跟蹤請求時間,查看錯誤/成功,將所有來自各種來源的信息彙總在一起,以清楚地瞭解可能存在問題的位置時,它開始發展到自己的項目中。 – JoeBrockhaus

+0

+1代碼供別人使用。 – JoeBrockhaus

相關問題