共用方式為


自動程式碼 UI 測試的結構

當您在測試專案中建立自動程式碼 UI 測試時,有數個檔案會加入至方案。在本主題中,我們將使用自動程式碼 UI 測試範例來探索這些檔案。

需求

  • Visual Studio Ultimate, Visual Studio Premium

自動程式碼 UI 測試的內容

當您建立自動程式碼 UI 測試時,[自動程式碼 UI 測試產生器] 會建立受測使用者介面的對應,以及所有測試的測試方法、參數和判斷提示。此外還會建立每個測試的類別檔案。

檔案

內容

是否可編輯?

UIMap.Designer.cs

宣告區段

UIMap 類別 (部分,自動產生)

方法

屬性

UIMap.cs

UIMap 類別 (部分)

CodedUITest1.cs

CodedUITest1 類別

方法

屬性

UIMap.uitest

測試中 UI 的 XML 對應。

UIMap.Designer.cs

此檔案包含建立測試時,[自動程式碼 UI 測試產生器] 自動產生的程式碼。此檔案會在每次測試變更時重新建立,因此您無法在此檔案中加入或修改程式碼。

宣告區段

此區段包含下列 Windows UI 的宣告。

using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Drawing;
using System.Text.RegularExpressions;
using System.Windows.Input;
using Microsoft.VisualStudio.TestTools.UITest.Extension;
using Microsoft.VisualStudio.TestTools.UITesting;
using Microsoft.VisualStudio.TestTools.UITesting.WinControls;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Keyboard = Microsoft.VisualStudio.TestTools.UITesting.Keyboard;
using Mouse = Microsoft.VisualStudio.TestTools.UITesting.Mouse;
using MouseButtons = System.Windows.Forms.MouseButtons;

Windows 使用者介面 (UI) 會包含 Microsoft.VisualStudio.TestTools.UITesting.WinControls 命名空間。若為網頁 UI,命名空間會是 Microsoft.VisualStudio.TestTools.UITesting.HtmlControls;若為 Windows Presentation Foundation UI,則命名空間會是 Microsoft.VisualStudio.TestTools.UITesting.WpfControls

UIMap 類別

檔案的下一個區段為 UIMap 類別。

[GeneratedCode("Coded UITest Builder", "10.0.21221.0")]
public partial class UIMap

類別程式碼是以套用至類別的 GeneratedCodeAttribute 做為開頭,該類別宣告為部分類別。您將發現,此屬性也會套用至此檔案中的每一個類別。另一個可以包含更多此類別程式碼的檔案為 UIMap.cs,此檔案將於稍後討論。

產生的 UIMap 類別會包括錄製測試時指定之每一種方法的程式碼。

public void LaunchCalculator()
public void AddItems()
public void VerifyTotal()
public void CleanUp()

UIMap 類別的這個部分還會包括針對方法所需的每一個屬性產生的程式碼。

public virtual LaunchCalculatorParams LaunchCalculatorParams
public virtual AddItemsParams AddItemsParams
public virtual VerifyTotalExpectedValues VerifyTotalExpectedValues
public virtual CalculateItemsParams CalculateItemsParams
public virtual VerifyMathAppTotalExpectedValues 
    VerifyMathAppTotalExpectedValues
public UIStartMenuWindow UIStartMenuWindow
public UIRunWindow UIRunWindow
public UICalculatorWindow UICalculatorWindow
public UIStartWindow UIStartWindow
public UIMathApplicationWindow UIMathApplicationWindow

UIMap 方法

每一個方法的結構都類似 AddItems() 方法。在程式碼底下會有更詳細的說明,其中加入分行符號讓您易於閱讀。

/// <summary>
/// AddItems - Use 'AddItemsParams' to pass parameters into this method.
/// </summary>
public void AddItems()
{
    #region Variable Declarations
    WinControl uICalculatorDialog = 
        this.UICalculatorWindow.UICalculatorDialog;
    WinEdit uIItemEdit = 
        this.UICalculatorWindow.UIItemWindow.UIItemEdit;
    #endregion

    // Type '{NumPad7}' in 'Calculator' Dialog
    Keyboard.SendKeys(uICalculatorDialog, 
        this.AddItemsParams.UICalculatorDialogSendKeys, 
        ModifierKeys.None);

    // Type '{Add}{NumPad2}{Enter}' in 'Unknown Name' text box
    Keyboard.SendKeys(uIItemEdit, 
        this.AddItemsParams.UIItemEditSendKeys, 
        ModifierKeys.None);
}

每個方法定義的摘要註解都會說明,該方法的參數值所使用的類別。此案例中為 AddItemsParams 類別,該類別稍後會在 UIMap.cs 檔案中定義,同時也是 AddItemsParams 屬性所傳回的實值型別。

方法程式碼的最上方有一個 Variable Declarations 區域,用於定義方法將使用之 UI 物件的區域變數。

在此方法中,UIItemWindow 和 UIItemEdit 是使用 UICalculatorWindow 類別存取的屬性,該類別稍後會在 UIMap.cs 檔案中定義。

下面幾行會使用 AddItemsParams 物件的屬性從鍵盤將文字傳送至 [小算盤] 應用程式。

VerifyTotal() 方法的結構非常類似,而且包含下列判斷提示程式碼。

// Verify that 'Unknown Name' text box's property 'Text' equals '9. '
Assert.AreEqual(
    this.VerifyTotalExpectedValues.UIItemEditText, 
    uIItemEdit.Text);

文字方塊名稱會以「未知」狀態列出,因為 Windows [小算盤] 應用程式的開發人員並未針對控制項提供公開可用的名稱。實際值不等於預期值時,Assert.AreEqual 方法便會失敗,如此會造成測試失敗。另請注意,預期值包含小數點,而且後面會有一個空格。如果您必須修改此特殊測試的功能,則必須允許該小數點和空格。

UIMap 屬性

每個屬性的程式碼在整個類別中也會非常標準。下列 AddItemsParams 屬性的程式碼會在 AddItems() 方法中使用。

public virtual AddItemsParams AddItemsParams
{
    get
    {
        if ((this.mAddItemsParams == null))
        {
            this.mAddItemsParams = new AddItemsParams();
        }
        return this.mAddItemsParams;
    }
}

請注意,在傳回值之前,屬性會使用名為 mAddItemsParams 的私用區域變數來保留值。屬性傳回之物件的類別名稱會與屬性名稱相同。此類別稍後會在 UIMap.cs 檔案中定義。

屬性傳回的每個類別都會擁有類似的結構。以下為 AddItemsParams 類別。

/// <summary>
/// Parameters to be passed into 'AddItems'
/// </summary>
[GeneratedCode("Coded UITest Builder", "10.0.21221.0")]
public class AddItemsParams
{
    #region Fields
    /// <summary>
    /// Type '{NumPad7}' in 'Calculator' Dialog
    /// </summary>
    public string UICalculatorDialogSendKeys = "{NumPad7}";

    /// <summary>
    /// Type '{Add}{NumPad2}{Enter}' in 'Unknown Name' text box
    /// </summary>
    public string UIItemEditSendKeys = "{Add}{NumPad2}{Enter}";
    #endregion
}

就像 UIMap.cs 檔案中的所有類別一樣,此類別會以 GeneratedCodeAttribute 開頭。這個小類別中有一個 Fields 區域,用於定義做為 Keyboard.SendKeys 方法之參數的字串,此方法用於前面討論過的 UIMap.AddItems() 方法。您可以撰寫程式碼,在呼叫使用這些參數的方法之前取代這些字串欄位中的值。

UIMap.cs

根據預設,此檔案包含部分 UIMap 類別,該類別未包含任何方法或屬性。

UIMap 類別

您可以在這裡建立自訂程式碼,以擴充 UIMap 類別的功能。每次測試經過修改時,[自動程式碼 UI 測試產生器] 不會重新產生您在此檔案中建立的程式碼。

UIMap 的所有部分都可以使用 UIMap 類別中任何其他部分的方法和屬性。

CodedUITest1.cs

此檔案是由 [自動程式碼 UI 測試產生器] 所產生,但是不會在每次測試經過修改時重新建立,因此您可以修改此檔案中的程式碼。此檔案的名稱是從您建立測試時所為測試所指定的名稱產生。

CodedUITest1 類別

根據預設,此檔案只包含一個類別的定義。

[CodedUITest]
public class CodedUITest1

T:Microsoft.VisualStudio.TestTools.UITesting.CodedUITestAttribute 會自動套用至類別,並且允許測試架構將它辨識為測試擴充功能。另請注意,這不是部分類別。所有類別程式碼都會包含在此檔案中。

CodedUITest1 屬性

此類別包含兩個位於檔案底部的預設屬性。這兩個屬性不得修改。

/// <summary>
/// Gets or sets the test context which provides
/// information about and functionality for the current test run.
///</summary>
public TestContext TestContext
public UIMap UIMap

CodedUITest1 方法

根據預設,此類別只包含一個方法。

public void CodedUITestMethod1()

此方法會呼叫您在錄製測試時指定的每一個 UIMap 方法,此方法會在 UIMap 類別的區段中描述。

標題為 Additional test attributes (如果未加註解) 的區域包含兩個選擇性的方法。

// Use TestInitialize to run code before running each test 
[TestInitialize()]
public void MyTestInitialize()
{
    // To generate code for this test, select "Generate Code for Coded 
    // UI Test" from the shortcut menu and select one of the menu items.
    // For more information on generated code, see 
    // https://go.microsoft.com/fwlink/?LinkId=179463

    // You could move this line from the CodedUITestMethod1() method
    this.UIMap.LaunchCalculator();
}

// Use TestCleanup to run code after each test has run
[TestCleanup()]
public void MyTestCleanup()
{
    // To generate code for this test, select "Generate Code for Coded 
    // UI Test" from the shortcut menu and select one of the menu items.
    // For more information on generated code, see 
    // https://go.microsoft.com/fwlink/?LinkId=179463

    // You could move this line from the CodedUITestMethod1() method
    this.UIMap.CloseCalculator();
}

MyTestInitialize() 方法套用了 TestInitializeAttribute,會告知測試架構在呼叫任何其他測試方法之前先呼叫此方法。同樣地,MyTestCleanup() 方法套用了 TestCleanupAttribute,會告知測試架構在呼叫所有其他測試方法之後,再呼叫此方法。您可以選擇性地使用這些方法。在此測試中,UIMap.LaunchCalculator() 方法可能是從 MyTestInitialize() 呼叫,而 UIMap.CloseCalculator() 方法可能是從 MyTestCleanup() 呼叫,而不是從 CodedUITest1Method1()。

如果您使用 CodedUITestAttribute 將更多方法加入至此類別,測試架構將在測試中呼叫每一個方法。

UIMap.uitest

這是 XML 檔案,表示自動程式碼 UI 測試錄製及其所有部分的結構。其中包括動作和類別,另外還包括這些類別的方法和屬性。UIMap.Designer.cs 檔案包含 [自動程式碼 UI 產生器] 產生的程式碼,用於重新產生測試的結構,並且提供測試架構的連接。

UIMap.uitest 檔案無法直接編輯。不過,您可以使用 [自動程式碼 UI 產生器] 修改測試,它會自動修改 UIMap.uitest 檔案和 UIMap.Designer.cs 檔案。

請參閱

參考

UIMap

Microsoft.VisualStudio.TestTools.UITesting.WinControls

Microsoft.VisualStudio.TestTools.UITesting.HtmlControls

Microsoft.VisualStudio.TestTools.UITesting.WpfControls

GeneratedCodeAttribute

Assert.AreEqual

Keyboard.SendKeys

CodedUITestAttribute

TestInitializeAttribute

TestCleanupAttribute

概念

使用 UI 自動化驗證程式碼

自動程式碼 UI 測試的最佳作法

測試含有多個 UI 對應的大型應用程式

自動程式碼 UI 測試和動作記錄的支援組態和平台

其他資源

建立自動程式碼 UI 測試