我已使用Visual Studio 2015錄製負載測試使用的WebPerformance測試。在初始錄製之後,我可以運行20個同時使用的用戶,CPU使用率只有25%左右。不過該網站我測試上使用JSON,所以讓測試我添加對JSON的自定義抽取規則更逼真:Visual Studio使用Json上下文參數加載CPU使用率溢出
[DisplayName("JSON Extraction Rule")]
[Description("Extracts the specified JSON value from an object.")]
public class JsonExtractionRule : ExtractionRule
{
[DisplayName("Name/path of attribute")]
[Description("String to fetch the attribute from the Json Object.")]
public string Name { get; set; }
[DisplayName("Fetch 4 first characters only")]
[Description("Set to true if only the first 4 characters of the attribute should be fetched.")]
public Boolean fourFirstCharacters { get; set; }
public override void Extract(object sender, ExtractionEventArgs e)
{
if (e.Response.BodyString != null)
{
var json = e.Response.BodyString;
if (json.StartsWith("["))
{
json = "{\"array\":" + json + "}";
}
var data = JObject.Parse(json);
if (data != null)
{
var attribute = data.SelectToken(Name).ToString();
if (fourFirstCharacters)
{
e.WebTest.Context.Add(this.ContextParameterName, attribute.Substring(0, 4));
} else
{
e.WebTest.Context.Add(this.ContextParameterName, attribute);
}
e.Success = true;
return;
}
}
e.Success = false;
e.Message = String.Format(CultureInfo.CurrentCulture, "Not Found: {0}", Name);
}
}
我用這個提取的Json幾個從響應屬性,並將它們加入到後續請求使用上下文參數。
在添加了幾個提取類似並將某些上下文參數傳遞給請求後,我的負載測試只有5個simultanious用戶達到100%的CPU使用率。
上述提取規則在Web性能測試中使用大約20次,在任何單個響應中使用大約0-5次。 Json的回覆和請求大約有2k個字符。最大的提取包含大約500個字符。
我可以理解,如果響應時間增加或類似的東西,作爲一個更現實的Json被傳遞的結果。但我不明白爲什麼CPU使用率高漲?請求的響應時間是否會影響負載測試的CPU使用率?
提取+上下文參數在請求中實現Json的方式不好(在CPU使用情況下)嗎?有沒有更聰明的方法可以節省CPU使用量?
對於20個用戶來說,25%對我來說似乎非常高,除非你的計算機效率低於微軟的建議。也許測試的其他部分需要工作。思考時間如何確定和使用?您可以通過添加一個負載測試圖來獲得一些價值,該圖顯示來自'Overall' =>'Test'計數器的各種'%time in ...'值。 – AdrianHHH
我在每次請求之間使用1秒的靜態思考時間。在「代碼」,「規則」和「LoadTestPlugin」中添加%Time的圖表顯示在規則中花費了近100%的時間。 – EJS
重讀這個問題。每個響應會調用'JObject.Parse'(加上前面的if ...連接3個字符串)幾次。這些操作對我來說顯得非常耗時。也許更改爲一個'ExtractJson'提取規則的調用,將提取的'data'保存爲上下文參數。 (上下文參數的值可以是任何類型。)然後多次調用一個插件來傳遞'name'和'fourFirstCharacters'的各種值作爲屬性。 – AdrianHHH