自己动手写压力测试

简介:
信息如水 压力如潮
  功能实现阶段,我们对得要处理的信息分析得很细致,很透彻,所谓细如丝,透如水。然而,到了产品的阶段,要处理的信息却如同潮洪而至,原本的假设预想,通通被击成了碎片。这时候产生的错误和问题,很难在开发机上重现。
  如果说用户验收 测试是对功能实现的检查,需要滴水不漏; 压力测试则是容量的考验,迎接浪的洗礼。
   环肥燕瘦
  压力测试的工具颇多,尤其是HP的 LoadRunner甚至成为了行业标准。可是,在研究和考察的过程中,心里却慢慢有了质疑,我是否非得用这些工具吗? 一则,它们是商业软件,价格不菲;二则,还是因为是商业软件,功能太多,太庞大,很多东西我都不需要。为什么不自己做一个简单实用的呢?
  在小赵研究 Selenium时,我觉得用他用的语法很贴近业务语言,于是我提出一个问题,可以用于压力测试吗?他说不行,因为Selenium是要完全启动浏览器。平时,看起来瘦小的浏览器,其实很耗资源,特别是与压力测试的容量来比,浏览器是个不折不扣的大胖子。你可以试一下,在你的机器上同时开启100个浏览窗口,会是个什么状况。
   苗条美人 HttpClient
  否定了Selenium之后,很快就找到了我的目标HttpClient (其实还有个前生WebClient,后面有叙)。从名称,我们就可以知道,它已经定位到很低Http层,这一层是效率与易用的一个最佳平衡点。但是,它是.Net 4.5下的部件,在.Net 4.0必须用NuGet来下载。
  查看了很多资料以后,我可以确信,HttpClient正是我想要的。她还有一个很大的特色,完全只提供异步接口。这实际上是另一种大瘦身,耗用资源上的瘦身,HttpClient正式我要的窈窕淑女。
   前生:WebClient
var values = new NameValueCollection();
foreach (var key_value in ui.FormData)
{
values.Add(key_value.Key, key_value.Value);
}
var client = new WebClient();
client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
Console.WriteLine(string.Concat(base_site + ui.Path, ui.Method.ToString().ToLower(), values));
byte[] result = client.UploadValues(base_site + ui.Path, ui.Method.ToString().ToLower(), values);
string ResultAuthTicket = Encoding.UTF8.GetString(result);
Console.WriteLine(client.BaseAddress);
Console.WriteLine(client.ResponseHeaders.ToString());
Console.WriteLine(ResultAuthTicket);
   HttpClient的Async方法,注意最后的Wait()有把异步转化为了同步
var form_data=new Dictionary<string, string>();
form_data.Add("system_account","test1@skight.com");
form_data.Add("system_password","123456");
var values = new NameValueCollection();
foreach (var key_value in form_data)
{
values.Add(key_value.Key, key_value.Value);
}
var client = new HttpClient();
client.GetStringAsync("http://esr20syst.skight.com/District/03/UserLogin.do")
.ContinueWith(
t =>
{
Console.WriteLine("Time {0}", DateTime.Now);
Console.WriteLine(t.Result);
})
.Wait();


 Sync 还是Async 这,是一个问题
  .Net 4,5 出来之后,一直没有对它的新功能和特性太在意。只是公司升级使用VS2012,除了灰不溜秋的界面,而所谓的性能提高(其实,是VS2010太次)之外,也没有特别感觉。
  然而,这次在查看HttpClient资料时,却意外发现了.Net 4.5 语法级别的一个亮点: Asyn和Await。这让异步编程更简便,更漂亮。看来,今后异步编程是一个大潮流,微软也不惜余力。
  新语法应用之后的效果,似乎和平时的同步编码没有太大区别,除了不时冒出来的Await和Async
var form_data=new Dictionary<string, string>();
form_data.Add("system_account","test1@skight.com");
form_data.Add("system_password","123456");
foreach (var key_value in form_data)
{
values.Add(key_value.Key, key_value.Value);
}
var httpClient = new HttpClient();
var content= await httpClient.GetStringAsync("http://esr20syst.skight.com/District/03/UserLogin.do");
Console.WriteLine(t.Result);
  异步性能的福利是不可随小觑的。之前,有Node.js构建的的Web服务比Apache快很多(http://zgadzaj.com/benchmarking-nodejs-basic-performance-tests-against-apache-php)就是得益于Javascript天生的函数回调方式支持的异步运行。现在有.Net对Async的友好支持,以及大量组件基于异步方式的重写。据说,微软推荐,凡是运行时间超过20毫秒的功能,就要用异步方式来写。HttpClient就是一个例子,它的前身WebClient就不具异步调用,而HttpClient干脆就不提供同步接口。
   平行宇宙 Parallel
  其实,无论是的Async还是Parallel,都是语法糖,可是作为辛苦的开发者,我们好的就是这一口。
  Async让我们发出网络请不必再等待,Parallel让我们很容易的持续发出平行请求,这就是一个完全的压力测试模型了。我这里简单设置了一个100 * 10 个请求。没有具体计算,共发出多少个请求,我只知道,多得已经足够让我的系统重现产品机上的问题了。
Parallel.For(1, 1000, i =>
Parallel.For(1, 5, case_number =>
LoginScenario(case_number)
.run_by(runner)
));
   附:我的业务语法糖DSL
  这里是我对系统页面操作的定义代码,用语法糖DSL的方式实现,一定程度上实现了需求即代码即文档的要求吧。这部分代码不能直接运行,因为它使用了我自己的Web框架,从而可以用强类型自动生成URL。这里提供出来只是作参考,作为示例的一部分。
private static Scenario LoginScenario(int case_number)
{
return
UI.context(Keys.Context.District.with_value(DistrictIdentifier.of("03")))
.to<UserLoginGet>()
.then(
UI.input(SystemPayloadKeys.Account.with_value(string.Format("test{0}@skight.com", case_number)))
.and_input(SystemPayloadKeys.Password.with_value("123456"))
.to<UserLoginPost>());
}

最新内容请见作者的GitHub页:http://qaseven.github.io/

相关文章
|
7月前
|
监控 关系型数据库 MySQL
学会这些性能测试干货知识点,才好拿捏性能测试
学会这些性能测试干货知识点,才好拿捏性能测试
|
11月前
|
测试技术
性能测试理论知识
软件性能 :软件的一种非功能特性,它关注的不是软件是否能完成特定功能,而是在完成功能时展现的及时性。性能测试 :通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试
|
SQL 算法 测试技术
性能测试之理论知识
性能测试之理论知识
|
消息中间件 缓存 运维
性能测试技术笔记(一):如何快速上手压测工作
如果是专职做性能测试,或者刚介入一个全新的系统进行压测,想要短时间内了解业务细节是几乎不可能的。
性能测试技术笔记(一):如何快速上手压测工作
|
负载均衡 网络协议 Unix
压力测试笔记
9万链接 纯swoole server simple demo 资源耗费: CPU一直稳定 50%以下 内存2.8G(本机也有压测客户端 所以可能纯server在2G左右)
157 0
|
测试技术
locust性能测试,自动化测试工程师装X神器
locust性能测试,自动化测试工程师装X神器
72 0
locust性能测试,自动化测试工程师装X神器
|
测试技术
视频一对一源码,正确认识压力测试和性能测试
视频一对一源码,正确认识压力测试和性能测试
|
缓存 监控 算法
【性能系列连载一】开篇:性能测试不可不知的“干货”
【性能系列连载一】开篇:性能测试不可不知的“干货”
139 0
|
缓存 运维 监控
【面试-性能测试工程师】如何在项目中练手性能测试,莫慌
大家好,我是温大大。 今天给大家带来了另一个读者故事,A君故事 ———— 点工逆袭成为性能专项测试工程师的故事。 ## 「现状」 A君毕业于某专科,毕业后做过运维、做过销售, 目前在武汉一家电商公司从事功能测试,也是待了最久的一家待了3年了。 目前他所在测试团队由10到增长到30多人, 他自己虽然学到了一些测试经验,但他自己感觉所处在团队的中低层,升职加薪无望了, 最可怕的是毕业6年了目前薪水也只维持在12K左右, 但总感觉自己没有一技之长,他想跳出点工的圈子(功能测试),想要搞一搞性能专项测试, 自己也网上找了一些教学视频,但总感觉学不透也上不了手,所以他找到我,希望我能给他一
【面试-性能测试工程师】如何在项目中练手性能测试,莫慌