一起谈.NET技术,VS2010测试功能之旅:编码的UI测试(2)-操作动作的录制原理(下)...
回顧
在本章上部分介紹了操作動(dòng)作的錄制原理,描述了操作動(dòng)作是如何錄制,UIMap.uitest和UIMap.Designer.cs的代碼如何生成,以及他們的結(jié)構(gòu)。在這個(gè)部分,將著重說(shuō)明如何通過(guò)修改UIMap1.uitest文件的操作動(dòng)作部分的代碼來(lái)控制UIMap1.Designer.cs操作動(dòng)作部分代碼的生成,實(shí)現(xiàn)第一種方式的自定義編碼。
內(nèi)容簡(jiǎn)介?
在上個(gè)部分,已經(jīng)說(shuō)明了UIMap.uitest文件的結(jié)構(gòu)如下:
其中InitializeActions,ExecuteActions,CleanupActions,OnErrorAction都是對(duì)于操作動(dòng)作的描述:
InitializeActions:指初始化需要執(zhí)行的操作動(dòng)作
ExecuteActions:指測(cè)試過(guò)程中的操作動(dòng)作(通過(guò)錄制所生成的操作都默認(rèn)放在ExecuteActions)
CleanupActions:指測(cè)試完畢需要清理資源的操作動(dòng)作
OnErrorAction:指代異常處理的操作動(dòng)作
他們都對(duì)UIMap1.Designer.cs操作動(dòng)作部分代碼的生成和參數(shù)的生成有直接的影響。
嚴(yán)格的說(shuō),放在InitializeActions下的操作動(dòng)作和放在ExecuteActions,CleanupActions,OnErrorAction的動(dòng)作沒(méi)有任何本質(zhì)上的區(qū)別,僅僅只是從一個(gè)代碼可讀性上的考慮。
編碼的UI測(cè)試所支持的Actions
如果我們仔細(xì)觀察過(guò)ExecuteActions錄制所生成的代碼,可以發(fā)現(xiàn)有一個(gè)共同特點(diǎn),ExecuteActions的子節(jié)點(diǎn)都是以<Action>結(jié)尾形式的標(biāo)簽,那么編碼的UI測(cè)試一共支持多少種的Action呢?這里我整理了一個(gè)列表,簡(jiǎn)單的介紹了測(cè)試所支持的Action和功能簡(jiǎn)介。
| 類(lèi)? | 說(shuō)明? |
| AggregatedAction | 為可以完成幾種任務(wù)中任何一種的所有操作提供基類(lèi)。 |
| AssertAction | 表示要包含在測(cè)試中其他兩個(gè)操作之間的斷言。 |
| BrowserAction | 表示可以完成幾種瀏覽器任務(wù)中的任何一種的測(cè)試操作。 |
| DelayAction | 指定執(zhí)行用戶(hù)界面 (UI) 測(cè)試中的后續(xù)操作后的時(shí)間延遲。 |
| DragAction | 表示鼠標(biāo)拖動(dòng)操作。 |
| DragDropAction | 表示鼠標(biāo)拖放操作。 |
| ErrorAction | 表示一個(gè)操作,測(cè)試記錄器使用該操作報(bào)告它無(wú)法記錄某一操作。 |
| InputAction | 表示所有基于文本的操作的基類(lèi)。 |
| KeyboardAction | 表示單個(gè)的鍵盤(pán)用戶(hù)操作。 |
| LaunchApplicationAction | 表示啟動(dòng)一個(gè)應(yīng)用程序的 UI 測(cè)試操作。 |
| MarkerAction | 提供一種在操作序列中插入標(biāo)記而不會(huì)在播放過(guò)程中導(dǎo)致任何操作的方法。 |
| MouseAction | 表示關(guān)于鼠標(biāo)操作的信息。 |
| NavigateToUrlAction | 表示移動(dòng)到某一 URL 的操作。 |
| NoOperationAction | 表示不執(zhí)行任何操作的用戶(hù)界面 (UI) 測(cè)試操作。 |
| RemoveKeysAction | 提供有關(guān)聚合測(cè)試操作聲明,從測(cè)試結(jié)果中移除此操作及之前的所有匹配鍵操作。 |
| SendKeysAction | 表示發(fā)送文本或鍵數(shù)組的測(cè)試操作。 |
| SetBaseAction | 為設(shè)置值或設(shè)置狀態(tài)的測(cè)試操作提供基類(lèi)。 |
| SetStateAction | 表示一個(gè)設(shè)置關(guān)聯(lián)元素狀態(tài)的測(cè)試操作。 |
| SetValueAction | 表示用于設(shè)置值的測(cè)試操作。 |
| SharedStepsReferenceAction | 為當(dāng)前測(cè)試提供對(duì)一組共享步驟的引用。 |
| StringAssertAction | 表示一個(gè)字符串?dāng)嘌浴? |
| TestStepMarkerAction | 表示測(cè)試操作序列中的一個(gè)標(biāo)記,將記錄該標(biāo)記,但播放框架不使用該標(biāo)記。 |
| UITestAction | 為用于用戶(hù)界面 (UI) 測(cè)試的測(cè)試操作提供基類(lèi)。 |
| ValidationAction | 表示一個(gè)驗(yàn)證屬性值的操作。 |
| VerifyConfigurationAction | 表示一個(gè)驗(yàn)證配置的操作。 |
| WarningAction | 表示一個(gè)操作,UI 記錄器使用該操作報(bào)告它無(wú)法正確錄制某一操作。 |
| WebDialogAction | 表示一個(gè)報(bào)告 Web 對(duì)話(huà)框的操作。 |
在這里將抽取幾個(gè)主要的ACTION進(jìn)行介紹。
通過(guò)編寫(xiě)UIMap.uitest文件控制UIMap.designer.cs代碼的生成。
1.首先我們還是通過(guò)添加新項(xiàng)的方式建立一個(gè)新的Coded UI Test Map(編碼的UI測(cè)試映射)。
2.之后,直接進(jìn)入U(xiǎn)IMap1.uitest文件,可以發(fā)現(xiàn)代碼如下:
<?xml version="1.0"?><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">
</UITest>
3. 關(guān)閉錄制生成器(注:一定要先關(guān)閉才能修改,以后也是一樣),編碼初始化代碼InitializeActions。
我們還是先使用第一章提到的示例程序 下載點(diǎn)我
假設(shè)現(xiàn)在如果要操作它,首先需要將其打開(kāi),在之前已經(jīng)簡(jiǎn)單介紹過(guò)編碼的UI測(cè)試支持的Action,可以把打開(kāi)這個(gè)程序的操作作為InitializeActions(初始化操作)的一員,并為其生成一個(gè)方法,那么按照這個(gè)思路,在參照前面的Actions列表,可以發(fā)現(xiàn)需要兩個(gè)Action:
a、LaunchApplicationAction 打開(kāi)應(yīng)用程序。
b、TestStepMarkerAction 為該步驟生成一個(gè)方法。
現(xiàn)在我們開(kāi)始編寫(xiě)代碼,將其直接插入U(xiǎn)ITest節(jié)點(diǎn)內(nèi):
<InitializeActions><!— 打開(kāi)示例文件,文件路徑按實(shí)際情況填寫(xiě)-->
<LaunchApplicationAction>
<FileName>D:\RightDemo.exe</FileName>
</LaunchApplicationAction>
<!--為之前所有的操作步驟生成|一個(gè)方法,名稱(chēng)為L(zhǎng)aunchApplication()-->
<TestStepMarkerAction MarkerInformation="LaunchApplication">
<ParameterName />
<StepId>-1</StepId>
<Direction>Start</Direction>
<Outcome/>
<Disabled>false</Disabled>
</TestStepMarkerAction>
</InitializeActions>
編寫(xiě)之后,我們打開(kāi)錄制生成器,點(diǎn)擊“生成代碼”,可以發(fā)現(xiàn)在UIMap1.Designer.cs對(duì)應(yīng)生成了幾句代碼,其中已經(jīng)按照要求生成了LaunchApplication()方法和加載應(yīng)用程序的語(yǔ)句ApplicationUnderTest.Launch(this.LaunchApplicationParams.ExePath, this.LaunchApplicationParams.AlternateExePath),語(yǔ)句如下:
/// <summary>/// LaunchApplication - Use 'LaunchApplicationParams' to pass parameters into this method.
/// </summary>
public void LaunchApplication()
{
// Launch 'D:\RightDemo.exe'
ApplicationUnderTest rightDemoApplication = ApplicationUnderTest.Launch(this.LaunchApplicationParams.ExePath, this.LaunchApplicationParams.AlternateExePath);
}
4. 編碼執(zhí)行代碼ExecuteActions
添加了初始化的InitializeActions,之后,我們需要給他添加ExecuteActions,用于執(zhí)行界面上的操作,在編寫(xiě)操作之前,假設(shè)我們需要輸入正確的用戶(hù)名(Admin)和正確的密碼(123456),然后點(diǎn)擊登陸,檢測(cè)是否彈出“登陸成功”的對(duì)話(huà)框。那么進(jìn)行操作前,首先需要的是先捕獲用戶(hù)名文本框,密碼文本框,登錄按鈕,彈出框文本這4個(gè)對(duì)象,之后再對(duì)這4個(gè)對(duì)象進(jìn)行操作。
添加對(duì)象的方法如下:
首先,打開(kāi)錄制生成器,點(diǎn)上面的準(zhǔn)星:
之后,一直按住鼠標(biāo)左鍵不放,將鼠標(biāo)拖到用戶(hù)名文本框,再松開(kāi):
然后,我們可以看到對(duì)象庫(kù)已經(jīng)自動(dòng)打開(kāi),其中UITbx_uidEdit就是被我們捕獲的用戶(hù)名文本框:
這個(gè)時(shí)候我們點(diǎn)擊 ,之后對(duì)象就被添加到對(duì)象庫(kù)了,接下來(lái)按照同樣的方法,依次將密碼文本框,登錄按鈕,彈出框文本分別加入對(duì)象庫(kù),如圖:
之后點(diǎn)擊“生成代碼”,然后關(guān)閉錄制生成器,可以看到在UIMap.uitest的<Maps>節(jié)點(diǎn)已經(jīng)生成了相關(guān)的對(duì)象,而在UIMap.designer.cs的對(duì)象映射部分也添加了相應(yīng)的代碼(具體對(duì)象識(shí)別原理會(huì)在第三章提到,這里只先使用對(duì)象進(jìn)行操作)。
對(duì)象添加進(jìn)入對(duì)象庫(kù)了,現(xiàn)在只需要編寫(xiě)操作了。
我們需要輸入正確的用戶(hù)名(Admin)和正確的密碼(123456),然后點(diǎn)擊登陸,檢測(cè)是否彈出“登陸成功”的對(duì)話(huà)框,并生成兩個(gè)方法,InputRightUidPwd()用于輸入用戶(hù)名和密碼,AssertRightWindow()用于驗(yàn)證是否彈出相應(yīng)的彈出框文本,那么需要依次用到如下Action:
a.SetValueAction 設(shè)置用戶(hù)名文本框的值
b.SetValueAction設(shè)置密碼文本框的值
c.MouseAction 鼠標(biāo)點(diǎn)擊登陸按鈕
d.TestStepMarkerAction 生成方法InputRightUidPwd()
e.AssertAction 為判斷是否彈出生成斷言
f. TestStepMarkerAction 生成方法AssertRightWindow()
按照這個(gè)思路,我們開(kāi)始編寫(xiě)如下代碼:
(這里可以看到某些操作都帶有UIObjectName屬性,該屬性表示被操作的對(duì)象是誰(shuí),也就是剛才捕獲到對(duì)象庫(kù)里面的對(duì)象名稱(chēng))
<ExecuteActions><!--UIObjectName表示被操作的對(duì)象是誰(shuí)-->
<SetValueAction UIObjectName="UIMap1.UI 系統(tǒng)登錄Window.UITbx_uidWindow.UITbx_uidEdit">
<Value Encoded="false">Admin</Value>
</SetValueAction>
<SetValueAction UIObjectName="UIMap1.UI 系統(tǒng)登錄Window.UITbx_pwdWindow.UITbx_pwdEdit">
<Value Encoded="false">123456</Value>
</SetValueAction>
<MouseAction UIObjectName="UIMap1.UI 系統(tǒng)登錄Window.UI登錄Window.UI登錄Button">
<Location X="1" Y="1" />
<WheelDirection>0</WheelDirection>
<ActionType>Click</ActionType>
<MouseButton>Left</MouseButton>
</MouseAction>
<TestStepMarkerAction MarkerInformation="InputRightUidPwd">
<StepId>-1</StepId>
<Direction>Start</Direction>
<Outcome />
<Disabled>false</Disabled>
</TestStepMarkerAction>
<AssertAction UIObjectName="UIMap.UI 提示W(wǎng)indow.UI登陸成功Window.UI登陸成功Text">
<PropertyName>Exists</PropertyName>
<ExpectedValue>True</ExpectedValue>
<Type>Boolean</Type>
<PropertyCondition>AreEqual</PropertyCondition>
</AssertAction>
<TestStepMarkerAction MarkerInformation="AssertRightWindow">
<ParameterName />
<StepId>-1</StepId>
<Direction>Start</Direction>
<Outcome />
<Disabled>false</Disabled>
</TestStepMarkerAction>
</ExecuteActions>
編寫(xiě)完畢之后,打開(kāi)錄制生成器,點(diǎn)擊生成代碼,之后關(guān)閉錄制生成器,可以看到UIMap.designer.cs文件中也生成了對(duì)應(yīng)的代碼。
/// <summary>/// InputRightUidPwd - Use 'InputRightUidPwdParams' to pass parameters into this method.
/// </summary>
public void InputRightUidPwd()
{
#region Variable Declarations
WinEdit uITbx_uidEdit = this.UI 系統(tǒng)登錄Window.UITbx_uidWindow.UITbx_uidEdit;
WinEdit uITbx_pwdEdit = this.UI 系統(tǒng)登錄Window.UITbx_pwdWindow.UITbx_pwdEdit;
WinButton uI 登錄Button = this.UI系統(tǒng)登錄Window.UI登錄Window.UI登錄Button;
#endregion
// Type 'Admin' in 'Tbx_uid' text box
uITbx_uidEdit.Text = this.InputRightUidPwdParams.UITbx_uidEditText;
// Type '123456' in 'Tbx_pwd' text box
uITbx_pwdEdit.Text = this.InputRightUidPwdParams.UITbx_pwdEditText;
// Click ' 登錄' button
Mouse.Click(uI登錄Button, new Point(41, 14));
}
/// <summary>
/// AssertRightWindow - Use 'AssertRightWindowExpectedValues' to pass parameters into this method.
/// </summary>
public void AssertRightWindow()
{
#region Variable Declarations
WinText uI 登陸成功Text = this.UI提示W(wǎng)indow.UI登陸成功Window.UI登陸成功Text;
#endregion
// Verify that ' 登陸成功!' label's property 'Exists' equals 'True'
Assert.AreEqual(this.AssertRightWindowExpectedValues.UI 登陸成功TextExists, uI登陸成功Text.Exists);
}
5. 編碼清理代碼CleanupActions
清理代碼僅僅執(zhí)行兩個(gè)操作,第一是點(diǎn)擊彈出框,第二是關(guān)閉程序,然后則為其生成方法,執(zhí)行操作前,首先需要捕獲彈出框按鈕對(duì)象,以及主窗體關(guān)閉按鈕對(duì)象。
然后用之前提到的方法將他們添加進(jìn)對(duì)象庫(kù),然后生成代碼,關(guān)閉錄制生成器:
按照思路編寫(xiě)3個(gè)action:
a.MouseAction 鼠標(biāo)點(diǎn)擊確定按鈕
b. MouseAction 鼠標(biāo)點(diǎn)擊關(guān)閉按鈕
c.TestStepMarkerAction 生成方法ClearUpTest()
代碼如下:
<CleanupActions><MouseAction UIObjectName="UIMap1.UI 提示W(wǎng)indow.UIOKWindow.UIOKButton">
<Location X="1" Y="1" />
<WheelDirection>0</WheelDirection>
<ActionType>Click</ActionType>
<MouseButton>Left</MouseButton>
</MouseAction>
<MouseAction UIObjectName="UIMap1.UI 系統(tǒng)登錄Window.UI系統(tǒng)登錄TitleBar.UICloseButton">
<ParameterName />
<Location X="1" Y="1" />
<WheelDirection>0</WheelDirection>
<ActionType>Click</ActionType>
<MouseButton>Left</MouseButton>
</MouseAction>
<TestStepMarkerAction MarkerInformation="ClearUpTest">
<ParameterName />
<StepId>-1</StepId>
<Direction>Start</Direction>
<Outcome />
<Disabled>false</Disabled>
</TestStepMarkerAction>
</CleanupActions>
編寫(xiě)完代碼之后,打開(kāi)錄制生成器,點(diǎn)擊“生成代碼”,可以看到UIMap1.Designer.cs文件也生成了相應(yīng)的代碼:
/// <summary>/// ClearUpTest
/// </summary>
public void ClearUpTest()
{
#region Variable Declarations
WinButton uIOKButton = this.UI 提示W(wǎng)indow.UIOKWindow.UIOKButton;
WinButton uICloseButton = this.UI 系統(tǒng)登錄Window.UI系統(tǒng)登錄TitleBar.UICloseButton;
#endregion
// Click 'OK' button
Mouse.Click(uIOKButton, new Point(1, 1));
// Click 'Close' button
Mouse.Click(uICloseButton, new Point(1, 1));
}
6.現(xiàn)在,我們就可以開(kāi)始執(zhí)行我們剛才編寫(xiě)的測(cè)試了,建立一個(gè)CodedUITest.cs文件,然后編寫(xiě)如下代碼即可(注意這3個(gè)方法的標(biāo)簽,分別是TestInitialize,TestMethod,TestCleanup),之后便可以進(jìn)行測(cè)試了。
[CodedUITest]public class CodedUITest1
{
UIMap1 UIMapTest{get;set;}
public CodedUITest1()
{
UIMapTest = new UIMap1();//這個(gè)UIMap1我們剛編寫(xiě)了操作
}
[TestInitialize]//注意這里是TestInitialize標(biāo)簽
public void CodedUITestMethod1()
{
UIMapTest.LaunchApplication();
}
[TestMethod]//這里是Method標(biāo)簽
public void CodedUITestMethod2()
{
UIMapTest.InputRightUidPwd();
UIMapTest.AssertRightWindow();
}
[TestCleanup]//這里是TestCleanup標(biāo)簽
public void CodedUITestMethod3()
{
UIMapTest.ClearUpTest();
}
public TestContext TestContext
{
get
{
return testContextInstance;
}
set
{
testContextInstance = value;
}
}
private TestContext testContextInstance;
}
總結(jié)?
本章主要介紹了操作動(dòng)作的錄制原理,操作動(dòng)作代碼的生成,以及如何通過(guò)修改UIMap.uitest文件控制UIMap.designer.cs代碼的生成,大家如果感興趣,可以試試使用各個(gè)Action填充UIMap.uitest,看看究竟會(huì)在UIMap.designer.cs生成怎樣的代碼。
因?yàn)閁IMap.uitest一旦添加新對(duì)象或操作,點(diǎn)擊自動(dòng)生成后,都會(huì)對(duì)UIMap.designer.cs的代碼進(jìn)行一次覆蓋,如果想要編寫(xiě)自定義C#代碼,最好是將其寫(xiě)在UIMap.cs文件,例如,可以把在UIMap.designer.cs生成的方法粘貼到UIMap.cs,然后在UIMap.cs添加自己的驗(yàn)證邏輯,因?yàn)閁IMap.cs不會(huì)被覆蓋。
轉(zhuǎn)載于:https://www.cnblogs.com/waw/archive/2011/09/02/2162969.html
總結(jié)
以上是生活随笔為你收集整理的一起谈.NET技术,VS2010测试功能之旅:编码的UI测试(2)-操作动作的录制原理(下)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网络爱好者必知的国内十大知名Linux系
- 下一篇: 设计模式系列-组合模式