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

C++ Programmer's Cookbook

{C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

vs2005 的單元測試

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

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

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

?

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

 }

}

?

  我們只要在這個私有方法的右鍵菜單中選擇 創建單元測試,系統就自動產生了這個私有方法的單元測試代碼。

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

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

  具體來看測試項目:

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

  這個文件包含兩個類:

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

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

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

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;
  }
 
 }

}


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

  整理一下就是:

  這個訪問器,是通過反射的方式實現的。

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

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

[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(
"驗證此測試方法的正確性。");
}



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

  我們以一個簡單的 Windows Form 應用程序為例(在 Visual Studio 2005 Team System 下演示,其它版本亦可參考)。如圖所示,這是一個一元二次方程的求解程序。

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

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

[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.");
}

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

  我們對測試代碼進行以下修改,以便對程序運行的正確性進行測試。

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

  此時,我們運行這個測試,就會在屏幕上先后看到窗體被加載,三個文本框被填入數據,計算結果出現在下面的文本框中,最后窗體被關閉。

  再來看看測試結果的輸出,符合我們的預期。

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

posted on 2006-04-20 19:34 夢在天涯 閱讀(2882) 評論(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.   回復  更多評論   

# 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.   回復  更多評論   

# 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.  回復  更多評論   

公告

EMail:itech001#126.com

導航

統計

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

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1816192
  • 排名 - 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>
              欧美一区二区视频97| 国产综合色产| 久久最新视频| 欧美日韩综合精品| 欧美成人一区二区在线| 国产欧美日韩激情| 一本色道久久加勒比精品| 原创国产精品91| 午夜在线电影亚洲一区| 亚洲视频一区二区| 欧美好吊妞视频| 欧美黄色免费| 一区二区在线观看av| 亚洲欧美另类国产| 亚洲免费在线播放| 欧美视频免费看| 亚洲精品美女久久久久| 亚洲人成小说网站色在线| 久久久激情视频| 久久久www成人免费精品| 国产精品影音先锋| 亚洲激情第一区| 亚洲精品视频在线观看网站 | 一本久久a久久精品亚洲| 亚洲激情黄色| 欧美不卡视频| 亚洲日本中文字幕免费在线不卡| 亚洲国产精品一区二区www| 理论片一区二区在线| 欧美1区2区3区| 亚洲激情视频在线观看| 欧美sm视频| 亚洲精选中文字幕| 亚洲一级免费视频| 国产精品日韩专区| 欧美在线播放| 欧美暴力喷水在线| 日韩一区二区免费高清| 欧美日韩亚洲视频| 亚洲一区二区免费视频| 欧美一区二区三区视频免费| 国产亚洲精品bv在线观看| 久久久精品午夜少妇| 欧美国产精品va在线观看| 99国产欧美久久久精品| 欧美视频亚洲视频| 亚洲欧洲av一区二区| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲电影毛片| 欧美三级电影一区| 校园春色国产精品| 欧美成人精品在线观看| 一区二区三区日韩| 国产欧美日韩综合一区在线播放| 久久久精品国产一区二区三区| 欧美大片在线影院| 亚洲一区国产视频| 国产日韩欧美在线播放| 久久躁狠狠躁夜夜爽| 99国内精品| 久久久人人人| 亚洲一区二区黄色| 亚洲精品欧美精品| 亚洲天堂男人| 久久黄金**| 亚洲免费观看高清完整版在线观看熊 | 国内一区二区三区在线视频| 欧美mv日韩mv亚洲| 午夜欧美精品久久久久久久| 欧美韩日一区| 欧美尤物巨大精品爽| 亚洲精品国产无天堂网2021| 国产精品色午夜在线观看| 裸体丰满少妇做受久久99精品| 99国产精品久久久| 久久综合色天天久久综合图片| 亚洲一区二区av电影| 亚洲成色777777在线观看影院| 国产精品www.| 欧美激情国产高清| 久久久噜噜噜久久中文字幕色伊伊 | 欧美一区三区二区在线观看| 亚洲日本va午夜在线影院| 国产日韩亚洲欧美| 国产精品电影网站| 欧美黑人国产人伦爽爽爽| 欧美伊人久久久久久久久影院 | 欧美韩日一区二区三区| 久久精品九九| 欧美一区二区| 亚洲一区国产精品| 99精品国产福利在线观看免费| 麻豆精品91| 亚洲欧美国产毛片在线| 日韩一区二区精品视频| 亚洲国产综合在线| 含羞草久久爱69一区| 国产女人精品视频| 国产精品成人在线观看| 欧美日韩mp4| 欧美黄色免费网站| 欧美成人精品h版在线观看| 欧美专区在线| 欧美在线视频一区二区| 欧美一级免费视频| 午夜精品久久久久久久蜜桃app| 亚洲一区二区三区在线播放| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美在线不卡视频| 欧美在线一二三区| 欧美亚洲免费高清在线观看| 亚洲女性裸体视频| 亚洲欧美中文在线视频| 性伦欧美刺激片在线观看| 午夜视频久久久| 欧美一级黄色网| 欧美一级理论性理论a| 久久精品99国产精品日本| 久久久777| 狂野欧美一区| 亚洲电影在线播放| 亚洲精品视频在线观看免费| 日韩网站在线看片你懂的| 99精品久久| 小处雏高清一区二区三区| 久久精品日产第一区二区三区| 久久在线观看视频| 欧美精品国产精品| 欧美性猛交视频| 国产日韩欧美综合一区| 亚洲丰满在线| aa国产精品| 久久不射电影网| 欧美ed2k| 一本一本a久久| 久久成人国产精品| 亚洲精品一二区| 男人天堂欧美日韩| 亚洲字幕在线观看| 亚洲大胆人体在线| 久久久www免费人成黑人精品| 黑人巨大精品欧美一区二区| 欧美国产成人在线| 欧美天堂亚洲电影院在线播放| 欧美a级在线| 欧美日韩一区二区在线| 国产精品自在欧美一区| 在线精品观看| 午夜伦欧美伦电影理论片| 可以看av的网站久久看| 亚洲精品一二三| 久久精品午夜| 欧美性大战久久久久| 在线日韩中文| 香蕉久久a毛片| 亚洲人成网站色ww在线| 欧美一级专区| 国产精品成人观看视频国产奇米| 亚洲一区二区三区777| 日韩亚洲在线观看| 欧美激情亚洲激情| 欧美体内she精视频在线观看| 黄色精品一区二区| 亚洲欧美日韩精品久久奇米色影视| 欧美69wwwcom| 欧美亚洲综合另类| 国产精品久99| 亚洲图片欧洲图片av| 欧美大成色www永久网站婷| 午夜精品久久久久久久白皮肤| 欧美人成在线| 亚洲国产婷婷综合在线精品| 久久久久99| 欧美一级片在线播放| 国产精品theporn| 夜夜躁日日躁狠狠久久88av| 欧美成人一区在线| 久久久人成影片一区二区三区观看 | 亚洲欧美中日韩| 国产精品99免视看9| 亚洲高清网站| 久久中文欧美| 亚洲国产网站| 久久一区激情| 亚洲欧美中文另类| 国产精品美女黄网| 亚洲中午字幕| 宅男精品导航| 国产精品久久久久久久久久妞妞| 夜夜嗨网站十八久久| 亚洲日本激情| 欧美日韩国产精品一区| 一区二区三区国产精品| 亚洲精品欧美日韩专区| 欧美日韩999| 亚洲亚洲精品三区日韩精品在线视频| 欧美高清视频一区二区三区在线观看| 久久久青草婷婷精品综合日韩| 一区二区三区中文在线观看| 米奇777在线欧美播放|