<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      自己動(dòng)手寫壓力測試-三劍客HttpClient+Async+Parallel

      曾經(jīng)滄海難為水

      信息如水 壓力如潮

      功能實(shí)現(xiàn)階段,我們對得要處理的信息分析得很細(xì)致,很透徹,所謂細(xì)如絲,透如水。然而,到了產(chǎn)品的階段,要處理的信息卻如同潮洪而至,原本的假設(shè)預(yù)想,通通被擊成了碎片。這時(shí)候產(chǎn)生的錯(cuò)誤和問題,很難在開發(fā)機(jī)上重現(xiàn)。

      如果說用戶驗(yàn)收測試是對功能實(shí)現(xiàn)的檢查,需要滴水不漏;壓力測試則是容量的考驗(yàn),迎接浪的洗禮。

      (本文版權(quán)屬于? 2012 - 2013 予沁安

      環(huán)肥燕瘦

      壓力測試的工具頗多,尤其是HP的LoadRunner甚至成為了行業(yè)標(biāo)準(zhǔn)。可是,在研究和考察的過程中,心里卻慢慢有了質(zhì)疑,我是否非得用這些工具嗎? 一則,它們是商業(yè)軟件,價(jià)格不菲;二則,還是因?yàn)槭巧虡I(yè)軟件,功能太多,太龐大,很多東西我都不需要。為什么不自己做一個(gè)簡單實(shí)用的呢?

      在小趙研究Selenium時(shí),我覺得用他用的語法很貼近業(yè)務(wù)語言,于是我提出一個(gè)問題,可以用于壓力測試嗎?他說不行,因?yàn)镾elenium是要完全啟動(dòng)瀏覽器。平時(shí),看起來瘦小的瀏覽器,其實(shí)很耗資源,特別是與壓力測試的容量來比,瀏覽器是個(gè)不折不扣的大胖子。你可以試一下,在你的機(jī)器上同時(shí)開啟100個(gè)瀏覽窗口,會(huì)是個(gè)什么狀況。

      苗條美人 HttpClient

      否定了Selenium之后,很快就找到了我的目標(biāo)HttpClient (其實(shí)還有個(gè)前生WebClient,后面有敘)。從名稱,我們就可以知道,它已經(jīng)定位到很低Http層,這一層是效率與易用的一個(gè)最佳平衡點(diǎn)。但是,它是.Net 4.5下的部件,在.Net 4.0必須用NuGet來下載。

      查看了很多資料以后,我可以確信,HttpClient正是我想要的。她還有一個(gè)很大的特色,完全只提供異步接口。這實(shí)際上是另一種大瘦身,耗用資源上的瘦身,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()有把異步轉(zhuǎn)化為了同步

      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 這,是一個(gè)問題

      .Net 4,5 出來之后,一直沒有對它的新功能和特性太在意。只是公司升級使用VS2012,除了灰不溜秋的界面,而所謂的性能提高(其實(shí),是VS2010太次)之外,也沒有特別感覺。

      然而,這次在查看HttpClient資料時(shí),卻意外發(fā)現(xiàn)了.Net 4.5 語法級別的一個(gè)亮點(diǎn): Asyn和Await。這讓異步編程更簡便,更漂亮。看來,今后異步編程是一個(gè)大潮流,微軟也不惜余力。

      新語法應(yīng)用之后的效果,似乎和平時(shí)的同步編碼沒有太大區(qū)別,除了不時(shí)冒出來的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構(gòu)建的的Web服務(wù)比Apache快很多(http://zgadzaj.com/benchmarking-nodejs-basic-performance-tests-against-apache-php)就是得益于Javascript天生的函數(shù)回調(diào)方式支持的異步運(yùn)行。現(xiàn)在有.Net對Async的友好支持,以及大量組件基于異步方式的重寫。據(jù)說,微軟推薦,凡是運(yùn)行時(shí)間超過20毫秒的功能,就要用異步方式來寫。HttpClient就是一個(gè)例子,它的前身WebClient就不具異步調(diào)用,而HttpClient干脆就不提供同步接口。

      平行宇宙 Parallel

      其實(shí),無論是的Async還是Parallel,都是語法糖,可是作為辛苦的開發(fā)者,我們好的就是這一口。

      Async讓我們發(fā)出網(wǎng)絡(luò)請不必再等待,Parallel讓我們很容易的持續(xù)發(fā)出平行請求,這就是一個(gè)完全的壓力測試模型了。我這里簡單設(shè)置了一個(gè)100 * 10 個(gè)請求。沒有具體計(jì)算,共發(fā)出多少個(gè)請求,我只知道,多得已經(jīng)足夠讓我的系統(tǒng)重現(xiàn)產(chǎn)品機(jī)上的問題了。

       Parallel.For(1, 1000, i =>
      	Parallel.For(1, 5, case_number =>
      	   LoginScenario(case_number)
      		   .run_by(runner)
      	));

      :我的業(yè)務(wù)語法糖DSL

      這里是我對系統(tǒng)頁面操作的定義代碼,用語法糖DSL的方式實(shí)現(xiàn),一定程度上實(shí)現(xiàn)了需求即代碼即文檔的要求吧。這部分代碼不能直接運(yùn)行,因?yàn)樗褂昧宋易约旱腤eb框架,從而可以用強(qiáng)類型自動(dòng)生成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>());
      }


      (本文版權(quán)屬于? 2012 - 2013 予沁安 | 轉(zhuǎn)載請注明作者和出處

      posted @ 2013-05-04 13:04  予沁安  閱讀(4662)  評論(13)    收藏  舉報(bào)
      主站蜘蛛池模板: 亚洲 欧洲 自拍 偷拍 首页| 亚洲蜜臀av乱码久久| 亚洲小说乱欧美另类| 99久re热视频这里只有精品6| 99久热在线精品视频| 亚洲另类丝袜综合网| 久久人人97超碰精品| 同性男男黄gay片免费| 日本高清不卡一区二区三| 噜妇插内射精品| 亚洲av中文一区二区| 国产精品久久久国产盗摄| 亚洲av综合色一区二区| 日本视频一区二区三区1| 亚洲国产成人综合自在线| 超碰人人超碰人人| 色欲AV无码一区二区人妻| 亚洲国产精品久久久久秋霞| 好男人视频免费| 在线看无码的免费网站| 激情啪啪啪一区二区三区| 六十路熟妇乱子伦| 精品粉嫩国产一区二区三区| 国产在线精品一区二区夜色| 亚洲无码精品视频| 亚洲综合色丁香婷婷六月图片| 国产成人综合亚洲第一区| 中文 在线 日韩 亚洲 欧美| 康定县| 成人午夜在线观看日韩| 国产一区二区日韩经典| 仁化县| 久久精品av国产一区二区 | 美乳丰满人妻无码视频| 蜜臀av久久国产午夜| 亚洲欧美日韩高清一区二区三区| 无码小电影在线观看网站免费| 热久久美女精品天天吊色| 自拍亚洲一区欧美另类| 国产粉嫩美女一区二区三| 天堂mv在线mv免费mv香蕉|