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

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>
              最新亚洲电影| 欧美体内she精视频| 国产一区视频网站| 欧美激情在线观看| 欧美在线视频在线播放完整版免费观看| 欧美激情第五页| 麻豆精品视频在线观看视频| 久久久精品国产99久久精品芒果| 亚洲精品在线观看视频| 亚洲淫性视频| 在线亚洲一区观看| 欧美69wwwcom| 久久尤物电影视频在线观看| 欧美色偷偷大香| 亚洲国产美女| 国外成人在线视频网站| 中文精品99久久国产香蕉| 亚洲精品一区二区网址| 欧美一区成人| 亚洲欧美在线视频观看| 国产免费成人av| 激情国产一区| 亚洲第一综合天堂另类专| 欧美另类在线观看| 久久成人在线| 欧美激情亚洲视频| 久久av资源网站| 欧美国产日韩精品| 久久精品av麻豆的观看方式 | 国产一区二区| 国产一区二区成人久久免费影院| 欧美高清不卡| 国产精品腿扒开做爽爽爽挤奶网站| 浪潮色综合久久天堂| 欧美视频中文字幕| 欧美电影专区| 国产亚洲欧美aaaa| 在线亚洲欧美专区二区| 亚洲国产精品免费| 午夜一区不卡| 亚洲欧美日本精品| 欧美精品一区二区三区四区| 久久人人精品| 国产日韩精品电影| 亚洲免费电影在线| 亚洲黄色成人网| 久久精彩视频| 欧美一区二区成人6969| 欧美日韩一区三区| 亚洲日本在线观看| 亚洲人www| 久久综合九色综合网站| 久久久国产精品一区| 国产精品播放| 一区二区欧美视频| 一本一本大道香蕉久在线精品| 鲁大师成人一区二区三区| 久久久www| 国内精品视频久久| 中文国产成人精品久久一| 亚洲一级在线| 国产一区二区三区久久久久久久久| 亚洲免费成人av| 在线视频中文亚洲| 欧美日韩精品一区视频| 亚洲青涩在线| 在线一区免费观看| 欧美视频精品在线| 一本色道久久综合狠狠躁的推荐| 在线亚洲精品福利网址导航| 欧美日韩一区不卡| 一区二区三区视频在线看| 亚洲欧美精品| 国产精品有限公司| 久久gogo国模裸体人体| 久久综合九色欧美综合狠狠| 曰韩精品一区二区| 麻豆精品传媒视频| 亚洲精品孕妇| 亚洲欧美日韩精品| 国产一区二区你懂的| 久久精品国产精品| 亚洲承认在线| 亚洲校园激情| 国产欧美视频一区二区三区| 久久精品99| 亚洲第一精品夜夜躁人人爽 | 国产亚洲一区二区三区| 亚洲欧美日韩国产中文在线| 国产精品国产三级国产普通话99 | 久久久噜噜噜久噜久久 | 欧美www在线| 一区二区欧美日韩视频| 国产精品系列在线| 久久午夜羞羞影院免费观看| 日韩视频―中文字幕| 久久国产精品亚洲77777| 最新国产乱人伦偷精品免费网站| 欧美激情第8页| 午夜影院日韩| 亚洲人成小说网站色在线| 性做久久久久久| 91久久精品一区二区别| 国产精品久久77777| 久久视频在线视频| 在线亚洲国产精品网站| 欧美国产日韩一区二区| 性欧美办公室18xxxxhd| 亚洲精品久久久久久久久久久久| 国产美女精品在线| 欧美激情91| 欧美在线黄色| 在线视频精品一| 欧美激情综合色| 久久精品五月| 亚洲综合色激情五月| 亚洲人成在线播放| 激情校园亚洲| 国产日韩欧美三级| 欧美日韩亚洲另类| 麻豆精品视频| 久久精品中文字幕一区| 亚洲在线成人| 99精品视频免费观看视频| 欧美呦呦网站| 女生裸体视频一区二区三区| 亚洲一区二区久久| 一本色道久久综合亚洲二区三区| 亚洲高清资源| 一区二区在线视频| 极品日韩久久| 国产综合色产在线精品| 国产精品视频久久一区| 国产精品大片wwwwww| 欧美精品99| 欧美国产综合一区二区| 老鸭窝亚洲一区二区三区| 久久九九国产| 久久久久久婷| 久久中文欧美| 麻豆精品视频在线观看| 久久在线免费观看| 久久女同互慰一区二区三区| 久久九九99视频| 久久这里只有精品视频首页| 久久综合狠狠综合久久综合88| 久久久999精品免费| 久久久久久亚洲综合影院红桃| 欧美有码在线观看视频| 亚洲欧美www| 午夜精品久久久久久久蜜桃app | 午夜精品免费| 欧美一区2区三区4区公司二百| 午夜亚洲性色视频| 久久久www成人免费精品| 美女国产一区| 亚洲国产欧美一区| 亚洲免费久久| 亚洲欧美日韩另类| 久久成人资源| 欧美大胆a视频| 欧美日韩在线直播| 国产欧美va欧美va香蕉在| 国产日韩亚洲欧美| 亚洲国产99精品国自产| 一区二区日韩| 欧美一区亚洲二区| 免费不卡中文字幕视频| 亚洲人成免费| 一本一道久久综合狠狠老精东影业 | 日韩网站在线观看| 午夜天堂精品久久久久| 麻豆精品视频| 99在线精品视频在线观看| 性色av一区二区三区红粉影视| 久久亚洲风情| 国产精品久久久久久久久久ktv | 亚洲精品女av网站| 亚洲欧美日本在线| 欧美插天视频在线播放| 99香蕉国产精品偷在线观看| 久久国产免费看| 欧美激情aⅴ一区二区三区| 国产精品视频yy9099| 亚洲福利视频专区| 香蕉久久a毛片| 亚洲国产欧美久久| 欧美一级片一区| 欧美三级欧美一级| 亚洲国产电影| 久久久www成人免费精品| 日韩网站在线观看| 久久久久欧美| 国产精品视频午夜| 一片黄亚洲嫩模| 欧美激情一级片一区二区| 亚洲理伦在线| 亚洲黄色在线观看| 欧美一区久久| 日韩视频在线免费观看|