3

我需要使用MSTest(LoadTests)和Visual Studio 2010來生成一些性能測試。我需要測試一個寧靜的服務並收集指標。如何使用xml在MSTest中創建參數化性能測試?

我創建了一個集成測試,它需要一個URL(像http://hostname/get/201212或其他任何ID)。後來我創建了一個loadtest,並設法執行數千次集成測試,並調查響應時間和服務器指標(CPU負載,內存等)。

現在我需要執行一個類似的場景,但每個測試都需要有一個從包含數千個的給定XML中讀取不同的ID。這個想法沒有任何緩存。

我到目前爲止試過/想過的?

  1. 「冒泡排序」解決方案是創建數千個測試,每個測試都有一個id。不可行
  2. 下一個方法是創建一個讀取xml的測試,遍歷它併發出請求。這種方法的問題是我會結束一個需要幾分鐘才能運行的大型測試。
  3. 我使用[ClassInitialize]從XML加載所有ID和[TestInitialiaze]改變一個全局變量,每個測試的執行可能的解決辦法...

我不知道,如果最後選項是最好的選擇。 MSTests中是否有任何機制允許我使用從XML中讀取的不同ID來執行LoadTests?

回答

2

我不喜歡回答我自己的問題,但我把它放在這裏供將來參考,我的同一問題的人。

爲什麼其他第三選項是錯誤

第三選項的問題是,在1000次迭代負載測試1000 的負載測試的ID的列表與第一ID,而不是運行1000次1000次,每個ID與每個ID。我使用某種nosql分析器來證明它。

如果我的Loadtest有1000次迭代並且我的csv列表有1000個ID,那麼將使用以下解決方案執行1000次測試,每個測試都有一個ID。如果碰巧你的LoadTest有更多的迭代,比如2000,那麼在LoadTest 1001中將會從csv列表的開始處重新開始。

我的解決方案

注:該解決方案使用CSV文件。它可以很容易地適應使用另一種不同的數據源爲XML,EXCEL,在SQL Server中的表,等

正確的選項來實現,這是創建與數據源屬性的測試。例如,您創建一個包含要在測試中使用的ID的csv文件。我的CSV文件的示例:

ID 
1003002-20121211120000 
1004071-20121211120000 

您需要添加一個的DataContext在你的測試:

private TestContext testContextInstance; 
public TestContext TestContext 
{ 
    get { return testContextInstance; } 
    set { testContextInstance = value; } 
} 

最後,您的測試應該是這樣的:

[TestMethod,DeploymentItem("DataOrigin\\list.csv"), DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|\\list.csv", "list#csv", DataAccessMethod.Sequential)] 
    public void TestScenario_1_DATADRIVEN() 
    { 
     // PREPARATION 
     string ID = TestContext.DataRow["ID"].ToString(); 
     string querystring = CreateQueryWithErrorDebug(ID); 

     // EXECUTION 
     string result = RunXCCQuery(querystring); 

     // ASSERTS 
     Assert.IsTrue(result.Length > 0); 
     Assert.IsTrue(result.Contains(ID)); 
    } 

DeploymentItem屬性複製csv文件。 DataSource屬性讀取它並遍歷它。

此行是測試從TestContext讀取的位置。在CSV文件

string ID = TestContext.DataRow["ID"].ToString(); 

具有n ID將導致測試運行n次,每一個ID。

我在調查中發現一些有用的鏈接:

+1

我認爲您的解決方案不是負載測試。採用這種方法,您的1000個測試將一個接一個地運行,而不是同時運行。我對嗎? – Schaliasos 2013-02-28 09:32:14

+0

**您是對的**,因爲我一個接一個地調用測試,所以這是一次性能測試。首先,我創建了一個單一測試,從nosql DB中檢索1個文檔,並使用LoadTesting數千次調用它。之後,爲了避免緩存命中,我必須做同樣的事情,但每次每次使用不同的ID時,文檔不會重複兩次。順便說一句,真正的數字不是1000,是150萬的請求:) – 2013-02-28 09:45:13

+0

[負載測試](http://en.wikipedia.org/wiki/Load_testing)的目的是虛擬(併發)用戶執行請求以你的系統。你的測試結果呢?您的系統不會通過發送另外一百五十萬個請求來加載。您的服務器將不得不處理一個請求。 – Schaliasos 2013-02-28 09:51:48

1

「泡沫排序」的解決方案是創建上千次的試驗,每一個都帶有一個 ID。不可行

完全同意。它不能做到。

下一個方法是創建一個測試,讀取XML,通過它迭代 並提出請求。這種方法的問題是,我將結束 進行一個大型測試,需要幾分鐘時間才能運行。

這種方法不是負載測試。一次只能有一個測試發送一個請求。

我認爲最好的方法是第三個有一些變化。我解決了類似的問題的辦法是:

  1. 創建一個類(比方說DataInput),將提供給我不同的數據爲每個測試。
  2. DataInput正在從scv文件讀取數據,並具有提供我想要的數據的靜態方法(例如getNextUserName)。
  3. [ClassIntialize]中,我創建了一個靜態的DataInput對象。
  4. [TestInitialize]中,我通過從DataInput獲取數據來創建對其餘服務的實際請求。

這樣所有的測試都有不同的數據。

+0

的第三方法好主意。我正在嘗試它和LoadTests正確執行所有測試,但收集結果似乎失敗。 (結果標籤看起來是空的) – 2013-02-25 13:45:06

+1

這是一個完全不同的錯誤。我想你錯過了'LoadTest'數據庫。檢查這[後](http://stackoverflow.com/questions/10391044/load-testing-in-vs2010-doesnt-seem-to-report-results/10401802#10401802)。 – Schaliasos 2013-02-25 14:22:53

+0

這正是我正在發生的事情......但我以前沒有DB沒有問題的工作。我將嘗試安裝一個分貝以防萬一... – 2013-02-25 14:25:15