【散300分】一个简单的压力测试引擎代码

以专业开发人员为伍 2009-09-16 10:59:32
我在这里还是简单描述一个压力测试引擎代码(而不是全部具体实现),同时用来演示 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)
{
。。。。
}

这个方法对于输入的一组 Asembly,可以遍历所有 class,反射其所有 Method,找出标记(Attribute)为测试用例的那些方法,并且返回为一组 TestCaseType。(这个过程与本文主旨无关,我省略了)

于是我要演示的压力测试的引擎代码就是:
        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);
}


这里如果不写 AsParallel() 就是普通的顺序执行测试,而写上就可以利用多核多进程的能力并行执行了。

这个算法的过程是:找到相关的测试用例,然后重复执行的次数,并行执行,然后统计出每一个测试用例的平均执行时间,最后按照执行时间从高到低的顺序打印出来。

如果你的计算机有多核,或者如果Test方法分布到其它计算集群执行主机上,就可以大大提高性能。
...全文
1265 123 打赏 收藏 转发到动态 举报
写回复
用AI写文章
123 条回复
切换为时间正序
请发表友善的回复…
发表回复
bs897945043 2012-03-22
  • 打赏
  • 举报
回复
好贴,学习了
特别 2010-06-14
  • 打赏
  • 举报
回复
虽然楼主已经结贴了,我还是要膜拜一下
Mirana_NightShade 2009-11-29
  • 打赏
  • 举报
回复
jf
ngzhy2160 2009-11-26
  • 打赏
  • 举报
回复
学习了,路过
sxxdll 2009-11-24
  • 打赏
  • 举报
回复
学习了
wangfeizjk 2009-11-17
  • 打赏
  • 举报
回复
学习一下,还没有自己写过呢
kevinhu520 2009-11-17
  • 打赏
  • 举报
回复
学习
zqtoo 2009-11-16
  • 打赏
  • 举报
回复
ding
zqtoo 2009-11-16
  • 打赏
  • 举报
回复
学习
风骑士之怒 2009-11-15
  • 打赏
  • 举报
回复
一如既往的支持sp1234,也喜欢LINQ (LINQ TO SQL前途虽迷茫)
sensexia 2009-11-15
  • 打赏
  • 举报
回复
学习了
machao299 2009-11-13
  • 打赏
  • 举报
回复
猛 , 学习了 。
jianshao810 2009-11-13
  • 打赏
  • 举报
回复
lenovor400 2009-11-11
  • 打赏
  • 举报
回复
学习,楼主有没有博客什么的,以后要多向楼主学习了,呵
mailbao 2009-11-10
  • 打赏
  • 举报
回复
LinQ原來用途這麼廣的啊...
l171147904 2009-11-05
  • 打赏
  • 举报
回复
学习 ,,看不懂。。。。嘎嘎噶!!!

LING,,,从 字符,对象中过滤 想得到东西。。。

但真谛不懂,,也很少用!
LZ 给个文章 分析 分析,,,
都在什么情况下 用LING 好1!!
xiaohuangdi23 2009-11-05
  • 打赏
  • 举报
回复
来晚了,学习了!
wo2xie 2009-11-04
  • 打赏
  • 举报
回复
学习
dxw075 2009-11-02
  • 打赏
  • 举报
回复
学习。。。谢谢LZ分享
jianshao810 2009-10-29
  • 打赏
  • 举报
回复
加载更多回复(97)

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧