信息如水 压力如潮
功能实现阶段,我们对得要处理的信息分析得很细致,很透彻,所谓细如丝,透如水。然而,到了产品的阶段,要处理的信息却如同潮洪而至,原本的假设预想,通通被击成了碎片。这时候产生的错误和问题,很难在开发机上重现。
环肥燕瘦
压力测试的工具颇多,尤其是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(); |