VS2010測試功能之旅:編碼的UI測試(2)-操作動作的錄製原理(下)

 

回顧

在本章上部分介紹了操作動作的錄製原理,描述了操作動作是如何錄製,UIMap.uitestUIMap.Designer.cs的代碼如何生成,以及他們的結構。在這個部分,將着重說明如何通過修改UIMap1.uitest文件的操作動作部分的代碼來控制UIMap1.Designer.cs操作動作部分代碼的生成,實現第一種方式的自定義編碼。

 

內容簡介

上個部分,已經說明了UIMap.uitest文件的結構如下

其中InitializeActionsExecuteActionsCleanupActionsOnErrorAction都是對於操作動作的描述:

InitializeActions:指初始化需要執行的操作動作

ExecuteActions:指測試過程中的操作動作(通過錄制所生成的操作都默認放在ExecuteActions

CleanupActions:指測試完畢需要清理資源的操作動作

OnErrorAction:指代異常處理的操作動作

他們都對UIMap1.Designer.cs操作動作部分代碼的生成和參數的生成有直接的影響。

嚴格的說,放在InitializeActions下的操作動作和放在ExecuteActionsCleanupActionsOnErrorAction的動作沒有任何本質上的區別,僅僅只是從一個代碼可讀性上的考慮

 

編碼的UI測試所支持的Actions

如果我們仔細觀察過ExecuteActions錄製所生成的代碼,可以發現有一個共同特點,ExecuteActions的子節點都是以<Action>結尾形式的標籤,那麼編碼的UI測試一共支持多少種的Action呢?這裏我整理了一個列表,簡單的介紹了測試所支持的Action和功能簡介

說明

AggregatedAction

爲可以完成幾種任務中任何一種的所有操作提供基類。

AssertAction

表示要包含在測試中其他兩個操作之間的斷言。

BrowserAction

表示可以完成幾種瀏覽器任務中的任何一種的測試操作。

DelayAction

指定執行用戶界面 (UI) 測試中的後續操作後的時間延遲。

DragAction

表示鼠標拖動操作。

DragDropAction

表示鼠標拖放操作。

ErrorAction

表示一個操作,測試記錄器使用該操作報告它無法記錄某一操作。

InputAction

表示所有基於文本的操作的基類。

KeyboardAction

表示單個的鍵盤用戶操作。

LaunchApplicationAction

表示啓動一個應用程序的 UI 測試操作。

MarkerAction

提供一種在操作序列中插入標記而不會在播放過程中導致任何操作的方法。

MouseAction

表示關於鼠標操作的信息。

NavigateToUrlAction

表示移動到某一 URL 的操作。

NoOperationAction

表示不執行任何操作的用戶界面 (UI) 測試操作。

RemoveKeysAction

提供有關聚合測試操作聲明,從測試結果中移除此操作及之前的所有匹配鍵操作。

SendKeysAction

表示發送文本或鍵數組的測試操作。

SetBaseAction

爲設置值或設置狀態的測試操作提供基類。

SetStateAction

表示一個設置關聯元素狀態的測試操作。

SetValueAction

表示用於設置值的測試操作。

SharedStepsReferenceAction

爲當前測試提供對一組共享步驟的引用。

StringAssertAction

表示一個字符串斷言。

TestStepMarkerAction

表示測試操作序列中的一個標記,將記錄該標記,但播放框架不使用該標記。

UITestAction

爲用於用戶界面 (UI) 測試的測試操作提供基類。

ValidationAction

表示一個驗證屬性值的操作。

VerifyConfigurationAction

表示一個驗證配置的操作。

WarningAction

表示一個操作,UI 記錄器使用該操作報告它無法正確錄製某一操作。

WebDialogAction

表示一個報告 Web 對話框的操作。

 

在這裏將抽取幾個主要的ACTION進行介紹.

 

通過編寫UIMap.uitest文件控制UIMap.designer.cs代碼的生成

 

1.首先我們還是通過添加新項的方式建立一個新的Coded UI Test Map(編碼的UI測試映射)

 

 

2.之後,直接進入UIMap1.uitest文件,可以發現代碼如下

 

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->1 <?xml version="1.0"?>
2 
3 <UITest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="" Id="3efe829a-76df-439e-af0d-8d5c62727a1e" AssemblyVersion="10.0.21008.0" Version="1.0" xmlns="http://schemas.microsoft.com/VisualStudio/TeamTest/UITest/2010">
4 
5 </UITest>
6 
7 

 

 

3. 關閉錄製生成器(注:一定要先關閉才能修改,以後也是一樣),編碼初始化代碼InitializeActions

我們還是先使用第一章提到的示例程序 下載點我

假設現在如果要操作它,首先需要將其打開,在之前已經簡單介紹過編碼的UI測試支持的Action,可以把打開這個程序的操作作爲InitializeActions(初始化操作)的一員,併爲其生成一個方法,那麼按照這個思路,在參照前面的Actions列表,可以發現需要兩個Action

a.       LaunchApplicationAction 打開應用程序

b.       TestStepMarkerAction 爲該步驟生成一個方法

 

現在我們開始編寫代碼,將其直接插入UITest節點內

 

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> 1          <InitializeActions>
 2 
 3                    <!—打開示例文件,文件路徑按實際情況填寫-->
 4 
 5                    <LaunchApplicationAction>
 6 
 7                             <FileName>D:\RightDemo.exe</FileName>
 8 
 9                    </LaunchApplicationAction>
10 
11  
12 
13                    <!--爲之前所有的操作步驟生成¦一個方法,名稱爲LaunchApplication()-->
14 
15                    <TestStepMarkerAction MarkerInformation="LaunchApplication">
16 
17                             <ParameterName />
18 
19                             <StepId>-1</StepId>
20 
21                             <Direction>Start</Direction>
22 
23                             <Outcome/>
24 
25                             <Disabled>false</Disabled>
26 
27                    </TestStepMarkerAction>
28 
29          </InitializeActions>
30 
31 

 

 

 編寫之後,我們打開錄製生成器,點擊“生成代碼”,可以發現在UIMap1.Designer.cs對應生成了幾句代碼,其中已經按照要求生成了LaunchApplication()方法和加載應用程序的語句ApplicationUnderTest.Launch(this.LaunchApplicationParams.ExePath, this.LaunchApplicationParams.AlternateExePath),語句如下

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->1         /// <summary>
2         /// LaunchApplication - Use 'LaunchApplicationParams' to pass parameters into this method.
3         /// </summary>
4         public void LaunchApplication()
5         {
6 
7             // Launch 'D:\RightDemo.exe'
8             ApplicationUnderTest rightDemoApplication = ApplicationUnderTest.Launch(this.LaunchApplicationParams.ExePath, this.LaunchApplicationParams.AlternateExePath);
9         }

 

 

4. 編碼執行代碼ExecuteActions

添加了初始化的InitializeActions,之後,我們需要給他添加ExecuteActions,用於執行界面上的操作,在編寫操作之前,假設我們需要輸入正確的用戶名(Admin)和正確的密碼(123456),然後點擊登陸,檢測是否彈出“登陸成功”的對話框。那麼進行操作前,首先需要的是先捕獲用戶名文本框,密碼文本框,登錄按鈕,彈出框文本這4個對象,之後再對這4個對象進行操作

添加對象的方法如下:

首先,打開錄製生成器,點上面的準星

之後,一直按住鼠標左鍵不放,將鼠標拖到用戶名文本框,再鬆開

然後,我們可以看到對象庫已經自動打開,其中UITbx_uidEdit就是被我們捕獲的用戶名文本框,

 

這個時候我們點擊 ,之後對象就被添加到對象庫了,接下來按照同樣的方法,依次將密碼文本框,登錄按鈕,彈出框文本分別加入對象庫,如圖:

 

  

之後點擊“生成代碼”,然後關閉錄製生成器,可以看到在UIMap.uitest<Maps>節點已經生成了相關的對象,而在UIMap.designer.cs的對象映射部分也添加了相應的代碼(具體對象識別原理會在第三章提到,這裏只先使用對象進行操作)

對象添加進入對象庫了,現在只需要編寫操作了

 

我們需要輸入正確的用戶名(Admin)和正確的密碼(123456),然後點擊登陸,檢測是否彈出“登陸成功”的對話框,並生成兩個方法,InputRightUidPwd()用於輸入用戶名和密碼,AssertRightWindow()用於驗證是否彈出相應的彈出框文本,那麼需要依次用到如下Action

a.SetValueAction 設置用戶名文本框的值

b.SetValueAction設置密碼文本框的值

c.MouseAction 鼠標點擊登陸按鈕

d.TestStepMarkerAction 生成方法InputRightUidPwd()

e.AssertAction 爲判斷是否彈出生成斷言

f. TestStepMarkerAction 生成方法AssertRightWindow()

 

按照這個思路,我們開始編寫如下代碼:

(這裏可以看到某些操作都帶有UIObjectName屬性,該屬性表示被操作的對象是誰,也就是剛纔捕獲到對象庫裏面的對象名稱)

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> 1   <ExecuteActions>
 2     <!--UIObjectName表示被操作的對象是誰-->
 3     <SetValueAction UIObjectName="UIMap1.UI系統登錄Window.UITbx_uidWindow.UITbx_uidEdit">
 4       <Value Encoded="false">Admin</Value>
 5     </SetValueAction>
 6     <SetValueAction UIObjectName="UIMap1.UI系統登錄Window.UITbx_pwdWindow.UITbx_pwdEdit">
 7       <Value Encoded="false">123456</Value>
 8     </SetValueAction>
 9     <MouseAction UIObjectName="UIMap1.UI系統登錄Window.UI登錄Window.UI登錄Button">
10       <Location X="1" Y="1" />
11       <WheelDirection>0</WheelDirection>
12       <ActionType>Click</ActionType>
13       <MouseButton>Left</MouseButton>
14     </MouseAction>
15     <TestStepMarkerAction MarkerInformation="InputRightUidPwd">
16       <StepId>-1</StepId>
17       <Direction>Start</Direction>
18       <Outcome />
19       <Disabled>false</Disabled>
20     </TestStepMarkerAction>
21     <AssertAction UIObjectName="UIMap.UI提示Window.UI登陸成功Window.UI登陸成功Text">
22       <PropertyName>Exists</PropertyName>
23       <ExpectedValue>True</ExpectedValue>
24       <Type>Boolean</Type>
25       <PropertyCondition>AreEqual</PropertyCondition>
26     </AssertAction>
27     <TestStepMarkerAction MarkerInformation="AssertRightWindow">
28       <ParameterName />
29       <StepId>-1</StepId>
30       <Direction>Start</Direction>
31       <Outcome />
32       <Disabled>false</Disabled>
33     </TestStepMarkerAction>
34   </ExecuteActions>

 

 

編寫完畢之後,打開錄製生成器,點擊生成代碼,之後關閉錄製生成器,可以看到UIMap.designer.cs文件中也生成了對應的代碼

 

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> 1         /// <summary>
 2         /// InputRightUidPwd - Use 'InputRightUidPwdParams' to pass parameters into this method.
 3         /// </summary>
 4         public void InputRightUidPwd()
 5         {
 6             #region Variable Declarations
 7             WinEdit uITbx_uidEdit = this.UI系統登錄Window.UITbx_uidWindow.UITbx_uidEdit;
 8             WinEdit uITbx_pwdEdit = this.UI系統登錄Window.UITbx_pwdWindow.UITbx_pwdEdit;
 9             WinButton uI登錄Button = this.UI系統登錄Window.UI登錄Window.UI登錄Button;
10             #endregion
11 
12             // Type 'Admin' in 'Tbx_uid' text box
13             uITbx_uidEdit.Text = this.InputRightUidPwdParams.UITbx_uidEditText;
14 
15             // Type '123456' in 'Tbx_pwd' text box
16             uITbx_pwdEdit.Text = this.InputRightUidPwdParams.UITbx_pwdEditText;
17 
18             // Click '登錄' button
19             Mouse.Click(uI登錄Button, new Point(4114));
20         }
21         
22         /// <summary>
23         /// AssertRightWindow - Use 'AssertRightWindowExpectedValues' to pass parameters into this method.
24         /// </summary>
25         public void AssertRightWindow()
26         {
27             #region Variable Declarations
28             WinText uI登陸成功Text = this.UI提示Window.UI登陸成功Window.UI登陸成功Text;
29             #endregion
30 
31             // Verify that '登陸成功!' label's property 'Exists' equals 'True'
32             Assert.AreEqual(this.AssertRightWindowExpectedValues.UI登陸成功TextExists, uI登陸成功Text.Exists);
33         }

 

 

5. 編碼清理代碼CleanupActions

清理代碼僅僅執行兩個操作,第一是點擊彈出框,第二是關閉程序,然後則爲其生成方法,執行操作前,首先需要捕獲彈出框按鈕對象,以及主窗體關閉按鈕對象

 

然後用之前提到的方法將他們添加進對象庫,然後生成代碼,關閉錄製生成器

 

 

按照思路編寫3個action

a.MouseAction 鼠標點擊確定按鈕

b. MouseAction 鼠標點擊關閉按鈕

c.TestStepMarkerAction 生成方法ClearUpTest()

代碼如下

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> 1     <CleanupActions>
 2         <MouseAction UIObjectName="UIMap1.UI提示Window.UIOKWindow.UIOKButton">
 3             <Location X="1" Y="1" />
 4             <WheelDirection>0</WheelDirection>
 5             <ActionType>Click</ActionType>
 6             <MouseButton>Left</MouseButton>
 7         </MouseAction>
 8         <MouseAction UIObjectName="UIMap1.UI系統登錄Window.UI系統登錄TitleBar.UICloseButton">
 9             <ParameterName />
10             <Location X="1" Y="1" />
11             <WheelDirection>0</WheelDirection>
12             <ActionType>Click</ActionType>
13             <MouseButton>Left</MouseButton>
14         </MouseAction>
15         <TestStepMarkerAction MarkerInformation="ClearUpTest">
16             <ParameterName />
17             <StepId>-1</StepId>
18             <Direction>Start</Direction>
19             <Outcome />
20             <Disabled>false</Disabled>
21         </TestStepMarkerAction>        
22     </CleanupActions>

 

 

編寫完代碼之後,打開錄製生成器,點擊“生成代碼”,可以看到UIMap1.Designer.cs文件也生成了相應的代碼

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> 1         /// <summary>
 2         /// ClearUpTest
 3         /// </summary>
 4         public void ClearUpTest()
 5         {
 6             #region Variable Declarations
 7             WinButton uIOKButton = this.UI提示Window.UIOKWindow.UIOKButton;
 8             WinButton uICloseButton = this.UI系統登錄Window.UI系統登錄TitleBar.UICloseButton;
 9             #endregion
10 
11             // Click 'OK' button
12             Mouse.Click(uIOKButton, new Point(11));
13 
14             // Click 'Close' button
15             Mouse.Click(uICloseButton, new Point(11));
16         }

 

 

6.現在,我們就可以開始執行我們剛纔編寫的測試了,建立一個CodedUITest.cs文件,然後編寫如下代碼即可(注意這3個方法的標籤,分別是TestInitializeTestMethodTestCleanup),之後便可以進行測試了

 

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> 1     [CodedUITest]
 2     public class CodedUITest1
 3     {
 4 
 5         UIMap1 UIMapTest{get;set;}
 6 
 7         public CodedUITest1()
 8         {
 9             UIMapTest = new UIMap1();//這個UIMap1我們剛編寫了操作
10         }
11 
12         [TestInitialize]//注意這裏是TestInitialize標籤
13         public void CodedUITestMethod1()
14         {
15             UIMapTest.LaunchApplication();
16         }
17 
18         [TestMethod]//這裏是Method標籤
19         public void CodedUITestMethod2()
20         {
21             UIMapTest.InputRightUidPwd();
22             UIMapTest.AssertRightWindow();
23         }
24 
25         [TestCleanup]//這裏是TestCleanup標籤
26         public void CodedUITestMethod3()
27         {
28             UIMapTest.ClearUpTest();
29         }
30 
31 
32         public TestContext TestContext
33         {
34             get
35             {
36                 return testContextInstance;
37             }
38             set
39             {
40                 testContextInstance = value;
41             }
42         }
43         private TestContext testContextInstance;
44     }

 

 

總結

本章主要介紹了操作動作的錄製原理,操作動作代碼的生成,以及如何通過修改UIMap.uitest文件控制UIMap.designer.cs代碼的生成,大家如果感興趣,可以試試使用各個Action填充UIMap.uitest,看看究竟會在UIMap.designer.cs生成怎樣的代碼

 

因爲UIMap.uitest一旦添加新對象或操作,點擊自動生成後,都會對UIMap.designer.cs的代碼進行一次覆蓋,如果想要編寫自定義C#代碼,最好是將其寫在UIMap.cs文件,例如,可以把在UIMap.designer.cs生成的方法粘貼到UIMap.cs,然後在UIMap.cs添加自己的驗證邏輯,因爲UIMap.cs不會被覆蓋

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章