NUnitForms 測試GUI應用程序的優秀工具

著名的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();
}
 
 

啓動GUI界面

若是您的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)

 

Model/Modeless Dialog 模式窗體/非模式窗體

當測試窗體時,若是這個窗體要調出子窗體或是調出對話框,這時須要把窗體的測試邏輯放到一個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配合起來,很容易啓動,調試,修改,這樣作單元測試,纔是有益於改善代碼的測試。

相關文章
相關標籤/搜索