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