日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

一起谈.NET技术,VS2010测试功能之旅:编码的UI测试(2)-操作动作的录制原理(下)...

發(fā)布時(shí)間:2024/9/20 asp.net 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一起谈.NET技术,VS2010测试功能之旅:编码的UI测试(2)-操作动作的录制原理(下)... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  回顧

  在本章上部分介紹了操作動(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。