青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

{C++ 基礎(chǔ)} {C++ 高級} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

vs2005 的單元測試

使用 Visual Studio 對公共方法進(jìn)行單元測試,跟以前 NUnit 一樣,都是引用需要的類,然后對公共方法進(jìn)行測試。

  但是 Visual Studio 還可以對類的私有方法進(jìn)行測試。而Visual Studio 不允許測試代碼跟實(shí)際代碼放在一個項(xiàng)目中,我們來看看是Visual Studio UnitTest如何做的。

  比如我們有這樣一個私有方法

?

namespace?ClassLibrary1{
 
public?class?DivisionClass{
  
private?int?Divide_private(int?numerator,?int?denominator){
   
return?numerator?/?denominator;
  }

 }

}

?

  我們只要在這個私有方法的右鍵菜單中選擇 創(chuàng)建單元測試,系統(tǒng)就自動產(chǎn)生了這個私有方法的單元測試代碼。

  下面我們來分析產(chǎn)生的單元測試代碼,看Visual Studio UnitTest 是如何對私有方法進(jìn)行單元測試的

  簡單來說,Visual Studio UnitTest 生成私有方法的單元測試時,將自動創(chuàng)建一個私有訪問器。私有訪問器是測試方法用于訪問私有代碼的方法。單元測試生成對私有訪問器的調(diào)用,然后通過私有訪問器來調(diào)用私有方法。私有訪問器駐留在測試項(xiàng)目中的文件中;因此將被編譯為測試項(xiàng)目程序集。

  具體來看測試項(xiàng)目:

  首先我們可以看到一個名為 VSCodeGenAccessors.cs 的新文件被創(chuàng)建,

  這個文件包含兩個類:

  internal 類型的 BaseAccessor 類 和 派生自它的 ClassLibrary1_DivisionClassAccessor 類

  BaseAccessor 類是通用的訪問器基類。

  ClassLibrary1_DivisionClassAccessor 類 則是對你要訪問類的私有方法進(jìn)行了反射封裝,這樣你就可以通過操作這個類來操作該私有方法了。如下面代碼:

using?Microsoft.VisualStudio.TestTools.UnitTesting;

namespace?TestProject1{
 [System.Diagnostics.DebuggerStepThrough()]
 [System.CodeDom.Compiler.GeneratedCodeAttribute(
"Microsoft.VisualStudio.TestTools.UnitTestGeneration",?"1.0.0.0")]
 
internal?class?BaseAccessor?{

  
protected?Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObject?m_privateObject;

  
protected?BaseAccessor(object?target,?Microsoft.VisualStudio.TestTools.UnitTesting.PrivateType?type)?{
   m_privateObject?
=?new?Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObject(target,?type);
  }


  
protected?BaseAccessor(Microsoft.VisualStudio.TestTools.UnitTesting.PrivateType?type)?:
  
this(null,?type)?{}

  
internal?virtual?object?Target?{
   
get?{
    
return?m_privateObject.Target;
   }

  }


  
public?override?string?ToString()?{
   
return?this.Target.ToString();
  }


  
public?override?bool?Equals(object?obj)?{
   
if?(typeof(BaseAccessor).IsInstanceOfType(obj))?{
    obj?
=?((BaseAccessor)(obj)).Target;
   }

   
return?this.Target.Equals(obj);
  }


  
public?override?int?GetHashCode()?{
   
return?this.Target.GetHashCode();
  }

 }


 [System.Diagnostics.DebuggerStepThrough()]
 [System.CodeDom.Compiler.GeneratedCodeAttribute(
"Microsoft.VisualStudio.TestTools.UnitTestGeneration",?"1.0.0.0")]
 
internal?class?ClassLibrary1_DivisionClassAccessor?:?BaseAccessor?{

 
protected?static?Microsoft.VisualStudio.TestTools.UnitTesting.PrivateType?m_privateType?=?new?Microsoft.VisualStudio.TestTools.UnitTesting.PrivateType(typeof(global::ClassLibrary1.DivisionClass));

 
internal?ClassLibrary1_DivisionClassAccessor(global::ClassLibrary1.DivisionClass?target)?:
 
base(target,?m_privateType)?{}

 
internal?int?Divide_private(int?numerator,?int?denominator)?{
  
object[]?args?=?new?object[]?{
   numerator,
   denominator}
;
  
int?ret?=?((int)(m_privateObject.Invoke("Divide_private",?new?System.Type[]?{
   
typeof(int),
   
typeof(int)}
,?args)));
   
return?ret;
  }
 
 }

}


  注意:當(dāng)您更改正在測試的代碼文件中的私有方法時,這個訪問器可能無法正常工作,需要重新生成專用訪問器(ClassLibrary1_DivisionClassAccessor 類)。

  整理一下就是:

  這個訪問器,是通過反射的方式實(shí)現(xiàn)的。

  VSUT利用自動代碼生成技術(shù),在單元測試項(xiàng)目中先來給你要測試的類生成一個名字叫XXXAccessor的訪問器。

  這個訪問器會把需要測試類的需要測試的私有方法暴露出來,這種方式,無論是私有還是公共的屬性和方法。這種方式可以很方便的給測試方法搭建測試環(huán)境,MOCK對象的注入也容易了。在測試調(diào)用的時候,就簡單的只有下面的代碼了:

[DeploymentItem("ClassLibrary1.dll")]
[TestMethod()]
public?void?Divide_privateTest()
{
 DivisionClass?target?
=?new?DivisionClass();
 TestProject1.ClassLibrary1_DivisionClassAccessor?accessor?
=?new? TestProject1.ClassLibrary1_DivisionClassAccessor(target);
 
int?numerator?=?4;
 
int?denominator?=?0;
 
int?expected?=?0;
 
int?actual;
 actual?
=?accessor.Divide_private(numerator,?denominator);
 Assert.AreEqual(expected,?actual,?
"ClassLibrary1.DivisionClass.Divide_private?未返回所需的值。");
 Assert.Inconclusive(
"驗(yàn)證此測試方法的正確性。");
}



Visual Studio 2005 新增的測試功能使我們的開發(fā)工作更為快捷,代碼質(zhì)量在一定程度上有所提高。想必大家對類的單元測試已經(jīng)比較熟悉,這里我們來看看它提供的另一項(xiàng)更為有趣的測試——用戶界面自動化測試。事實(shí)上這個測試的本質(zhì)仍是單元測試,單元測試的各種方法在用戶界面測試中仍然可用。

  我們以一個簡單的 Windows Form 應(yīng)用程序?yàn)槔ㄔ?Visual Studio 2005 Team System 下演示,其它版本亦可參考)。如圖所示,這是一個一元二次方程的求解程序。

  在 Visual Studio 2005 中加載這個程序的工程,切換到待測試窗體(Form1)的源代碼視圖。添加一個用戶界面測試最簡單的方法是在事件函數(shù)聲明代碼上右擊鼠標(biāo),在快捷菜單中點(diǎn)擊“Create Unit Tests”。在彈出的對話框中點(diǎn)選待測試的函數(shù)(特別是事件函數(shù)),確定。當(dāng)然,手工添加一個單元測試項(xiàng)目也是可以的,但通過快捷菜單自動生成的代碼中包含了一些測試輔助類和對象的聲明,使用起來更加方便。

  本例中,我們由 btnWorkOut_Click 創(chuàng)建單元測試,自動生成的代碼如下:

[DeploymentItem("XandY.exe")]
[TestMethod()]

public void btnWorkOut_ClickTest()
{
 Form1 target = new Form1();
 MyTestProject.XandY_Form1Accessor accessor = new MyTestProject.XandY_Form1Accessor(target);
 object sender = null; // TODO: Initialize to an appropriate value
 EventArgs e = null; // TODO: Initialize to an appropriate value
 accessor.btnWorkOut_Click(sender, e);
 Assert.Inconclusive("A method that does not return a value cannot be verified.");
}

  熟悉單元測試的朋友應(yīng)該明白 [TestMethod()] 屬性的含義。在這個測試函數(shù)中,target 是待測試窗體的一個實(shí)例。sender 和 e 是各個事件函數(shù)必備的參數(shù),一般情況下取 null 即可。最重要的是 accessor 對象,它是我們進(jìn)行用戶界面自動化測試的“總代理”。通過它可以訪問到待測試窗體的各個方法、屬性和控件,并可調(diào)用控件已聲明的各個事件。由此,我們可以用 accessor 模擬使用者通過鍵盤、鼠標(biāo)對用戶界面的各項(xiàng)操作,同時即時獲知程序中各個變量的狀態(tài)。有興趣的朋友可以讀讀 XandY_Form1Accessor 類的定義,了解這個“總代理”工作的奧秘。

  我們對測試代碼進(jìn)行以下修改,以便對程序運(yùn)行的正確性進(jìn)行測試。

[DeploymentItem("XandY.exe")]
[TestMethod()]

public void btnWorkOut_ClickTest()
{
 Form1 target = new Form1();
 MyTestProject.XandY_Form1Accessor accessor = new MyTestProject.XandY_Form1Accessor(target);
 object sender = null; // TODO: Initialize to an appropriate value
 EventArgs e = null; // TODO: Initialize to an appropriate value
 target.Show();
 target.Refresh();
 System.Threading.Thread.Sleep(1000);
 accessor.textBox1.Text = "2";
 accessor.textBox2.Text = "4";
 accessor.textBox3.Text = "2";
 target.Refresh();
 System.Threading.Thread.Sleep(1000);
 accessor.btnWorkOut_Click(sender, e);
 target.Refresh();
 Assert.IsTrue(accessor.d >= 0);
 Assert.IsNotNull(accessor.xx);
 Assert.IsNotNull(accessor.xy);
 Console.WriteLine("X1 = " + accessor.textBox4.Text);
 Console.WriteLine("X2 = " + accessor.textBox5.Text);
 System.Threading.Thread.Sleep(1000);
 target.Close();
}

  以上代碼中,我們通過 target.Show() 呈現(xiàn)窗體,通過 target.Refresh() 可以即時地刷新窗體內(nèi)容在屏幕的顯示,通過 System.Threading.Thread.Sleep(1000) 來延時。這幾段代碼都不是必需的,加入它們是為了便于程序反應(yīng)和測試者觀察,我們也完全可以在不顯示用戶界面的情況下更快地運(yùn)行自動測試。至于用 Assert 來監(jiān)控變量狀態(tài)和用 Console 做輸出,用過單元測試的朋友都應(yīng)該了解。

  此時,我們運(yùn)行這個測試,就會在屏幕上先后看到窗體被加載,三個文本框被填入數(shù)據(jù),計(jì)算結(jié)果出現(xiàn)在下面的文本框中,最后窗體被關(guān)閉。

  再來看看測試結(jié)果的輸出,符合我們的預(yù)期。

  Visual Studio 2005 的用戶界面自動化測試就是這么簡單。對于一般的測試,它使測試人員不必深究應(yīng)用程序底層的實(shí)現(xiàn)。當(dāng)然,對于本例這樣簡單的程序,我們用不著這么麻煩的測試,但是對于用戶界面更加復(fù)雜的程序,操作上存在更多的組合方式,手工測試的繁瑣程度以及查找問題的難度便大大上升了。使用 Visual Studio 2005 提供的自動化測試手段將在很大程度上減輕測試人員的負(fù)擔(dān)。有興趣的朋友甚至可以在這個基礎(chǔ)上進(jìn)行二次開發(fā),引入自動化測試腳本等專業(yè)測試方案,實(shí)現(xiàn)通用性更強(qiáng)的用戶界面自動化測試

posted on 2006-04-20 19:34 夢在天涯 閱讀(2872) 評論(3)  編輯 收藏 引用 所屬分類: C#/.NET

評論

# re: vs2005 的單元測試 2011-07-31 13:32 HANSONCorinne25

Different people in every country take the <a href="http://bestfinance-blog.com/topics/personal-loans">personal loans</a> from various creditors, just because this is easy.   回復(fù)  更多評論   

# re: vs2005 的單元測試 2011-08-07 06:33 already written essay

Different students in the world cognize that the essays writing service will supply us with the essay buy. Thus, it would be simple to order an essay.   回復(fù)  更多評論   

# re: vs2005 的單元測試 2012-09-20 11:37 CV templates

Have no clue how to generate remarkable CV yourself? Writing companies that function on the net will help you out with pleasure when you require to deal with professional resume writers perfect-resume.com.  回復(fù)  更多評論   

公告

EMail:itech001#126.com

導(dǎo)航

統(tǒng)計(jì)

  • 隨筆 - 461
  • 文章 - 4
  • 評論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1812973
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              国产精品―色哟哟| 中文日韩电影网站| 国内偷自视频区视频综合| 欧美色大人视频| 国产精品白丝jk黑袜喷水| 欧美日韩调教| 国产人妖伪娘一区91| 国产亚洲一区二区三区在线观看| 国产麻豆9l精品三级站| 国产婷婷97碰碰久久人人蜜臀| 国产亚洲成精品久久| 在线成人免费观看| 一区二区欧美视频| 久久免费国产精品| 亚洲欧洲偷拍精品| 亚洲精品少妇| 午夜精品福利在线| 亚洲国产日韩一级| 欧美一区二区三区的| 欧美日韩不卡| 亚洲精品亚洲人成人网| 欧美一区二区三区日韩视频| 久久一区二区三区av| 一区二区久久久久| 欧美激情一区二区三区蜜桃视频 | 久久精品夜夜夜夜久久| 欧美电影免费观看高清| 国产在线精品成人一区二区三区 | 亚洲第一精品夜夜躁人人爽| 亚洲午夜日本在线观看| 亚洲精选视频免费看| 美女视频黄免费的久久| 国产一区二区视频在线观看| 亚洲一区二区在线播放| 亚洲精品美女在线观看播放| 久久久久高清| 亚洲欧洲一区| 91久久久一线二线三线品牌| 美女精品视频一区| 亚洲日本理论电影| 亚洲最快最全在线视频| 国产精品欧美日韩一区| 亚洲欧美日韩精品在线| 亚洲欧美999| 欧美主播一区二区三区| 国产欧美一区二区精品忘忧草| 亚洲欧美日本视频在线观看| 亚洲一区二区在线播放| 一区二区三区中文在线观看| 欧美激情第五页| 欧美日韩ab片| 久久久久久久久久看片| 狼狼综合久久久久综合网| 亚洲视频在线看| 亚洲欧美国产精品桃花 | 亚洲一区视频在线| 亚洲七七久久综合桃花剧情介绍| 一区二区三区欧美日韩| 在线观看欧美日本| 亚洲视频免费在线观看| 亚洲国产一二三| 久久精品视频免费观看| 欧美自拍丝袜亚洲| 国产精品久99| 亚洲精品在线看| 亚洲视频播放| 欧美日本一区二区视频在线观看 | 亚洲免费观看在线视频| 欧美一区二区成人6969| 香蕉精品999视频一区二区| 欧美极品一区| 日韩亚洲欧美一区二区三区| 亚洲国产一成人久久精品| 久久亚洲私人国产精品va| 久久性天堂网| 亚洲黄色视屏| 欧美日韩精品系列| 亚洲素人在线| 狂野欧美激情性xxxx| 亚洲男人第一av网站| 亚洲天堂成人| 国产精品久久久久9999吃药| 亚洲永久字幕| 欧美xart系列在线观看| 亚洲精品中文字幕在线| 欧美激情一区二区三区在线视频| 日韩亚洲欧美综合| 久久精品国产精品| 99精品视频免费全部在线| 欧美视频免费在线| 猛男gaygay欧美视频| 亚洲精品偷拍| 欧美777四色影视在线| 在线视频精品| 亚洲精品一区在线| 国产婷婷精品| 国产精品观看| 欧美成人一区二区在线| 午夜一级在线看亚洲| 亚洲精品一区中文| 鲁鲁狠狠狠7777一区二区| 国产精品99久久不卡二区| 亚洲黄色在线观看| 黄色成人av| 狠狠色综合一区二区| 国产麻豆午夜三级精品| 欧美视频在线视频| 欧美日韩亚洲一区二区三区| 美女久久网站| 欧美极品一区| 欧美日韩在线视频首页| 欧美日韩国产系列| 欧美日韩日本网| 欧美三级第一页| 国产精品狼人久久影院观看方式| 欧美美女日韩| 国产精品户外野外| 韩日精品视频| 亚洲理论在线| 国产精品丝袜xxxxxxx| 亚洲国产专区校园欧美| 国产精品高清一区二区三区| 欧美fxxxxxx另类| 国产日韩在线视频| 亚洲一区日韩在线| 亚洲在线视频| 欧美日韩另类综合| 亚洲国产免费看| 亚洲国产精品一区二区第一页 | 欧美成年人在线观看| 国产一区二区三区高清| 亚洲综合不卡| 午夜精品一区二区三区在线| 欧美日韩精品| 夜夜嗨av一区二区三区| 日韩亚洲精品视频| 欧美激情第五页| 亚洲精品一二三| 在线亚洲美日韩| 欧美色欧美亚洲另类二区| 亚洲欧洲日韩在线| 一区二区三区免费看| 欧美日韩精品久久| 99综合精品| 欧美一级视频免费在线观看| 国产精品最新自拍| 欧美在线免费看| 欧美不卡视频一区| 亚洲国产日韩欧美在线图片| 欧美ed2k| 一本不卡影院| 欧美在线影院在线视频| 国产一区欧美日韩| 欧美11—12娇小xxxx| 亚洲区第一页| 亚洲视频久久| 国模精品一区二区三区| 六十路精品视频| 99国产精品视频免费观看| 香蕉av777xxx色综合一区| 精品999网站| 欧美日韩美女在线| 欧美在线视频日韩| 亚洲人体大胆视频| 欧美影院成人| 亚洲欧洲精品一区二区三区不卡| 欧美区在线观看| 欧美一区二视频| 亚洲黄色小视频| 久久黄色网页| 亚洲伦理一区| 国产农村妇女毛片精品久久莱园子 | 欧美日韩一区二区三区高清| 亚洲欧美日韩一区二区在线| 麻豆久久精品| 亚洲与欧洲av电影| 精品不卡视频| 国产精品久久久久久久7电影| 久久久久久伊人| 中文av一区二区| 欧美成人69| 欧美一区日本一区韩国一区| 亚洲人成小说网站色在线| 欧美自拍偷拍| 亚洲精品视频在线观看网站 | 午夜精品久久久久久99热| 在线观看视频一区二区欧美日韩| 欧美日韩国产一区二区三区| 久久久国产成人精品| 9i看片成人免费高清| 欧美成年人视频网站| 欧美在线视频免费| 亚洲无限乱码一二三四麻| ●精品国产综合乱码久久久久| 欧美午夜精品久久久久久久| 免费观看日韩av| 久久久精品tv| 欧美在线观看天堂一区二区三区| 亚洲美女黄网| 亚洲第一天堂av|