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

C++ Programmer's Cookbook

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

vs2005 的單元測(cè)試

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

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

  比如我們有這樣一個(gè)私有方法

?

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

 }

}

?

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

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

  簡(jiǎn)單來(lái)說(shuō),Visual Studio UnitTest 生成私有方法的單元測(cè)試時(shí),將自動(dòng)創(chuàng)建一個(gè)私有訪(fǎng)問(wèn)器。私有訪(fǎng)問(wèn)器是測(cè)試方法用于訪(fǎng)問(wèn)私有代碼的方法。單元測(cè)試生成對(duì)私有訪(fǎng)問(wèn)器的調(diào)用,然后通過(guò)私有訪(fǎng)問(wèn)器來(lái)調(diào)用私有方法。私有訪(fǎng)問(wèn)器駐留在測(cè)試項(xiàng)目中的文件中;因此將被編譯為測(cè)試項(xiàng)目程序集。

  具體來(lái)看測(cè)試項(xiàng)目:

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

  這個(gè)文件包含兩個(gè)類(lèi):

  internal 類(lèi)型的 BaseAccessor 類(lèi) 和 派生自它的 ClassLibrary1_DivisionClassAccessor 類(lèi)

  BaseAccessor 類(lèi)是通用的訪(fǎng)問(wèn)器基類(lèi)。

  ClassLibrary1_DivisionClassAccessor 類(lèi) 則是對(duì)你要訪(fǎng)問(wèn)類(lèi)的私有方法進(jìn)行了反射封裝,這樣你就可以通過(guò)操作這個(gè)類(lèi)來(lái)操作該私有方法了。如下面代碼:

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)您更改正在測(cè)試的代碼文件中的私有方法時(shí),這個(gè)訪(fǎng)問(wèn)器可能無(wú)法正常工作,需要重新生成專(zhuān)用訪(fǎng)問(wèn)器(ClassLibrary1_DivisionClassAccessor 類(lèi))。

  整理一下就是:

  這個(gè)訪(fǎng)問(wèn)器,是通過(guò)反射的方式實(shí)現(xiàn)的。

  VSUT利用自動(dòng)代碼生成技術(shù),在單元測(cè)試項(xiàng)目中先來(lái)給你要測(cè)試的類(lèi)生成一個(gè)名字叫XXXAccessor的訪(fǎng)問(wèn)器。

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

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



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

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

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

  本例中,我們由 btnWorkOut_Click 創(chuàng)建單元測(cè)試,自動(dò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.");
}

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

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

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

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

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

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

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

posted on 2006-04-20 19:34 夢(mèng)在天涯 閱讀(2882) 評(píng)論(3)  編輯 收藏 引用 所屬分類(lèi): C#/.NET

評(píng)論

# re: vs2005 的單元測(cè)試 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ù)  更多評(píng)論   

# re: vs2005 的單元測(cè)試 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ù)  更多評(píng)論   

# re: vs2005 的單元測(cè)試 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ù)  更多評(píng)論   

公告

EMail:itech001#126.com

導(dǎo)航

統(tǒng)計(jì)

  • 隨筆 - 461
  • 文章 - 4
  • 評(píng)論 - 746
  • 引用 - 0

常用鏈接

隨筆分類(lèi)

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1816190
  • 排名 - 5

最新評(píng)論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              亚洲精品视频啊美女在线直播| aaa亚洲精品一二三区| 国产精品亚洲а∨天堂免在线| 欧美日韩亚洲高清| 欧美日韩精品二区| 国产精品爱久久久久久久| 国产精品成人一区| 国产精品久久久久久久久久免费| 欧美日韩在线播放一区| 国产精品国产一区二区| 国产情侣一区| 精品999在线播放| 亚洲国产精品国自产拍av秋霞| 亚洲国产精品嫩草影院| 亚洲狼人综合| 亚洲视频狠狠| 欧美一级视频免费在线观看| 久久久国产精品一区| 欧美一级网站| 99精品欧美一区二区三区| 中日韩男男gay无套| 午夜精品福利在线| 久久婷婷国产麻豆91天堂| 欧美va天堂| 99re6这里只有精品| 亚洲欧美日韩一区二区三区在线| 欧美在线啊v| 欧美福利电影在线观看| 国产精品国产三级国产专播精品人| 国产日韩精品综合网站| 亚洲电影av| 亚洲男人影院| 欧美成人午夜77777| 亚洲麻豆国产自偷在线| 午夜精品视频在线| 欧美成人嫩草网站| 国产伦一区二区三区色一情| 在线日韩中文字幕| 亚洲午夜极品| 毛片精品免费在线观看| av成人黄色| 久久久噜噜噜| 欧美丝袜一区二区三区| 亚洲电影在线播放| 午夜精品久久久久久久99热浪潮 | 久久亚洲春色中文字幕| 亚洲日本一区二区| 性色av香蕉一区二区| 欧美紧缚bdsm在线视频| 国产一区二区在线观看免费播放| 亚洲九九精品| 久久婷婷亚洲| 亚洲一区二区视频在线观看| 韩国一区二区三区在线观看| 亚洲夫妻自拍| 欧美一区二区在线免费观看| 亚洲国产免费| 久久精品在线观看| 国产精品日韩精品欧美精品| 亚洲巨乳在线| 蜜臀av一级做a爰片久久| 亚洲网站在线看| 欧美粗暴jizz性欧美20| 韩日成人av| 欧美一区激情| 一区二区激情| 欧美精品aa| 亚洲国产精品成人精品| 久久精品女人的天堂av| 在线一区二区三区四区| 欧美福利专区| 亚洲国产精品一区二区www| 性18欧美另类| 中文在线一区| 欧美日韩在线三区| 亚洲裸体视频| 亚洲黑丝在线| 免费不卡在线视频| 亚洲国产成人久久综合一区| 久久精品最新地址| 亚洲欧美一区二区视频| 欧美亚州一区二区三区 | 亚洲永久免费av| 欧美午夜精品伦理| 99人久久精品视频最新地址| 亚洲国产91| 欧美插天视频在线播放| 亚洲第一在线视频| 你懂的视频一区二区| 中文精品一区二区三区| 亚洲第一网站免费视频| 欧美一级淫片aaaaaaa视频| 国产精品免费看久久久香蕉| 在线一区二区三区四区| 亚洲精品一区二区三区av| 欧美激情精品久久久久久黑人| 亚洲国产欧美一区| 欧美黄污视频| 欧美黄污视频| 一区二区三区高清| 亚洲乱码国产乱码精品精| 欧美喷水视频| 亚洲影音一区| 亚洲欧美第一页| 国产亚洲精品一区二555| 久久国产精品亚洲va麻豆| 欧美一区二区三区四区夜夜大片 | 99精品黄色片免费大全| 欧美日韩在线不卡| 亚洲在线网站| 欧美亚洲日本一区| 在线观看亚洲精品视频| 欧美刺激性大交免费视频| 你懂的国产精品永久在线| 99v久久综合狠狠综合久久| 欧美不卡在线视频| 久久久国产成人精品| 在线观看的日韩av| 亚洲国产精品综合| 欧美日韩直播| 欧美中在线观看| 久久免费国产精品1| 亚洲美女在线观看| 在线亚洲一区| 黑人一区二区三区四区五区| 欧美高潮视频| 欧美日韩直播| 久久久一二三| 欧美精品三级在线观看| 亚洲欧美日韩成人| 久久精品一区二区三区中文字幕| 亚洲欧洲一区二区在线播放 | 欧美ab在线视频| 欧美伦理a级免费电影| 亚洲欧美高清| 久久欧美中文字幕| 在线午夜精品自拍| 久久精品国产亚洲aⅴ| 亚洲麻豆视频| 欧美一区二区三区男人的天堂| 亚洲国产精品日韩| 亚洲专区一区二区三区| 亚洲丰满在线| 亚洲在线一区二区三区| 亚洲国产毛片完整版| 亚洲一区二区三区免费观看| 在线不卡视频| 亚洲一级黄色片| 亚洲国产精品美女| 亚洲欧美日韩国产综合| 亚洲人成网站精品片在线观看| 亚洲一级黄色av| 亚洲日本va午夜在线影院| 亚洲制服av| 日韩一区二区免费高清| 欧美伊人影院| 亚洲午夜精品国产| 欧美成年网站| 久久一区二区三区超碰国产精品| 欧美日韩在线直播| 欧美激情中文字幕乱码免费| 国产欧美日韩视频在线观看 | 国产精品视区| 亚洲欧洲在线一区| 精品69视频一区二区三区| 一本色道久久88综合亚洲精品ⅰ| 影音先锋久久资源网| 亚洲一区二区三区影院| 一区二区日韩欧美| 美女国产一区| 久久久一二三| 国产精品免费区二区三区观看| 亚洲国产另类久久精品| 韩日欧美一区| 先锋a资源在线看亚洲| 亚洲男人天堂2024| 欧美日本免费| 亚洲高清免费| 在线看国产日韩| 久久国产精品一区二区三区| 午夜免费电影一区在线观看| 欧美日韩123| 亚洲国产欧美一区二区三区同亚洲| 黑人一区二区三区四区五区| 亚洲免费视频一区二区| 亚洲一区区二区| 欧美日韩国产精品| 亚洲黄一区二区| 亚洲精品欧洲精品| 欧美xart系列在线观看| 欧美承认网站| 亚洲国产精品成人一区二区| 久久久999精品免费| 久久夜色精品国产欧美乱极品| 国产欧美日韩一区| 亚洲欧美激情一区| 欧美一级网站| 国产亚洲午夜| 久久国产66| 免费一区视频|