著名的NUnit是單元測試的優秀工具,可是要在一個測試方法中啓動GUI程序,好比Windows Form界面,這比較難作到。NUnitForms就是爲解決這個問題產生的,它是NUnit的一個擴展程序,可用於測試Windows Forms 類型的程序。css
首先從NUnitForm網站下載安裝程序,地址是 http://nunitforms.sourceforge.net/index.html,並執行安裝。html
在VS2010中新增一個測試項目,添加對兩個程序集NUnit.Framework和NUnit.NunitForms引用,添加新測試類型:多線程
using NUnit.Framework; using NUnit.Extensions.Forms; … Namespace yourTestSuiteNameSpace { [TestFixture] public class myGUITests : NUnitFormTest … }
若是要顯示GUID,則測試類型應該繼承於NUnitFormTest, 添加TestFixture特性,再添加一個Test方法:less
[Test] pubilc void ShowDilalogTest() { Form dlg=new Form(); dlg.Show(); }
若是您的Visual Studio已經安裝了Resharper插件,則能夠直接點擊被測試方法的簽名地方,選擇調試或是運行測試,上面的測試方面會顯示一個GUI界面,關閉窗體,測試完成。工具
也能夠用窗體實例的ShowDialog 方法調出界面,顯示爲 個model對話框。單元測試
若是要引用被測試窗體中的控件,命名空間NUnitForms 中有一些以Tester類型結尾的類型可供使用。這些類型繼承於ControlTester ,能夠用ControlTester 來測試控件,也能夠用它的派生類型。測試
以ControlTester類來測試任何控件,能夠像這樣經過屬性的索引來訪問它的屬性.網站
ControlTester textBox = new ControlTester("nameOfSomeTextBox"); Assertion.AssertEquals("defaultText", textBox["Text"]); textBox["text"] = "newText";
嘗試使用FireEvent方法來觸發控件的一個事件:ui
ControlTester button = new ControlTester("nameOfSomeButton"); button.FireEvent("Click");
好比,爲了引用窗體MyFormName類型中的button1的按鈕,能夠下面的方法引用此控件:this
ButtonTester buttonTester = new ButtonTester("button1", "MyFormName");
若是你省略了"formName"參數, NUnitForms將在全部打開的Form中查找控件。
對於Panel控件,要引用它的子控件,可參考下面的寫法,以逗號分隔多個名稱:
CheckBoxTester uncheckBoxTester = new CheckBoxTester( "aPanelName.checkBoxName", "MyFormName");
RadioButtonTester radioTester = new RadioButtonTester("mainFormControlName.panelName.radioButtonName", "MyFormName");
若是NUnitForms找不到你的控件, 會拋出一個NoSuchControlException異常. 若是控件的名稱沒有資格使它成爲一個惟一命名的控件, 將會被拋出AmbiguousNameException異常.
對於層層嵌套控件的命名,請參考下面的例子
控件的命名
NUnitForms經過控件的Name屬性來查找你要測試的控件. 若是在一個form中有多個相同名稱的控件, 那麼他們必須像下面這樣進行限定:
Form
PanelA
UserControl1
Button (PanelA.UserControl1.Button)
UserControl2
Button (UserControl2.Button)
PanelB
UserControl1
Button (PanelB.UserControl1.Button)
當測試窗體時,若是這個窗體要調出子窗體或是調出對話框,這時須要把窗體的測試邏輯放到一個public void簽名的方法中,並用ExprectModel指定方法名稱:
[Test] public void TestOKButtonTest() { ExpectModal("FormName", "formNameHandler"); FormName form = new FormName(); form.ShowDialog(); … public void formNameHandler () { ButtonTester buttonTester = new ButtonTester("okButton", " FormName"); // Check the OK button's text and then click it Assert.AreEqual("OK", buttonTester.Text, "FormName’s OK button text is wrong '" + buttonTester.Text + "'"); buttonTester.Click(); }
測試時,若是要調出message box,請參考下面的寫法
ExpectModal("messageBoxCaption", "messageBoxClickerMethod");
若是運用到多線程測試窗體,應該像下面的例子同樣,註冊一個委託類型,把測試代碼放到該方法中
public void genericFormHandler() { // Do nothing in this method! } … [Test] public void MainFormTest() { … MainGUIForm mainForm = new MainGUIForm(); mainForm.OnFormReady += new EventHandler<EventArgs> (mainFormTestLogic); ExpectModal("MainGUIForm", "genericFormHandler"); mainForm.ShowDialog(); … } public void mainFormTestLogic (object sender, EventArgs e)
目前能夠下載到的版本是NUnitFormsV2.0.0.5 alpha4。
既然能夠調出窗體,就能夠測試自定義控件,這是一種測試自定義控件的好方法。
測試項目與Resharper配合起來,很容易啓動,調試,修改,這樣作單元測試,纔是有益於改善代碼的測試。