【散300分】一个简单的压力测试引擎代码
我在这里还是简单描述一个压力测试引擎代码(而不是全部具体实现),同时用来演示 Parallel Extensions to the .NET Framework 这个东东的作用。
所谓压力测试,表面上看不过是运行一个或者几个测试用例一定次数(例如100次、1000次、5000次),然后统计不同压力下平均响应时间,并从时间变化的曲线拐点上来分析。
假设测试用例的原型定义是这样:
private class TestCaseType
{
public TestCaseDelegate proc; //测试程序
public string desc; //测试程序的标题(摘要说明)
}
private delegate void TestCaseDelegate();
private static IEnumerable<TestCaseType> GetTestCases(this Assembly[] assembly)
{
。。。。
}
private static void StressTest(this Assembly[] assembly, int 次数)
{
var tps = GetTestCases(assembly);
if (tps.Count() == 0)
{
System.Console.WriteLine("******** 没有测试用例 ********");
return;
}
var map = tps.AsParallel().SelectMany(tp => Clone(tp, 次数)).Select(tp => Test(tp));
var reduce = from t in map
group t by t.proc into g
orderby g.Average(p => p.mi) descending
select new { proc = g.Key, desc = g.First().desc, mi = (long)g.Average(p => p.mi) };
int testCnd = 0;
reduce.ForEach(r => { System.Console.WriteLine("{0} 平均{1}毫秒\t{2}", ++testCnd, r.mi, r.desc.Description); });
}
//将测试用例重复多次
private static IEnumerable<TestCaseType> Clone(TestCaseType t, int 倍数)
{
var c = new List<TestCaseType>();
for (var i = 0; i < 倍数; i++)
c.Add(new TestCaseType { desc = t.desc, proc = t.proc });
return c;
}
//单独执行一个测试用例并记录耗时。如果可能,Test应该在一个Master机辅助下分布到不同的Worker机上执行。
private static TestCaseTestType Test(TestCaseType p)
{
var wt = new Stopwatch();
wt.Start();
p.proc();
wt.Stop();
return new TestCaseTestType { proc = p.proc, desc = p.desc, mi = wt.ElapsedMilliseconds };
}
static public void ForEach<T>(this IEnumerable<T> array, Action<T> proc)
{
foreach (T obj in array)
proc(obj);
}


[解决办法]
mARK
[解决办法]
没怎么看懂这个引擎,原理是什么呢? 1234大侠能多给点注释吗
[解决办法]
[解决办法]
谢谢,学习了
[解决办法]
学习
[解决办法]
Linq 的性能似乎不是很好。
[解决办法]
好东西!谢谢分享,收藏!
[解决办法]
学习了,感谢LZ
[解决办法]
哈哈,学习
[解决办法]
uppppppppp