您對localhost的虛擬請求的解決方案與我所知的一樣好。但是這裏有一個替代方案。
兩個部分:
(1)一個負載測試插件負載測試開始時間複製到Web測試上下文:
[DisplayName("Load Test Start Time")]
[Description("Record the load test start time in the context of new web test iterations")]
public class LoadTestStartTime : ILoadTestPlugin
{
public const string LoadTestStartTimeContextParameterName = "$LoadTestStartTime";
public void Initialize(LoadTest loadTest)
{
DateTime startTime = DateTime.Now;
// Copy the load test start time into the context of each new test
loadTest.TestStarting += (sender, e) =>
{
e.TestContextProperties[LoadTestStartTimeContextParameterName] = startTime;
};
}
}
(2)一個網絡測試插件,獲取其延遲時間從中可以得到一個靜態值或上下文參數,並可以HH屬性:MM:SS.SSS或整數毫秒:
[DisplayName("Delay WebTest")]
[Description("Delay the start of this WebTest by a certain amount of time.")]
public class DelayWebTest : WebTestPlugin
{
[Description("Time to delay this WebTest, in HH:MM:SS.SSS time format or in ms (e.g. 00:01:23.456 or 83456 for 1m 23.456s delay)")]
public string Delay { get; set; }
public override void PreWebTest(object sender, PreWebTestEventArgs e)
{
DateTime start;
// Make sure this works when not in a load test
if (!e.WebTest.Context.ContainsKey("$LoadTestUserContext"))
start = DateTime.Now;
else
start = (DateTime)(e.WebTest.Context[LoadTestStartTime.LoadTestStartTimeContextParameterName]);
TimeSpan elapsed = DateTime.Now - start;
TimeSpan delay;
// Support {{context parameter}} substitutions
if (Delay.StartsWith("{{") && Delay.EndsWith("}}"))
{
string key = Delay.Substring(2, Delay.Length - 4);
object value = e.WebTest.Context[key];
if (value is TimeSpan) delay = (TimeSpan)value;
else if (value is int) delay = new TimeSpan(0, 0, 0, 0, (int)value);
else if (value is string) delay = ParseDelayFromString(value as string);
else throw new ArgumentException("Delay value must be TimeSpan, int or string. Found: " + value.GetType());
}
else delay = ParseDelayFromString(Delay);
TimeSpan sleep = delay - elapsed;
if (sleep > new TimeSpan(0))
{
e.WebTest.AddCommentToResult("Current time: " + DateTime.Now);
e.WebTest.AddCommentToResult("About to sleep for " + sleep);
System.Threading.Thread.Sleep(sleep);
e.WebTest.AddCommentToResult("Current time: " + DateTime.Now);
}
}
public static TimeSpan ParseDelayFromString(string s)
{
TimeSpan ts;
if (TimeSpan.TryParse(s, out ts)) return ts;
int i;
if (int.TryParse(s, out i)) return new TimeSpan(0, 0, 0, 0, (int)i);
throw new FormatException("Could not parse value as TimeSpan or int: " + s);
}
}
這似乎爲我工作。
但是它使用Thread.Sleep,「...不推薦用於 Web測試是因爲它是一個阻塞API,並且多個Web測試可以共享一個線程,因此它可能會對多個vuser產生不利影響。 「 (See Visual Studio Performance Testing Quick Reference Guide)第187頁。
因此,對於單用戶負載測試以及對於虛擬用戶數量不超過線程的小負載,這肯定是可以的,但很可能會導致更大負載的結果。
(*我並不知道線程模型的工作原理不過)
這個答案的主要部分是'了Thread.Sleep(...)'調用,它曾是我的第一件事情。正如你在答案中所說的那樣,它阻止了整個線程,因此只能爲極少數的虛擬用戶工作。請在VSPTQRG中提供頁碼。 – AdrianHHH