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


著名的NUnit是單元測試的優秀工具,但是要在一個測試方法中啟動GUI程序,比如Windows Form界面,這比較難做到。NUnitForms就是為解決這個問題產生的,它是NUnit的一個擴展程序,可用於測試Windows Forms 類型的程序。

首先從NUnitForm網站下載安裝程序,地址是 http://nunitforms.sourceforge.net/index.html,並執行安裝。

在VS2010中新增一個測試項目,添加對兩個程序集NUnit.Framework和NUnit.NunitForms引用,添加新測試類型:

using NUnit.Framework;
using NUnit.Extensions.Forms;
…
Namespace yourTestSuiteNameSpace
{
    [TestFixture]
    public class myGUITests : NUnitFormTest
…

}

如果要顯示GUID,則測試類型應該繼承於NUnitFormTest, 添加TestFixture特性,再添加一個Test方法:

[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方法來觸發控件的一個事件:

ControlTester button = new ControlTester("nameOfSomeButton");
button.FireEvent("Click");

 

比如,為了引用窗體MyFormName類型中的button1的按鈕,可以下面的方法引用此控件:

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配合起來,很容易啟動,調試,修改,這樣做單元測試,才是有益於改善代碼的測試。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM